Skip to content

Commit b77201b

Browse files
jasonwoods-7Toa741
andauthored
feat: add SquashOption support to ProjectUpdate and mock (#1079)
* Add `SquashOption` property to `ProjectUpdate` model with JSON serialization * Add `SquashOption` property to the mock `Project` class * Handle `SquashOption` in the mock `ProjectClient.Update` method * Map `SquashOption` through `ToClientProject` using `DynamicEnum<SquashOption>` * Update PublicAPI.Unshipped.txt for all target frameworks * Add mock tests verifying SquashOption is applied on update and retained when omitted Co-authored-by: Thomas Cortes <78750681+Toa741@users.noreply.github.com>
1 parent d84a04b commit b77201b

File tree

9 files changed

+70
-0
lines changed

9 files changed

+70
-0
lines changed

NGitLab.Mock.Tests/ProjectsMockTests.cs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,55 @@ public async Task CreateAsync_WhenProjectNameOfDifferentCaseAlreadyExists_ItWork
371371
Assert.That(newProject.Name, Is.EqualTo("NOT_DUPLICATE"));
372372
}
373373

374+
[Test]
375+
public async Task UpdateAsync_WhenSquashOptionIsProvided_ItIsUpdated()
376+
{
377+
// Arrange
378+
using var server = new GitLabConfig()
379+
.WithUser("Test", isDefault: true)
380+
.WithProjectOfFullPath("Test/MyProject")
381+
.BuildServer();
382+
383+
var projectClient = server.CreateClient().Projects;
384+
var project = await projectClient.GetAsync("Test/MyProject");
385+
386+
// Act
387+
var updated = await projectClient.UpdateAsync(project.Id, new ProjectUpdate
388+
{
389+
SquashOption = SquashOption.Always,
390+
});
391+
392+
// Assert
393+
Assert.That(updated.SquashOption, Is.EqualTo(SquashOption.Always));
394+
}
395+
396+
[Test]
397+
public async Task UpdateAsync_WhenSquashOptionIsNotProvided_ItRetainsExistingValue()
398+
{
399+
// Arrange
400+
using var server = new GitLabConfig()
401+
.WithUser("Test", isDefault: true)
402+
.WithProjectOfFullPath("Test/MyProject")
403+
.BuildServer();
404+
405+
var projectClient = server.CreateClient().Projects;
406+
var project = await projectClient.GetAsync("Test/MyProject");
407+
408+
await projectClient.UpdateAsync(project.Id, new ProjectUpdate
409+
{
410+
SquashOption = SquashOption.Never,
411+
});
412+
413+
// Act — update without specifying SquashOption
414+
var updated = await projectClient.UpdateAsync(project.Id, new ProjectUpdate
415+
{
416+
Description = "updated",
417+
});
418+
419+
// Assert
420+
Assert.That(updated.SquashOption, Is.EqualTo(SquashOption.Never));
421+
}
422+
374423
[Test]
375424
public void UpdateAsync_WhenProjectNotFound_ItThrows()
376425
{

NGitLab.Mock/Clients/ProjectClient.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,11 @@ public Models.Project Update(string id, ProjectUpdate projectUpdate)
383383
project.Topics = projectUpdate.Topics.Where(t => !string.IsNullOrEmpty(t)).Distinct(StringComparer.Ordinal).ToArray();
384384
}
385385

386+
if (projectUpdate.SquashOption.HasValue)
387+
{
388+
project.SquashOption = projectUpdate.SquashOption.Value;
389+
}
390+
386391
return project.ToClientProject(Context.User);
387392
}
388393
}

NGitLab.Mock/Project.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,8 @@ public string[] Tags
165165

166166
public string RunnersToken { get; internal set; }
167167

168+
public SquashOption SquashOption { get; set; }
169+
168170
public void Remove()
169171
{
170172
Group.Projects.Remove(this);
@@ -483,6 +485,7 @@ public Models.Project ToClientProject(User currentUser)
483485
Statistics = Statistics,
484486
TagList = Tags,
485487
Topics = Topics,
488+
SquashOption = new DynamicEnum<SquashOption>(SquashOption),
486489
Mirror = Mirror,
487490
MirrorUserId = MirrorUserId,
488491
MirrorTriggerBuilds = MirrorTriggerBuilds,

NGitLab.Mock/PublicAPI.Unshipped.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -956,6 +956,8 @@ NGitLab.Mock.Project.Repository.get -> NGitLab.Mock.Repository
956956
NGitLab.Mock.Project.RepositoryAccessLevel.get -> NGitLab.Models.RepositoryAccessLevel
957957
NGitLab.Mock.Project.RepositoryAccessLevel.set -> void
958958
NGitLab.Mock.Project.RunnersToken.get -> string
959+
NGitLab.Mock.Project.SquashOption.get -> NGitLab.Models.SquashOption
960+
NGitLab.Mock.Project.SquashOption.set -> void
959961
NGitLab.Mock.Project.SshUrl.get -> string
960962
NGitLab.Mock.Project.Statistics.get -> NGitLab.Models.ProjectStatistics
961963
NGitLab.Mock.Project.Statistics.set -> void

NGitLab/Models/ProjectUpdate.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,4 +110,7 @@ public sealed class ProjectUpdate
110110

111111
[JsonPropertyName("ci_default_git_depth")]
112112
public int? CiDefaultGitDepth { get; set; }
113+
114+
[JsonPropertyName("squash_option")]
115+
public SquashOption? SquashOption { get; set; }
113116
}

NGitLab/PublicAPI/net10.0/PublicAPI.Unshipped.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4066,6 +4066,8 @@ NGitLab.Models.ProjectUpdate.SnippetsAccessLevel.get -> string
40664066
NGitLab.Models.ProjectUpdate.SnippetsAccessLevel.set -> void
40674067
NGitLab.Models.ProjectUpdate.SnippetsEnabled.get -> bool?
40684068
NGitLab.Models.ProjectUpdate.SnippetsEnabled.set -> void
4069+
NGitLab.Models.ProjectUpdate.SquashOption.get -> NGitLab.Models.SquashOption?
4070+
NGitLab.Models.ProjectUpdate.SquashOption.set -> void
40694071
NGitLab.Models.ProjectUpdate.TagList.get -> string[]
40704072
NGitLab.Models.ProjectUpdate.TagList.set -> void
40714073
NGitLab.Models.ProjectUpdate.Topics.get -> System.Collections.Generic.List<string>

NGitLab/PublicAPI/net472/PublicAPI.Unshipped.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4067,6 +4067,8 @@ NGitLab.Models.ProjectUpdate.SnippetsAccessLevel.get -> string
40674067
NGitLab.Models.ProjectUpdate.SnippetsAccessLevel.set -> void
40684068
NGitLab.Models.ProjectUpdate.SnippetsEnabled.get -> bool?
40694069
NGitLab.Models.ProjectUpdate.SnippetsEnabled.set -> void
4070+
NGitLab.Models.ProjectUpdate.SquashOption.get -> NGitLab.Models.SquashOption?
4071+
NGitLab.Models.ProjectUpdate.SquashOption.set -> void
40704072
NGitLab.Models.ProjectUpdate.TagList.get -> string[]
40714073
NGitLab.Models.ProjectUpdate.TagList.set -> void
40724074
NGitLab.Models.ProjectUpdate.Topics.get -> System.Collections.Generic.List<string>

NGitLab/PublicAPI/net8.0/PublicAPI.Unshipped.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4066,6 +4066,8 @@ NGitLab.Models.ProjectUpdate.SnippetsAccessLevel.get -> string
40664066
NGitLab.Models.ProjectUpdate.SnippetsAccessLevel.set -> void
40674067
NGitLab.Models.ProjectUpdate.SnippetsEnabled.get -> bool?
40684068
NGitLab.Models.ProjectUpdate.SnippetsEnabled.set -> void
4069+
NGitLab.Models.ProjectUpdate.SquashOption.get -> NGitLab.Models.SquashOption?
4070+
NGitLab.Models.ProjectUpdate.SquashOption.set -> void
40694071
NGitLab.Models.ProjectUpdate.TagList.get -> string[]
40704072
NGitLab.Models.ProjectUpdate.TagList.set -> void
40714073
NGitLab.Models.ProjectUpdate.Topics.get -> System.Collections.Generic.List<string>

NGitLab/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4067,6 +4067,8 @@ NGitLab.Models.ProjectUpdate.SnippetsAccessLevel.get -> string
40674067
NGitLab.Models.ProjectUpdate.SnippetsAccessLevel.set -> void
40684068
NGitLab.Models.ProjectUpdate.SnippetsEnabled.get -> bool?
40694069
NGitLab.Models.ProjectUpdate.SnippetsEnabled.set -> void
4070+
NGitLab.Models.ProjectUpdate.SquashOption.get -> NGitLab.Models.SquashOption?
4071+
NGitLab.Models.ProjectUpdate.SquashOption.set -> void
40704072
NGitLab.Models.ProjectUpdate.TagList.get -> string[]
40714073
NGitLab.Models.ProjectUpdate.TagList.set -> void
40724074
NGitLab.Models.ProjectUpdate.Topics.get -> System.Collections.Generic.List<string>

0 commit comments

Comments
 (0)