mirror of
https://github.com/zoriya/octokit.net.git
synced 2025-12-06 07:16:09 +00:00
178 lines
5.7 KiB
C#
178 lines
5.7 KiB
C#
using System;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using Octokit;
|
|
using Octokit.Tests.Integration;
|
|
using Octokit.Tests.Integration.Helpers;
|
|
using Xunit;
|
|
|
|
public class ActionsWorkflowJobsClientTests
|
|
{
|
|
private const string HelloWorldWorkflow = @"
|
|
name: hello
|
|
on: [ push, workflow_dispatch ]
|
|
jobs:
|
|
world:
|
|
runs-on: [ ubuntu-latest ]
|
|
steps:
|
|
- run: echo ""Hello world.""";
|
|
|
|
[IntegrationTest]
|
|
public async Task CanListWorkflowJobs()
|
|
{
|
|
var github = Helper.GetAuthenticatedClient();
|
|
var fixture = github.Actions.Workflows.Jobs;
|
|
|
|
using (var context = await github.CreateRepositoryContextWithAutoInit())
|
|
{
|
|
var owner = context.Repository.Owner.Login;
|
|
var name = context.Repository.Name;
|
|
(var workflowFileName, var runId) = await CreateWorkflowAndWaitForCompletion(github, context);
|
|
|
|
var jobs = await fixture.List(owner, name, runId);
|
|
|
|
Assert.NotNull(jobs);
|
|
Assert.NotEqual(0, jobs.TotalCount);
|
|
Assert.NotNull(jobs.Jobs);
|
|
Assert.NotEmpty(jobs.Jobs);
|
|
|
|
jobs = await fixture.List(owner, name, runId, new WorkflowRunJobsRequest() { Filter = WorkflowRunJobsFilter.All });
|
|
|
|
Assert.NotNull(jobs);
|
|
Assert.NotEqual(0, jobs.TotalCount);
|
|
Assert.NotNull(jobs.Jobs);
|
|
Assert.NotEmpty(jobs.Jobs);
|
|
}
|
|
}
|
|
|
|
[IntegrationTest]
|
|
public async Task CanGetWorkflowJob()
|
|
{
|
|
var github = Helper.GetAuthenticatedClient();
|
|
var fixture = github.Actions.Workflows.Jobs;
|
|
|
|
using (var context = await github.CreateRepositoryContextWithAutoInit())
|
|
{
|
|
var owner = context.Repository.Owner.Login;
|
|
var name = context.Repository.Name;
|
|
(var workflowFileName, var runId) = await CreateWorkflowAndWaitForCompletion(github, context);
|
|
|
|
var jobs = await fixture.List(owner, name, runId);
|
|
|
|
Assert.NotNull(jobs);
|
|
Assert.NotNull(jobs.Jobs);
|
|
Assert.Single(jobs.Jobs);
|
|
|
|
var job = await fixture.Get(owner, name, jobs.Jobs[0].Id);
|
|
|
|
Assert.NotNull(job);
|
|
Assert.Equal(jobs.Jobs[0].Id, job.Id);
|
|
}
|
|
}
|
|
|
|
[IntegrationTest]
|
|
public async Task CanListWorkflowJobsForAttempt()
|
|
{
|
|
var github = Helper.GetAuthenticatedClient();
|
|
var fixture = github.Actions.Workflows.Jobs;
|
|
|
|
using (var context = await github.CreateRepositoryContextWithAutoInit())
|
|
{
|
|
var owner = context.Repository.Owner.Login;
|
|
var name = context.Repository.Name;
|
|
(var workflowFileName, var runId) = await CreateWorkflowAndWaitForCompletion(github, context);
|
|
|
|
var jobs = await fixture.List(owner, name, runId, 1);
|
|
|
|
Assert.NotNull(jobs);
|
|
Assert.NotEqual(0, jobs.TotalCount);
|
|
Assert.NotNull(jobs.Jobs);
|
|
Assert.NotEmpty(jobs.Jobs);
|
|
}
|
|
}
|
|
|
|
[IntegrationTest]
|
|
public async Task CanGetWorkflowJobLogs()
|
|
{
|
|
var github = Helper.GetAuthenticatedClient();
|
|
var fixture = github.Actions.Workflows.Jobs;
|
|
|
|
using (var context = await github.CreateRepositoryContextWithAutoInit())
|
|
{
|
|
var owner = context.Repository.Owner.Login;
|
|
var name = context.Repository.Name;
|
|
(var workflowFileName, var runId) = await CreateWorkflowAndWaitForCompletion(github, context);
|
|
|
|
var jobs = await fixture.List(owner, name, runId);
|
|
|
|
Assert.NotNull(jobs);
|
|
Assert.NotNull(jobs.Jobs);
|
|
var job = Assert.Single(jobs.Jobs);
|
|
|
|
var logs = await fixture.GetLogs(owner, name, job.Id);
|
|
|
|
Assert.NotNull(logs);
|
|
Assert.NotEmpty(logs);
|
|
}
|
|
}
|
|
|
|
[IntegrationTest]
|
|
public async Task CanRerunJob()
|
|
{
|
|
var github = Helper.GetAuthenticatedClient();
|
|
var fixture = github.Actions.Workflows.Jobs;
|
|
|
|
using (var context = await github.CreateRepositoryContextWithAutoInit())
|
|
{
|
|
var owner = context.Repository.Owner.Login;
|
|
var name = context.Repository.Name;
|
|
(var workflowFileName, var runId) = await CreateWorkflowAndWaitForCompletion(github, context);
|
|
|
|
var jobs = await fixture.List(owner, name, runId);
|
|
|
|
Assert.NotNull(jobs);
|
|
Assert.NotNull(jobs.Jobs);
|
|
var job = Assert.Single(jobs.Jobs);
|
|
|
|
await fixture.Rerun(owner, name, job.Id);
|
|
}
|
|
}
|
|
|
|
private static async Task<(string WorkflowFileName, long RunId)> CreateWorkflowAndWaitForCompletion(
|
|
IGitHubClient github,
|
|
RepositoryContext context)
|
|
{
|
|
var owner = context.Repository.Owner.Login;
|
|
var name = context.Repository.Name;
|
|
var workflowFileName = ".github/workflows/hello-world.yml";
|
|
|
|
_ = await github.Repository.Content.CreateFile(
|
|
owner,
|
|
name,
|
|
workflowFileName,
|
|
new CreateFileRequest("Create test workflow", HelloWorldWorkflow));
|
|
|
|
var totalTimeout = TimeSpan.FromMinutes(1);
|
|
var loopDelay = TimeSpan.FromSeconds(2);
|
|
|
|
using (var cts = new CancellationTokenSource(totalTimeout))
|
|
{
|
|
while (!cts.IsCancellationRequested)
|
|
{
|
|
cts.Token.ThrowIfCancellationRequested();
|
|
|
|
var runs = await github.Actions.Workflows.Runs.List(owner, name);
|
|
|
|
await Task.Delay(loopDelay);
|
|
|
|
if (runs.TotalCount > 0 && runs.WorkflowRuns[0].Status == WorkflowRunStatus.Completed)
|
|
{
|
|
return (workflowFileName, runs.WorkflowRuns[0].Id);
|
|
}
|
|
}
|
|
}
|
|
|
|
throw new InvalidOperationException("Timed out waiting for workflow run.");
|
|
}
|
|
}
|