diff --git a/NGitLab.Tests/LintClientTests.cs b/NGitLab.Tests/LintClientTests.cs index 76762be9..5f135bc1 100644 --- a/NGitLab.Tests/LintClientTests.cs +++ b/NGitLab.Tests/LintClientTests.cs @@ -11,15 +11,27 @@ public class LintClientTests private const string ValidCIYaml = @" variables: CI_DEBUG_TRACE: ""true"" -build: +build-job: + stage: build + tags: + - Runner-Build + before_script: + - echo before start + - echo before end script: - - echo test + - echo test start + - echo test end + after_script: + - echo after start + - echo after end + when: always + allow_failure: true "; private const string InvalidCIYaml = @" variables: CI_DEBUG_TRACE: ""true"" -build: +build-job: script: - echo test this_key_should_not_exist: @@ -36,9 +48,38 @@ public async Task LintValidCIYaml() var result = await context.Client.Lint.ValidateCIYamlContentAsync(project.Id.ToString(), ValidCIYaml, new(), CancellationToken.None); - Assert.That(result.Valid, Is.True); - Assert.That(result.Errors.Length != 0, Is.False); - Assert.That(result.Warnings.Length != 0, Is.False); + Assert.Multiple(() => + { + Assert.That(result.Valid, Is.True); + Assert.That(result.Errors, Is.Empty); + Assert.That(result.Warnings, Is.Empty); + }); + } + + [Test] + [NGitLabRetry] + public async Task LintValidCIYamlWithJobs() + { + using var context = await GitLabTestContext.CreateAsync(); + var project = context.CreateProject(); + var lintClient = context.Client.Lint; + + var result = await context.Client.Lint.ValidateCIYamlContentAsync(project.Id.ToString(), ValidCIYaml, new() { IncludeJobs = true }, CancellationToken.None); + + Assert.That(result.Jobs, Has.Length.EqualTo(1)); + var job = result.Jobs[0]; + Assert.Multiple(() => + { + Assert.That(job.Name, Is.EqualTo("build-job")); + Assert.That(job.Stage, Is.EqualTo("build")); + Assert.That(job.BeforeScript, Is.EqualTo(["echo before start", "echo before end"])); + Assert.That(job.Script, Is.EqualTo(["echo test start", "echo test end"])); + Assert.That(job.AfterScript, Is.EqualTo(["echo after start", "echo after end"])); + Assert.That(job.TagList, Is.EqualTo(["Runner-Build"])); + Assert.That(job.Environment, Is.Null); + Assert.That(job.When, Is.EqualTo("always")); + Assert.That(job.AllowFailure, Is.True); + }); } [Test] @@ -51,9 +92,12 @@ public async Task LintInvalidCIYaml() var result = await context.Client.Lint.ValidateCIYamlContentAsync(project.Id.ToString(), InvalidCIYaml, new(), CancellationToken.None); - Assert.That(result.Valid, Is.False); - Assert.That(result.Errors.Length != 0, Is.True); - Assert.That(result.Warnings.Length != 0, Is.False); + Assert.Multiple(() => + { + Assert.That(result.Valid, Is.False); + Assert.That(result.Errors, Is.Not.Empty); + Assert.That(result.Warnings, Is.Empty); + }); } [Test] @@ -74,9 +118,12 @@ public async Task LintValidCIProjectYaml() var result = await context.Client.Lint.ValidateProjectCIConfigurationAsync(project.Id.ToString(), new(), CancellationToken.None); - Assert.That(result.Valid, Is.True); - Assert.That(result.Errors.Length != 0, Is.False); - Assert.That(result.Warnings.Length != 0, Is.False); + Assert.Multiple(() => + { + Assert.That(result.Valid, Is.True); + Assert.That(result.Errors, Is.Empty); + Assert.That(result.Warnings, Is.Empty); + }); } [Test] @@ -97,8 +144,11 @@ public async Task LintInvalidProjectCIYaml() var result = await context.Client.Lint.ValidateProjectCIConfigurationAsync(project.Id.ToString(), new(), CancellationToken.None); - Assert.That(result.Valid, Is.False); - Assert.That(result.Errors.Length != 0, Is.True); - Assert.That(result.Warnings.Length != 0, Is.False); + Assert.Multiple(() => + { + Assert.That(result.Valid, Is.False); + Assert.That(result.Errors, Is.Not.Empty); + Assert.That(result.Warnings, Is.Empty); + }); } } diff --git a/NGitLab/Models/LintCI.cs b/NGitLab/Models/LintCI.cs index 7845ba4a..456da01f 100644 --- a/NGitLab/Models/LintCI.cs +++ b/NGitLab/Models/LintCI.cs @@ -17,4 +17,7 @@ public class LintCI [JsonPropertyName("warnings")] public string[] Warnings { get; set; } + + [JsonPropertyName("jobs")] + public LintCIJob[] Jobs { get; set; } } diff --git a/NGitLab/Models/LintCIJob.cs b/NGitLab/Models/LintCIJob.cs new file mode 100644 index 00000000..88fcc6e7 --- /dev/null +++ b/NGitLab/Models/LintCIJob.cs @@ -0,0 +1,34 @@ +using System.Text.Json.Serialization; + +namespace NGitLab.Models; + +public class LintCIJob +{ + [JsonPropertyName("name")] + public string Name { get; set; } + + [JsonPropertyName("stage")] + public string Stage { get; set; } + + [JsonPropertyName("before_script")] + public string[] BeforeScript { get; set; } + + [JsonPropertyName("script")] + public string[] Script { get; set; } + + [JsonPropertyName("after_script")] + public string[] AfterScript { get; set; } + + [JsonPropertyName("tag_list")] + public string[] TagList { get; set; } + + [JsonPropertyName("environment")] + public string Environment { get; set; } + + [JsonPropertyName("when")] + public string When { get; set; } + + [JsonPropertyName("allow_failure")] + public bool AllowFailure { get; set; } + +} diff --git a/NGitLab/PublicAPI.Unshipped.txt b/NGitLab/PublicAPI.Unshipped.txt index 3e72dab0..9492db5f 100644 --- a/NGitLab/PublicAPI.Unshipped.txt +++ b/NGitLab/PublicAPI.Unshipped.txt @@ -2578,6 +2578,8 @@ NGitLab.Models.LineRange.Start.set -> void NGitLab.Models.LintCI NGitLab.Models.LintCI.Errors.get -> string[] NGitLab.Models.LintCI.Errors.set -> void +NGitLab.Models.LintCI.Jobs.get -> NGitLab.Models.LintCIJob[] +NGitLab.Models.LintCI.Jobs.set -> void NGitLab.Models.LintCI.LintCI() -> void NGitLab.Models.LintCI.MergedYaml.get -> string NGitLab.Models.LintCI.MergedYaml.set -> void @@ -2585,6 +2587,26 @@ NGitLab.Models.LintCI.Valid.get -> bool NGitLab.Models.LintCI.Valid.set -> void NGitLab.Models.LintCI.Warnings.get -> string[] NGitLab.Models.LintCI.Warnings.set -> void +NGitLab.Models.LintCIJob +NGitLab.Models.LintCIJob.AfterScript.get -> string[] +NGitLab.Models.LintCIJob.AfterScript.set -> void +NGitLab.Models.LintCIJob.AllowFailure.get -> bool +NGitLab.Models.LintCIJob.AllowFailure.set -> void +NGitLab.Models.LintCIJob.BeforeScript.get -> string[] +NGitLab.Models.LintCIJob.BeforeScript.set -> void +NGitLab.Models.LintCIJob.Environment.get -> string +NGitLab.Models.LintCIJob.Environment.set -> void +NGitLab.Models.LintCIJob.LintCIJob() -> void +NGitLab.Models.LintCIJob.Name.get -> string +NGitLab.Models.LintCIJob.Name.set -> void +NGitLab.Models.LintCIJob.Script.get -> string[] +NGitLab.Models.LintCIJob.Script.set -> void +NGitLab.Models.LintCIJob.Stage.get -> string +NGitLab.Models.LintCIJob.Stage.set -> void +NGitLab.Models.LintCIJob.TagList.get -> string[] +NGitLab.Models.LintCIJob.TagList.set -> void +NGitLab.Models.LintCIJob.When.get -> string +NGitLab.Models.LintCIJob.When.set -> void NGitLab.Models.LintCIOptions NGitLab.Models.LintCIOptions.DryRun.get -> bool? NGitLab.Models.LintCIOptions.DryRun.set -> void