| 
4 | 4 | package organization_test  | 
5 | 5 | 
 
  | 
6 | 6 | import (  | 
 | 7 | +	"slices"  | 
7 | 8 | 	"sort"  | 
8 | 9 | 	"testing"  | 
9 | 10 | 
 
  | 
@@ -181,6 +182,82 @@ 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 | +		expectedLen  int  | 
 | 201 | +	}{  | 
 | 202 | +		{  | 
 | 203 | +			name: "restricted user sees public members and teammates",  | 
 | 204 | +			opts: &organization.FindOrgMembersOpts{  | 
 | 205 | +				OrgID:        17, // org17 where user29 is in team9  | 
 | 206 | +				Doer:         restrictedUser,  | 
 | 207 | +				IsDoerMember: true,  | 
 | 208 | +			},  | 
 | 209 | +			expectedUIDs: []int64{2, 15, 29}, // Public members (2) + teammates in team9 (15, 20, 29)  | 
 | 210 | +			expectedLen:  3,  | 
 | 211 | +		},  | 
 | 212 | +		{  | 
 | 213 | +			name: "restricted user sees only public members when not member",  | 
 | 214 | +			opts: &organization.FindOrgMembersOpts{  | 
 | 215 | +				OrgID: 3, // org3 where user29 is not a member  | 
 | 216 | +				Doer:  restrictedUser,  | 
 | 217 | +			},  | 
 | 218 | +			expectedUIDs: []int64{2, 28}, // Only public members  | 
 | 219 | +			expectedLen:  2,  | 
 | 220 | +		},  | 
 | 221 | +		{  | 
 | 222 | +			name: "non logged in only shows public members",  | 
 | 223 | +			opts: &organization.FindOrgMembersOpts{  | 
 | 224 | +				OrgID: 3,  | 
 | 225 | +			},  | 
 | 226 | +			expectedUIDs: []int64{2, 28}, // Only public members  | 
 | 227 | +			expectedLen:  2,  | 
 | 228 | +		},  | 
 | 229 | +		{  | 
 | 230 | +			name: "non restricted user sees all members",  | 
 | 231 | +			opts: &organization.FindOrgMembersOpts{  | 
 | 232 | +				OrgID:        17,  | 
 | 233 | +				Doer:         unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 15}),  | 
 | 234 | +				IsDoerMember: true,  | 
 | 235 | +			},  | 
 | 236 | +			expectedUIDs: []int64{2, 15, 18, 29}, // All members  | 
 | 237 | +			expectedLen:  3,  | 
 | 238 | +		},  | 
 | 239 | +	}  | 
 | 240 | + | 
 | 241 | +	for _, tc := range testCases {  | 
 | 242 | +		t.Run(tc.name, func(t *testing.T) {  | 
 | 243 | +			count, err := organization.CountOrgMembers(db.DefaultContext, tc.opts)  | 
 | 244 | +			assert.NoError(t, err)  | 
 | 245 | +			assert.Equal(t, int64(tc.expectedLen), count)  | 
 | 246 | + | 
 | 247 | +			members, err := organization.GetOrgUsersByOrgID(db.DefaultContext, tc.opts)  | 
 | 248 | +			assert.NoError(t, err)  | 
 | 249 | +			assert.Len(t, members, tc.expectedLen)  | 
 | 250 | + | 
 | 251 | +			memberUIDs := make([]int64, 0, len(members))  | 
 | 252 | +			for _, member := range members {  | 
 | 253 | +				memberUIDs = append(memberUIDs, member.UID)  | 
 | 254 | +			}  | 
 | 255 | +			slices.Sort(memberUIDs)  | 
 | 256 | +			assert.EqualValues(t, tc.expectedUIDs, memberUIDs)  | 
 | 257 | +		})  | 
 | 258 | +	}  | 
 | 259 | +}  | 
 | 260 | + | 
184 | 261 | func TestFindOrgs(t *testing.T) {  | 
185 | 262 | 	assert.NoError(t, unittest.PrepareTestDatabase())  | 
186 | 263 | 
 
  | 
 | 
0 commit comments