Skip to content

Commit 57d2bda

Browse files
Implement "IncludeInheritedMembers" in Membership client mock (#514)
* Implement "IncludeInheritedMembers" in Membership client mock * Offload inheritence check to effective perms * Revert unused conversion method
1 parent c5e8fa6 commit 57d2bda

File tree

5 files changed

+105
-10
lines changed

5 files changed

+105
-10
lines changed
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
using System.Linq;
2+
using NGitLab.Mock.Config;
3+
using NUnit.Framework;
4+
5+
namespace NGitLab.Mock.Tests
6+
{
7+
public class MembersMockTests
8+
{
9+
[Test]
10+
public void Test_members_group_all_direct([Values] bool isDefault)
11+
{
12+
using var server = new GitLabConfig()
13+
.WithUser("user1", isDefault: true)
14+
.WithUser("user2")
15+
.WithGroup("G1", 1, addDefaultUserAsMaintainer: true)
16+
.WithGroup("G2", 2, @namespace: "G1", configure: g => g.WithUserPermission("user2", Models.AccessLevel.Maintainer))
17+
.BuildServer();
18+
19+
var client = server.CreateClient("user1");
20+
var members = isDefault
21+
? client.Members.OfGroup("2")
22+
: client.Members.OfGroup("2", includeInheritedMembers: false);
23+
24+
Assert.AreEqual(1, members.Count(), "Membership found are invalid");
25+
}
26+
27+
[Test]
28+
public void Test_members_group_all_inherited()
29+
{
30+
using var server = new GitLabConfig()
31+
.WithUser("user1", isDefault: true)
32+
.WithUser("user2")
33+
.WithProject("Test")
34+
.WithGroup("G1", 1, configure: g => g.WithUserPermission("user1", Models.AccessLevel.Maintainer))
35+
.WithGroup("G2", 2, @namespace: "G1", configure: g => g.WithUserPermission("user2", Models.AccessLevel.Maintainer))
36+
.BuildServer();
37+
38+
var client = server.CreateClient("user1");
39+
var members = client.Members.OfGroup("2", includeInheritedMembers: true);
40+
41+
Assert.AreEqual(2, members.Count(), "Membership found are invalid");
42+
}
43+
44+
[Test]
45+
public void Test_members_project_all_direct([Values] bool isDefault)
46+
{
47+
using var server = new GitLabConfig()
48+
.WithUser("user1", isDefault: true)
49+
.WithUser("user2")
50+
.WithUser("user3")
51+
.WithGroup("G1", 1, addDefaultUserAsMaintainer: true)
52+
.WithGroup("G2", 2, @namespace: "G1", configure: g => g.WithUserPermission("user2", Models.AccessLevel.Maintainer))
53+
.WithProject("Project", @namespace: "G1", configure: g =>
54+
g.WithUserPermission("user3", Models.AccessLevel.Maintainer)
55+
.WithGroupPermission("G2", Models.AccessLevel.Developer))
56+
.BuildServer();
57+
58+
var client = server.CreateClient("user1");
59+
var members = isDefault
60+
? client.Members.OfProject("1")
61+
: client.Members.OfProject("1", includeInheritedMembers: false);
62+
63+
Assert.AreEqual(1, members.Count(), "Membership found are invalid");
64+
}
65+
66+
[Test]
67+
public void Test_members_project_all_inherited()
68+
{
69+
using var server = new GitLabConfig()
70+
.WithUser("user1", isDefault: true)
71+
.WithUser("user2")
72+
.WithUser("user3")
73+
.WithGroup("G1", addDefaultUserAsMaintainer: true)
74+
.WithGroup("G2", @namespace: "G1", configure: g => g.WithUserPermission("user2", Models.AccessLevel.Maintainer))
75+
.WithProject("Project", 1, @namespace: "G1", configure: g =>
76+
g.WithUserPermission("user3", Models.AccessLevel.Maintainer)
77+
.WithGroupPermission("G1/G2", Models.AccessLevel.Developer))
78+
.BuildServer();
79+
80+
var client = server.CreateClient("user1");
81+
var members = client.Members.OfProject("1", includeInheritedMembers: true);
82+
83+
Assert.AreEqual(3, members.Count(), "Membership found are invalid");
84+
}
85+
}
86+
}

NGitLab.Mock/Clients/MembersClient.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ public IEnumerable<Membership> OfGroup(string groupId, bool includeInheritedMemb
9898
using (Context.BeginOperationScope())
9999
{
100100
var group = GetGroup(groupId, GroupPermission.View);
101-
var members = group.GetEffectivePermissions().Permissions;
101+
var members = group.GetEffectivePermissions(includeInheritedMembers).Permissions;
102102
return members.Select(member => member.ToMembershipClient());
103103
}
104104
}
@@ -118,7 +118,7 @@ public IEnumerable<Membership> OfProject(string projectId, bool includeInherited
118118
using (Context.BeginOperationScope())
119119
{
120120
var project = GetProject(projectId, ProjectPermission.View);
121-
var members = project.GetEffectivePermissions().Permissions;
121+
var members = project.GetEffectivePermissions(includeInheritedMembers).Permissions;
122122
return members.Select(member => member.ToMembershipClient());
123123
}
124124
}

NGitLab.Mock/Group.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,13 +117,15 @@ public IEnumerable<Group> DescendantGroups
117117

118118
public IEnumerable<Project> AllProjects => Projects.Concat(DescendantGroups.SelectMany(group => group.Projects));
119119

120-
public EffectivePermissions GetEffectivePermissions()
120+
public EffectivePermissions GetEffectivePermissions() => GetEffectivePermissions(includeInheritedPermissions: true);
121+
122+
public EffectivePermissions GetEffectivePermissions(bool includeInheritedPermissions)
121123
{
122124
var result = new Dictionary<User, AccessLevel>();
123125

124-
if (Parent != null)
126+
if (Parent != null && includeInheritedPermissions)
125127
{
126-
foreach (var effectivePermission in Parent.GetEffectivePermissions().Permissions)
128+
foreach (var effectivePermission in Parent.GetEffectivePermissions(includeInheritedPermissions).Permissions)
127129
{
128130
Add(effectivePermission.User, effectivePermission.AccessLevel);
129131
}
@@ -137,7 +139,7 @@ public EffectivePermissions GetEffectivePermissions()
137139
}
138140
else
139141
{
140-
foreach (var effectivePermission in permission.Group.GetEffectivePermissions().Permissions)
142+
foreach (var effectivePermission in permission.Group.GetEffectivePermissions(includeInheritedPermissions).Permissions)
141143
{
142144
Add(effectivePermission.User, effectivePermission.AccessLevel);
143145
}

NGitLab.Mock/Project.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -154,13 +154,18 @@ public void Remove()
154154
Group.Projects.Remove(this);
155155
}
156156

157-
public EffectivePermissions GetEffectivePermissions()
157+
public EffectivePermissions GetEffectivePermissions() => GetEffectivePermissions(includeInheritedPermissions: true);
158+
159+
public EffectivePermissions GetEffectivePermissions(bool includeInheritedPermissions)
158160
{
159161
var result = new Dictionary<User, AccessLevel>();
160162

161-
foreach (var effectivePermission in Group.GetEffectivePermissions().Permissions)
163+
if (includeInheritedPermissions)
162164
{
163-
Add(effectivePermission.User, effectivePermission.AccessLevel);
165+
foreach (var effectivePermission in Group.GetEffectivePermissions(includeInheritedPermissions).Permissions)
166+
{
167+
Add(effectivePermission.User, effectivePermission.AccessLevel);
168+
}
164169
}
165170

166171
foreach (var permission in Permissions)
@@ -171,7 +176,7 @@ public EffectivePermissions GetEffectivePermissions()
171176
}
172177
else
173178
{
174-
foreach (var effectivePermission in permission.Group.GetEffectivePermissions().Permissions)
179+
foreach (var effectivePermission in permission.Group.GetEffectivePermissions(includeInheritedPermissions).Permissions)
175180
{
176181
Add(effectivePermission.User, effectivePermission.AccessLevel);
177182
}

NGitLab.Mock/PublicAPI.Unshipped.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,7 @@ NGitLab.Mock.Group.ExtraSharedRunnersLimit.get -> System.TimeSpan
435435
NGitLab.Mock.Group.ExtraSharedRunnersLimit.set -> void
436436
NGitLab.Mock.Group.FullName.get -> string
437437
NGitLab.Mock.Group.GetEffectivePermissions() -> NGitLab.Mock.EffectivePermissions
438+
NGitLab.Mock.Group.GetEffectivePermissions(bool includeInheritedPermissions) -> NGitLab.Mock.EffectivePermissions
438439
NGitLab.Mock.Group.Group() -> void
439440
NGitLab.Mock.Group.Group(NGitLab.Mock.User user) -> void
440441
NGitLab.Mock.Group.Group(string name) -> void
@@ -810,6 +811,7 @@ NGitLab.Mock.Project.ForkingAccessLevel.get -> NGitLab.Models.RepositoryAccessLe
810811
NGitLab.Mock.Project.ForkingAccessLevel.set -> void
811812
NGitLab.Mock.Project.FullName.get -> string
812813
NGitLab.Mock.Project.GetEffectivePermissions() -> NGitLab.Mock.EffectivePermissions
814+
NGitLab.Mock.Project.GetEffectivePermissions(bool includeInheritedPermissions) -> NGitLab.Mock.EffectivePermissions
813815
NGitLab.Mock.Project.Group.get -> NGitLab.Mock.Group
814816
NGitLab.Mock.Project.Hooks.get -> NGitLab.Mock.ProjectHookCollection
815817
NGitLab.Mock.Project.HttpUrl.get -> string

0 commit comments

Comments
 (0)