|
4 | 4 | package organization_test |
5 | 5 |
|
6 | 6 | import ( |
| 7 | + "slices" |
7 | 8 | "sort" |
8 | 9 | "testing" |
9 | 10 |
|
@@ -181,6 +182,75 @@ func TestIsPublicMembership(t *testing.T) { |
181 | 182 | test(unittest.NonexistentID, unittest.NonexistentID, false) |
182 | 183 | } |
183 | 184 |
|
| 185 | +func TestRestrictedUserOrgMembers(t *testing.T) { |
| 186 | + assert.NoError(t, unittest.PrepareTestDatabase()) |
| 187 | + |
| 188 | + restrictedUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ |
| 189 | + ID: 29, |
| 190 | + IsRestricted: true, |
| 191 | + }) |
| 192 | + if !assert.True(t, restrictedUser.IsRestricted) { |
| 193 | + return // ensure fixtures return restricted user |
| 194 | + } |
| 195 | + |
| 196 | + testCases := []struct { |
| 197 | + name string |
| 198 | + opts *organization.FindOrgMembersOpts |
| 199 | + expectedUIDs []int64 |
| 200 | + }{ |
| 201 | + { |
| 202 | + name: "restricted user sees public members and teammates", |
| 203 | + opts: &organization.FindOrgMembersOpts{ |
| 204 | + OrgID: 17, // org17 where user29 is in team9 |
| 205 | + Doer: restrictedUser, |
| 206 | + IsDoerMember: true, |
| 207 | + }, |
| 208 | + expectedUIDs: []int64{2, 15, 20, 29}, // Public members (2) + teammates in team9 (15, 20, 29) |
| 209 | + }, |
| 210 | + { |
| 211 | + name: "restricted user sees only public members when not member", |
| 212 | + opts: &organization.FindOrgMembersOpts{ |
| 213 | + OrgID: 3, // org3 where user29 is not a member |
| 214 | + Doer: restrictedUser, |
| 215 | + }, |
| 216 | + expectedUIDs: []int64{2, 28}, // Only public members |
| 217 | + }, |
| 218 | + { |
| 219 | + name: "non logged in only shows public members", |
| 220 | + opts: &organization.FindOrgMembersOpts{ |
| 221 | + OrgID: 3, |
| 222 | + }, |
| 223 | + expectedUIDs: []int64{2, 28}, // Only public members |
| 224 | + }, |
| 225 | + { |
| 226 | + name: "non restricted user sees all members", |
| 227 | + opts: &organization.FindOrgMembersOpts{ |
| 228 | + OrgID: 17, |
| 229 | + Doer: unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 15}), |
| 230 | + IsDoerMember: true, |
| 231 | + }, |
| 232 | + expectedUIDs: []int64{2, 15, 18, 20, 29}, // All members |
| 233 | + }, |
| 234 | + } |
| 235 | + |
| 236 | + for _, tc := range testCases { |
| 237 | + t.Run(tc.name, func(t *testing.T) { |
| 238 | + count, err := organization.CountOrgMembers(db.DefaultContext, tc.opts) |
| 239 | + assert.NoError(t, err) |
| 240 | + assert.EqualValues(t, len(tc.expectedUIDs), count) |
| 241 | + |
| 242 | + members, err := organization.GetOrgUsersByOrgID(db.DefaultContext, tc.opts) |
| 243 | + assert.NoError(t, err) |
| 244 | + memberUIDs := make([]int64, 0, len(members)) |
| 245 | + for _, member := range members { |
| 246 | + memberUIDs = append(memberUIDs, member.UID) |
| 247 | + } |
| 248 | + slices.Sort(memberUIDs) |
| 249 | + assert.EqualValues(t, tc.expectedUIDs, memberUIDs) |
| 250 | + }) |
| 251 | + } |
| 252 | +} |
| 253 | + |
184 | 254 | func TestFindOrgs(t *testing.T) { |
185 | 255 | assert.NoError(t, unittest.PrepareTestDatabase()) |
186 | 256 |
|
|
0 commit comments