diff --git a/NGitLab.Mock.Tests/ProjectsMockTests.cs b/NGitLab.Mock.Tests/ProjectsMockTests.cs index 86fa6319..e1e5e1ed 100644 --- a/NGitLab.Mock.Tests/ProjectsMockTests.cs +++ b/NGitLab.Mock.Tests/ProjectsMockTests.cs @@ -371,6 +371,55 @@ public async Task CreateAsync_WhenProjectNameOfDifferentCaseAlreadyExists_ItWork Assert.That(newProject.Name, Is.EqualTo("NOT_DUPLICATE")); } + [Test] + public async Task UpdateAsync_WhenSquashOptionIsProvided_ItIsUpdated() + { + // Arrange + using var server = new GitLabConfig() + .WithUser("Test", isDefault: true) + .WithProjectOfFullPath("Test/MyProject") + .BuildServer(); + + var projectClient = server.CreateClient().Projects; + var project = await projectClient.GetAsync("Test/MyProject"); + + // Act + var updated = await projectClient.UpdateAsync(project.Id, new ProjectUpdate + { + SquashOption = SquashOption.Always, + }); + + // Assert + Assert.That(updated.SquashOption, Is.EqualTo(SquashOption.Always)); + } + + [Test] + public async Task UpdateAsync_WhenSquashOptionIsNotProvided_ItRetainsExistingValue() + { + // Arrange + using var server = new GitLabConfig() + .WithUser("Test", isDefault: true) + .WithProjectOfFullPath("Test/MyProject") + .BuildServer(); + + var projectClient = server.CreateClient().Projects; + var project = await projectClient.GetAsync("Test/MyProject"); + + await projectClient.UpdateAsync(project.Id, new ProjectUpdate + { + SquashOption = SquashOption.Never, + }); + + // Act — update without specifying SquashOption + var updated = await projectClient.UpdateAsync(project.Id, new ProjectUpdate + { + Description = "updated", + }); + + // Assert + Assert.That(updated.SquashOption, Is.EqualTo(SquashOption.Never)); + } + [Test] public void UpdateAsync_WhenProjectNotFound_ItThrows() { diff --git a/NGitLab.Mock/Clients/ProjectClient.cs b/NGitLab.Mock/Clients/ProjectClient.cs index 57aeffa6..7653a947 100644 --- a/NGitLab.Mock/Clients/ProjectClient.cs +++ b/NGitLab.Mock/Clients/ProjectClient.cs @@ -383,6 +383,11 @@ public Models.Project Update(string id, ProjectUpdate projectUpdate) project.Topics = projectUpdate.Topics.Where(t => !string.IsNullOrEmpty(t)).Distinct(StringComparer.Ordinal).ToArray(); } + if (projectUpdate.SquashOption.HasValue) + { + project.SquashOption = projectUpdate.SquashOption.Value; + } + return project.ToClientProject(Context.User); } } diff --git a/NGitLab.Mock/Project.cs b/NGitLab.Mock/Project.cs index 283b6b75..e5b3764e 100644 --- a/NGitLab.Mock/Project.cs +++ b/NGitLab.Mock/Project.cs @@ -165,6 +165,8 @@ public string[] Tags public string RunnersToken { get; internal set; } + public SquashOption SquashOption { get; set; } + public void Remove() { Group.Projects.Remove(this); @@ -483,6 +485,7 @@ public Models.Project ToClientProject(User currentUser) Statistics = Statistics, TagList = Tags, Topics = Topics, + SquashOption = new DynamicEnum(SquashOption), Mirror = Mirror, MirrorUserId = MirrorUserId, MirrorTriggerBuilds = MirrorTriggerBuilds, diff --git a/NGitLab.Mock/PublicAPI.Unshipped.txt b/NGitLab.Mock/PublicAPI.Unshipped.txt index 682b32bb..faa3df42 100644 --- a/NGitLab.Mock/PublicAPI.Unshipped.txt +++ b/NGitLab.Mock/PublicAPI.Unshipped.txt @@ -956,6 +956,8 @@ NGitLab.Mock.Project.Repository.get -> NGitLab.Mock.Repository NGitLab.Mock.Project.RepositoryAccessLevel.get -> NGitLab.Models.RepositoryAccessLevel NGitLab.Mock.Project.RepositoryAccessLevel.set -> void NGitLab.Mock.Project.RunnersToken.get -> string +NGitLab.Mock.Project.SquashOption.get -> NGitLab.Models.SquashOption +NGitLab.Mock.Project.SquashOption.set -> void NGitLab.Mock.Project.SshUrl.get -> string NGitLab.Mock.Project.Statistics.get -> NGitLab.Models.ProjectStatistics NGitLab.Mock.Project.Statistics.set -> void diff --git a/NGitLab/Models/ProjectUpdate.cs b/NGitLab/Models/ProjectUpdate.cs index cd2947d2..c508d0e7 100644 --- a/NGitLab/Models/ProjectUpdate.cs +++ b/NGitLab/Models/ProjectUpdate.cs @@ -110,4 +110,7 @@ public sealed class ProjectUpdate [JsonPropertyName("ci_default_git_depth")] public int? CiDefaultGitDepth { get; set; } + + [JsonPropertyName("squash_option")] + public SquashOption? SquashOption { get; set; } } diff --git a/NGitLab/PublicAPI/net10.0/PublicAPI.Unshipped.txt b/NGitLab/PublicAPI/net10.0/PublicAPI.Unshipped.txt index c18e7499..f62c0a2b 100644 --- a/NGitLab/PublicAPI/net10.0/PublicAPI.Unshipped.txt +++ b/NGitLab/PublicAPI/net10.0/PublicAPI.Unshipped.txt @@ -4066,6 +4066,8 @@ NGitLab.Models.ProjectUpdate.SnippetsAccessLevel.get -> string NGitLab.Models.ProjectUpdate.SnippetsAccessLevel.set -> void NGitLab.Models.ProjectUpdate.SnippetsEnabled.get -> bool? NGitLab.Models.ProjectUpdate.SnippetsEnabled.set -> void +NGitLab.Models.ProjectUpdate.SquashOption.get -> NGitLab.Models.SquashOption? +NGitLab.Models.ProjectUpdate.SquashOption.set -> void NGitLab.Models.ProjectUpdate.TagList.get -> string[] NGitLab.Models.ProjectUpdate.TagList.set -> void NGitLab.Models.ProjectUpdate.Topics.get -> System.Collections.Generic.List diff --git a/NGitLab/PublicAPI/net472/PublicAPI.Unshipped.txt b/NGitLab/PublicAPI/net472/PublicAPI.Unshipped.txt index 05c95fac..0f8bf4a7 100644 --- a/NGitLab/PublicAPI/net472/PublicAPI.Unshipped.txt +++ b/NGitLab/PublicAPI/net472/PublicAPI.Unshipped.txt @@ -4067,6 +4067,8 @@ NGitLab.Models.ProjectUpdate.SnippetsAccessLevel.get -> string NGitLab.Models.ProjectUpdate.SnippetsAccessLevel.set -> void NGitLab.Models.ProjectUpdate.SnippetsEnabled.get -> bool? NGitLab.Models.ProjectUpdate.SnippetsEnabled.set -> void +NGitLab.Models.ProjectUpdate.SquashOption.get -> NGitLab.Models.SquashOption? +NGitLab.Models.ProjectUpdate.SquashOption.set -> void NGitLab.Models.ProjectUpdate.TagList.get -> string[] NGitLab.Models.ProjectUpdate.TagList.set -> void NGitLab.Models.ProjectUpdate.Topics.get -> System.Collections.Generic.List diff --git a/NGitLab/PublicAPI/net8.0/PublicAPI.Unshipped.txt b/NGitLab/PublicAPI/net8.0/PublicAPI.Unshipped.txt index c18e7499..f62c0a2b 100644 --- a/NGitLab/PublicAPI/net8.0/PublicAPI.Unshipped.txt +++ b/NGitLab/PublicAPI/net8.0/PublicAPI.Unshipped.txt @@ -4066,6 +4066,8 @@ NGitLab.Models.ProjectUpdate.SnippetsAccessLevel.get -> string NGitLab.Models.ProjectUpdate.SnippetsAccessLevel.set -> void NGitLab.Models.ProjectUpdate.SnippetsEnabled.get -> bool? NGitLab.Models.ProjectUpdate.SnippetsEnabled.set -> void +NGitLab.Models.ProjectUpdate.SquashOption.get -> NGitLab.Models.SquashOption? +NGitLab.Models.ProjectUpdate.SquashOption.set -> void NGitLab.Models.ProjectUpdate.TagList.get -> string[] NGitLab.Models.ProjectUpdate.TagList.set -> void NGitLab.Models.ProjectUpdate.Topics.get -> System.Collections.Generic.List diff --git a/NGitLab/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt b/NGitLab/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt index 05c95fac..0f8bf4a7 100644 --- a/NGitLab/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt +++ b/NGitLab/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt @@ -4067,6 +4067,8 @@ NGitLab.Models.ProjectUpdate.SnippetsAccessLevel.get -> string NGitLab.Models.ProjectUpdate.SnippetsAccessLevel.set -> void NGitLab.Models.ProjectUpdate.SnippetsEnabled.get -> bool? NGitLab.Models.ProjectUpdate.SnippetsEnabled.set -> void +NGitLab.Models.ProjectUpdate.SquashOption.get -> NGitLab.Models.SquashOption? +NGitLab.Models.ProjectUpdate.SquashOption.set -> void NGitLab.Models.ProjectUpdate.TagList.get -> string[] NGitLab.Models.ProjectUpdate.TagList.set -> void NGitLab.Models.ProjectUpdate.Topics.get -> System.Collections.Generic.List