Skip to content

Commit b911b96

Browse files
PrashanthiRameshPrashanthi Ramesh
andauthored
Add support to Group hooks (#661)
* Add support to Group hooks - Closes #654 * Unit test the group hooks client * Mock group hooks client * Refactors based on review comments * Set nullable properties in GroupHookUpsert Review refactor --------- Co-authored-by: Prashanthi Ramesh <prashanthi.ramesh@ubisoft.com>
1 parent 0403aa7 commit b911b96

File tree

15 files changed

+583
-1
lines changed

15 files changed

+583
-1
lines changed

NGitLab.Mock.Tests/GroupsMockTests.cs

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
using System.Linq;
1+
using System;
2+
using System.Linq;
23
using System.Threading.Tasks;
34
using NGitLab.Mock.Config;
5+
using NGitLab.Models;
46
using NUnit.Framework;
57

68
namespace NGitLab.Mock.Tests;
@@ -339,4 +341,69 @@ public async Task Test_page_projects_in_subgroup_with_descendants()
339341
Assert.That(total, Is.EqualTo(3));
340342
});
341343
}
344+
345+
[Test]
346+
public void Test_create_update_delete_group_hooks()
347+
{
348+
// Arrange
349+
var groupId = 1;
350+
351+
using var server = new GitLabConfig()
352+
.WithUser("user1", isAdmin: true)
353+
.WithGroup("group1", groupId)
354+
.BuildServer();
355+
356+
var client = server.CreateClient("user1");
357+
var groupHooksClient = client.GetGroupHooksClient(groupId);
358+
359+
var toCreateGroupHook = new GroupHookUpsert
360+
{
361+
Url = new Uri("https://test-create-group-hook.com"),
362+
EnableSslVerification = true,
363+
PushEvents = true,
364+
};
365+
366+
// Act
367+
var createdGroupHook = groupHooksClient.Create(toCreateGroupHook);
368+
369+
// Assert
370+
Assert.That(groupHooksClient.All.ToArray(), Has.Length.EqualTo(1));
371+
372+
Assert.That(createdGroupHook.Url, Is.EqualTo(toCreateGroupHook.Url));
373+
Assert.That(createdGroupHook.EnableSslVerification, Is.EqualTo(toCreateGroupHook.EnableSslVerification));
374+
Assert.That(createdGroupHook.PushEvents, Is.EqualTo(toCreateGroupHook.PushEvents));
375+
376+
var groupHookById = groupHooksClient[createdGroupHook.Id];
377+
Assert.That(groupHookById.Url, Is.EqualTo(toCreateGroupHook.Url));
378+
Assert.That(groupHookById.EnableSslVerification, Is.EqualTo(toCreateGroupHook.EnableSslVerification));
379+
Assert.That(groupHookById.PushEvents, Is.EqualTo(toCreateGroupHook.PushEvents));
380+
381+
// Arrange
382+
var toUpdateGroupHook = new GroupHookUpsert
383+
{
384+
Url = new Uri("https://test-update-group-hook.com"),
385+
PushEvents = false,
386+
};
387+
388+
// Act
389+
var updatedGroupHook = groupHooksClient.Update(createdGroupHook.Id, toUpdateGroupHook);
390+
391+
// Assert
392+
Assert.That(groupHooksClient.All.ToArray(), Has.Length.EqualTo(1));
393+
394+
Assert.That(updatedGroupHook.Url, Is.EqualTo(toUpdateGroupHook.Url));
395+
Assert.That(updatedGroupHook.PushEvents, Is.EqualTo(toUpdateGroupHook.PushEvents));
396+
Assert.That(updatedGroupHook.EnableSslVerification, Is.False);
397+
398+
groupHookById = groupHooksClient[updatedGroupHook.Id];
399+
Assert.That(groupHookById.Url, Is.EqualTo(toUpdateGroupHook.Url));
400+
Assert.That(groupHookById.PushEvents, Is.EqualTo(toUpdateGroupHook.PushEvents));
401+
Assert.That(groupHookById.EnableSslVerification, Is.False);
402+
403+
// Act
404+
groupHooksClient.Delete(updatedGroupHook.Id);
405+
406+
// Assert
407+
Assert.That(groupHooksClient.All.ToArray(), Is.Empty);
408+
}
342409
}

NGitLab.Mock/Clients/GitLabClient.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,4 +154,6 @@ public IProtectedTagClient GetProtectedTagClient(ProjectId projectId)
154154
public ISearchClient GetProjectSearchClient(int projectId) => GetProjectSearchClient((long)projectId);
155155

156156
public ISearchClient GetProjectSearchClient(ProjectId projectId) => new ProjectSearchClient(Context, projectId);
157+
158+
public IGroupHooksClient GetGroupHooksClient(GroupId groupId) => new GroupHooksClient(Context, groupId);
157159
}
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using NGitLab.Models;
4+
5+
namespace NGitLab.Mock.Clients;
6+
7+
internal sealed class GroupHooksClient : ClientBase, IGroupHooksClient
8+
{
9+
public int _groupId { get; }
10+
11+
public GroupHooksClient(ClientContext context, GroupId groupId)
12+
: base(context)
13+
{
14+
_groupId = Server.AllGroups.FindGroup(groupId.ValueAsUriParameter()).Id;
15+
}
16+
17+
public IEnumerable<Models.GroupHook> All
18+
{
19+
get
20+
{
21+
using (Context.BeginOperationScope())
22+
{
23+
var hooks = GetGroup(_groupId, GroupPermission.Edit).Hooks;
24+
return ToClientGroupHooks(hooks).ToList();
25+
}
26+
}
27+
}
28+
29+
public Models.GroupHook this[int hookId]
30+
{
31+
get
32+
{
33+
using (Context.BeginOperationScope())
34+
{
35+
var hook = All.FirstOrDefault(h => h.Id == hookId) ?? throw new GitLabNotFoundException();
36+
return hook;
37+
}
38+
}
39+
}
40+
41+
public Models.GroupHook Create(GroupHookUpsert hook)
42+
{
43+
using (Context.BeginOperationScope())
44+
{
45+
var groupHook = UpsertToHook(hook);
46+
47+
GetGroup(_groupId, GroupPermission.Edit).Hooks.Add(groupHook);
48+
return groupHook.ToClientGroupHook();
49+
}
50+
}
51+
52+
public Models.GroupHook Update(int hookId, GroupHookUpsert hook)
53+
{
54+
using (Context.BeginOperationScope())
55+
{
56+
var currentHook = GetGroup(_groupId, GroupPermission.Edit).Hooks.FirstOrDefault(h => h.Id == hookId) ?? throw new GitLabNotFoundException();
57+
58+
currentHook.Url = hook.Url;
59+
currentHook.PushEvents = hook.PushEvents ?? false;
60+
currentHook.MergeRequestsEvents = hook.MergeRequestsEvents ?? false;
61+
currentHook.IssuesEvents = hook.IssuesEvents ?? false;
62+
currentHook.TagPushEvents = hook.TagPushEvents ?? false;
63+
currentHook.NoteEvents = hook.NoteEvents ?? false;
64+
currentHook.JobEvents = hook.JobEvents ?? false;
65+
currentHook.PipelineEvents = hook.PipelineEvents ?? false;
66+
currentHook.WikiPagesEvents = hook.WikiPagesEvents ?? false;
67+
currentHook.EnableSslVerification = hook.EnableSslVerification ?? false;
68+
currentHook.Token = currentHook.Token;
69+
70+
return currentHook.ToClientGroupHook();
71+
}
72+
}
73+
74+
public void Delete(int hookId)
75+
{
76+
using (Context.BeginOperationScope())
77+
{
78+
var groupHooks = GetGroup(_groupId, GroupPermission.Edit).Hooks;
79+
var hook = groupHooks.FirstOrDefault(h => h.Id == hookId) ?? throw new GitLabNotFoundException();
80+
81+
groupHooks.Remove(hook);
82+
}
83+
}
84+
85+
private static IEnumerable<Models.GroupHook> ToClientGroupHooks(IEnumerable<GroupHook> hooks)
86+
{
87+
return hooks.Select(hook => hook.ToClientGroupHook());
88+
}
89+
90+
private static GroupHook UpsertToHook(GroupHookUpsert hook)
91+
{
92+
var hookFromUpsert = new GroupHook
93+
{
94+
Url = hook.Url,
95+
PushEvents = hook.PushEvents ?? false,
96+
MergeRequestsEvents = hook.MergeRequestsEvents ?? false,
97+
IssuesEvents = hook.IssuesEvents ?? false,
98+
TagPushEvents = hook.TagPushEvents ?? false,
99+
NoteEvents = hook.NoteEvents ?? false,
100+
JobEvents = hook.JobEvents ?? false,
101+
PipelineEvents = hook.PipelineEvents ?? false,
102+
WikiPagesEvents = hook.WikiPagesEvents ?? false,
103+
EnableSslVerification = hook.EnableSslVerification ?? false,
104+
Token = hook.Token,
105+
};
106+
107+
return hookFromUpsert;
108+
}
109+
}

NGitLab.Mock/Group.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public Group(string name)
2323
Badges = new BadgeCollection(this);
2424
Labels = new LabelsCollection(this);
2525
Milestones = new MilestoneCollection(this);
26+
Hooks = new GroupHookCollection(this);
2627
Name = name;
2728
}
2829

@@ -76,6 +77,8 @@ public string Name
7677

7778
public MilestoneCollection Milestones { get; }
7879

80+
public GroupHookCollection Hooks { get; }
81+
7982
public IEnumerable<MergeRequest> MergeRequests => AllProjects.SelectMany(project => project.MergeRequests);
8083

8184
public string Path

NGitLab.Mock/GroupHook.cs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
using System;
2+
3+
namespace NGitLab.Mock;
4+
5+
public sealed class GroupHook : GitLabObject
6+
{
7+
public new Group Parent => (Group)base.Parent;
8+
9+
public int Id { get; internal set; }
10+
11+
public Uri Url { get; set; }
12+
13+
public DateTime CreatedAt { get; set; }
14+
15+
public bool PushEvents { get; set; }
16+
17+
public bool MergeRequestsEvents { get; set; }
18+
19+
public bool IssuesEvents { get; set; }
20+
21+
public bool TagPushEvents { get; set; }
22+
23+
public bool NoteEvents { get; set; }
24+
25+
public bool JobEvents { get; set; }
26+
27+
public bool PipelineEvents { get; set; }
28+
29+
public bool WikiPagesEvents { get; set; }
30+
31+
public bool EnableSslVerification { get; set; }
32+
33+
public string Token { get; set; }
34+
35+
public Models.GroupHook ToClientGroupHook()
36+
{
37+
return new Models.GroupHook
38+
{
39+
Id = Id,
40+
Url = Url,
41+
GroupId = Parent.Id,
42+
CreatedAt = CreatedAt,
43+
PushEvents = PushEvents,
44+
MergeRequestsEvents = MergeRequestsEvents,
45+
IssuesEvents = IssuesEvents,
46+
TagPushEvents = TagPushEvents,
47+
NoteEvents = NoteEvents,
48+
JobEvents = JobEvents,
49+
PipelineEvents = PipelineEvents,
50+
WikiPagesEvents = WikiPagesEvents,
51+
EnableSslVerification = EnableSslVerification,
52+
Token = Token,
53+
};
54+
}
55+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using System;
2+
using System.Linq;
3+
4+
namespace NGitLab.Mock;
5+
6+
public class GroupHookCollection : Collection<GroupHook>
7+
{
8+
public GroupHookCollection(GitLabObject container)
9+
: base(container)
10+
{
11+
}
12+
13+
public override void Add(GroupHook item)
14+
{
15+
if (item is null)
16+
throw new ArgumentNullException(nameof(item));
17+
18+
if (item.Id == default)
19+
{
20+
item.Id = GetNewId();
21+
}
22+
23+
base.Add(item);
24+
}
25+
26+
private int GetNewId()
27+
{
28+
return this.Select(hook => hook.Id).DefaultIfEmpty().Max() + 1;
29+
}
30+
}

NGitLab.Mock/PublicAPI.Unshipped.txt

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,7 @@ NGitLab.Mock.Group.Group() -> void
449449
NGitLab.Mock.Group.Group(NGitLab.Mock.User user) -> void
450450
NGitLab.Mock.Group.Group(string name) -> void
451451
NGitLab.Mock.Group.Groups.get -> NGitLab.Mock.GroupCollection
452+
NGitLab.Mock.Group.Hooks.get -> NGitLab.Mock.GroupHookCollection
452453
NGitLab.Mock.Group.Id.get -> int
453454
NGitLab.Mock.Group.Id.set -> void
454455
NGitLab.Mock.Group.IsUserNamespace.get -> bool
@@ -476,6 +477,37 @@ NGitLab.Mock.Group.Visibility.set -> void
476477
NGitLab.Mock.GroupCollection
477478
NGitLab.Mock.GroupCollection.GroupCollection(NGitLab.Mock.GitLabObject container) -> void
478479
NGitLab.Mock.GroupExtensions
480+
NGitLab.Mock.GroupHook
481+
NGitLab.Mock.GroupHook.CreatedAt.get -> System.DateTime
482+
NGitLab.Mock.GroupHook.CreatedAt.set -> void
483+
NGitLab.Mock.GroupHook.EnableSslVerification.get -> bool
484+
NGitLab.Mock.GroupHook.EnableSslVerification.set -> void
485+
NGitLab.Mock.GroupHook.GroupHook() -> void
486+
NGitLab.Mock.GroupHook.Id.get -> int
487+
NGitLab.Mock.GroupHook.IssuesEvents.get -> bool
488+
NGitLab.Mock.GroupHook.IssuesEvents.set -> void
489+
NGitLab.Mock.GroupHook.JobEvents.get -> bool
490+
NGitLab.Mock.GroupHook.JobEvents.set -> void
491+
NGitLab.Mock.GroupHook.MergeRequestsEvents.get -> bool
492+
NGitLab.Mock.GroupHook.MergeRequestsEvents.set -> void
493+
NGitLab.Mock.GroupHook.NoteEvents.get -> bool
494+
NGitLab.Mock.GroupHook.NoteEvents.set -> void
495+
NGitLab.Mock.GroupHook.Parent.get -> NGitLab.Mock.Group
496+
NGitLab.Mock.GroupHook.PipelineEvents.get -> bool
497+
NGitLab.Mock.GroupHook.PipelineEvents.set -> void
498+
NGitLab.Mock.GroupHook.PushEvents.get -> bool
499+
NGitLab.Mock.GroupHook.PushEvents.set -> void
500+
NGitLab.Mock.GroupHook.TagPushEvents.get -> bool
501+
NGitLab.Mock.GroupHook.TagPushEvents.set -> void
502+
NGitLab.Mock.GroupHook.ToClientGroupHook() -> NGitLab.Models.GroupHook
503+
NGitLab.Mock.GroupHook.Token.get -> string
504+
NGitLab.Mock.GroupHook.Token.set -> void
505+
NGitLab.Mock.GroupHook.Url.get -> System.Uri
506+
NGitLab.Mock.GroupHook.Url.set -> void
507+
NGitLab.Mock.GroupHook.WikiPagesEvents.get -> bool
508+
NGitLab.Mock.GroupHook.WikiPagesEvents.set -> void
509+
NGitLab.Mock.GroupHookCollection
510+
NGitLab.Mock.GroupHookCollection.GroupHookCollection(NGitLab.Mock.GitLabObject container) -> void
479511
NGitLab.Mock.Issue
480512
NGitLab.Mock.Issue.Assignee.get -> NGitLab.Mock.UserRef
481513
NGitLab.Mock.Issue.Assignee.set -> void
@@ -1193,6 +1225,7 @@ override NGitLab.Mock.EventCollection.Add(NGitLab.Mock.Event item) -> void
11931225
override NGitLab.Mock.Config.GitLabCollection<TItem>.InsertItem(int index, TItem item) -> void
11941226
override NGitLab.Mock.Config.GitLabCollection<TItem>.SetItem(int index, TItem item) -> void
11951227
override NGitLab.Mock.GroupCollection.Add(NGitLab.Mock.Group group) -> void
1228+
override NGitLab.Mock.GroupHookCollection.Add(NGitLab.Mock.GroupHook item) -> void
11961229
override NGitLab.Mock.IssueCollection.Add(NGitLab.Mock.Issue item) -> void
11971230
override NGitLab.Mock.JobCollection.Add(NGitLab.Mock.Job job) -> void
11981231
override NGitLab.Mock.LabelsCollection.Add(NGitLab.Mock.Label label) -> void

0 commit comments

Comments
 (0)