@@ -100,6 +100,11 @@ def test_user_group_color_values(self):
100
100
101
101
class TestUserGroup :
102
102
def setup_method (self ):
103
+ # Reset the global roles cache before each test
104
+ import labelbox .schema .role as role_module
105
+
106
+ role_module ._ROLES = None
107
+
103
108
self .client = MagicMock (Client )
104
109
self .client .get_roles .return_value = {
105
110
"LABELER" : Role (self .client , {"id" : "role_id" , "name" : "LABELER" }),
@@ -167,26 +172,36 @@ def test_get(self):
167
172
"orgRole" : {"id" : "role_id_2" , "name" : "LABELER" },
168
173
},
169
174
]
170
- self .client .execute .return_value = {
171
- "userGroupV2" : {
172
- "id" : "group_id" ,
173
- "name" : "Test Group" ,
174
- "color" : "4ED2F9" ,
175
- "description" : "" ,
176
- "projects" : {
177
- "nodes" : projects ,
178
- "totalCount" : 2 ,
179
- },
180
- "members" : {
181
- "nodes" : group_members ,
182
- "totalCount" : 2 ,
183
- "userGroupRoles" : [
184
- {"userId" : "user_id_1" , "roleId" : "role_id_1" },
185
- {"userId" : "user_id_2" , "roleId" : "role_id_2" },
186
- ],
187
- },
188
- }
189
- }
175
+ self .client .execute .side_effect = [
176
+ # Mock userGroupV2 query response first (get() executes this first)
177
+ {
178
+ "userGroupV2" : {
179
+ "id" : "group_id" ,
180
+ "name" : "Test Group" ,
181
+ "color" : "4ED2F9" ,
182
+ "description" : "" ,
183
+ "projects" : {
184
+ "nodes" : projects ,
185
+ "totalCount" : 2 ,
186
+ },
187
+ "members" : {
188
+ "nodes" : group_members ,
189
+ "totalCount" : 2 ,
190
+ "userGroupRoles" : [
191
+ {"userId" : "user_id_1" , "roleId" : "role_id_1" },
192
+ {"userId" : "user_id_2" , "roleId" : "role_id_2" },
193
+ ],
194
+ },
195
+ }
196
+ },
197
+ # Mock get_roles query response second (_get_members_set calls this)
198
+ {
199
+ "roles" : [
200
+ {"id" : "role_id_1" , "name" : "LABELER" },
201
+ {"id" : "role_id_2" , "name" : "REVIEWER" },
202
+ ]
203
+ },
204
+ ]
190
205
group = UserGroup (self .client )
191
206
assert group .id == ""
192
207
assert group .name == ""
@@ -244,7 +259,7 @@ def test_update(self, group_user, group_project, mock_role):
244
259
}
245
260
}
246
261
},
247
- # Mock get query response after update
262
+ # Mock get query response after update (get() executes userGroupV2 first)
248
263
{
249
264
"userGroupV2" : {
250
265
"id" : "group_id" ,
@@ -270,6 +285,12 @@ def test_update(self, group_user, group_project, mock_role):
270
285
},
271
286
}
272
287
},
288
+ # Mock get_roles query response (called by _get_members_set)
289
+ {
290
+ "roles" : [
291
+ {"id" : "role_id" , "name" : "LABELER" },
292
+ ]
293
+ },
273
294
]
274
295
275
296
group .update ()
@@ -297,7 +318,7 @@ def test_update_without_members_should_work(self, group_project):
297
318
}
298
319
}
299
320
},
300
- # Mock get query response
321
+ # Mock get query response (get() executes userGroupV2 first)
301
322
{
302
323
"userGroupV2" : {
303
324
"id" : "group_id" ,
@@ -315,6 +336,8 @@ def test_update_without_members_should_work(self, group_project):
315
336
},
316
337
}
317
338
},
339
+ # Mock get_roles query response (even though no members, _get_members_set is still called)
340
+ {"roles" : []},
318
341
]
319
342
320
343
group .update ()
@@ -356,42 +379,51 @@ def test_user_groups_empty(self):
356
379
assert len (user_groups ) == 0
357
380
358
381
def test_user_groups (self ):
359
- self .client .execute .return_value = {
360
- "userGroupsV2" : {
361
- "totalCount" : 2 ,
362
- "nextCursor" : None ,
363
- "nodes" : [
364
- {
365
- "id" : "group_id_1" ,
366
- "name" : "Group 1" ,
367
- "color" : "9EC5FF" ,
368
- "description" : "" ,
369
- "projects" : {
370
- "nodes" : [],
371
- "totalCount" : 0 ,
372
- },
373
- "members" : {
374
- "nodes" : [],
375
- "totalCount" : 0 ,
376
- },
377
- },
378
- {
379
- "id" : "group_id_2" ,
380
- "name" : "Group 2" ,
381
- "color" : "CEB8FF" ,
382
- "description" : "" ,
383
- "projects" : {
384
- "nodes" : [],
385
- "totalCount" : 0 ,
382
+ # Mock get_user_groups and get_roles responses
383
+ # The order is: userGroupsV2 query first, then get_roles when processing groups
384
+ self .client .execute .side_effect = [
385
+ # get_user_groups query (first)
386
+ {
387
+ "userGroupsV2" : {
388
+ "totalCount" : 2 ,
389
+ "nextCursor" : None ,
390
+ "nodes" : [
391
+ {
392
+ "id" : "group_id_1" ,
393
+ "name" : "Group 1" ,
394
+ "color" : "9EC5FF" ,
395
+ "description" : "" ,
396
+ "projects" : {
397
+ "nodes" : [],
398
+ "totalCount" : 0 ,
399
+ },
400
+ "members" : {
401
+ "nodes" : [],
402
+ "totalCount" : 0 ,
403
+ "userGroupRoles" : [],
404
+ },
386
405
},
387
- "members" : {
388
- "nodes" : [],
389
- "totalCount" : 0 ,
406
+ {
407
+ "id" : "group_id_2" ,
408
+ "name" : "Group 2" ,
409
+ "color" : "CEB8FF" ,
410
+ "description" : "" ,
411
+ "projects" : {
412
+ "nodes" : [],
413
+ "totalCount" : 0 ,
414
+ },
415
+ "members" : {
416
+ "nodes" : [],
417
+ "totalCount" : 0 ,
418
+ "userGroupRoles" : [],
419
+ },
390
420
},
391
- },
392
- ],
393
- }
394
- }
421
+ ],
422
+ }
423
+ },
424
+ # get_roles query (called when processing first group, then cached)
425
+ {"roles" : []},
426
+ ]
395
427
user_groups = list (UserGroup .get_user_groups (self .client ))
396
428
assert len (user_groups ) == 2
397
429
assert user_groups [0 ].name == "Group 1"
@@ -448,7 +480,7 @@ def test_create(self, group_user, group_project, mock_role):
448
480
}
449
481
}
450
482
},
451
- # Mock get query response after create
483
+ # Mock get query response after create (get() executes userGroupV2 first)
452
484
{
453
485
"userGroupV2" : {
454
486
"id" : "group_id" ,
@@ -474,6 +506,12 @@ def test_create(self, group_user, group_project, mock_role):
474
506
},
475
507
}
476
508
},
509
+ # Mock get_roles query response (called by _get_members_set)
510
+ {
511
+ "roles" : [
512
+ {"id" : "role_id" , "name" : "LABELER" },
513
+ ]
514
+ },
477
515
]
478
516
479
517
group .create ()
@@ -501,7 +539,7 @@ def test_create_without_members_should_work(self, group_project):
501
539
}
502
540
}
503
541
},
504
- # Mock get query response
542
+ # Mock get query response (get() executes userGroupV2 first)
505
543
{
506
544
"userGroupV2" : {
507
545
"id" : "group_id" ,
@@ -519,6 +557,8 @@ def test_create_without_members_should_work(self, group_project):
519
557
},
520
558
}
521
559
},
560
+ # Mock get_roles query response (even though no members, _get_members_set is still called)
561
+ {"roles" : []},
522
562
]
523
563
524
564
group .create ()
@@ -588,7 +628,7 @@ def test_create_mutation():
588
628
}
589
629
}
590
630
},
591
- # Second call: get query
631
+ # Second call: get query (get() executes userGroupV2 first)
592
632
{
593
633
"userGroupV2" : {
594
634
"id" : "group_id" ,
@@ -599,6 +639,8 @@ def test_create_mutation():
599
639
"members" : {"nodes" : [], "totalCount" : 0 , "userGroupRoles" : []},
600
640
}
601
641
},
642
+ # Third call: get_roles query (called by _get_members_set)
643
+ {"roles" : []},
602
644
]
603
645
604
646
group .create ()
@@ -646,7 +688,7 @@ def test_update_mutation():
646
688
}
647
689
}
648
690
},
649
- # Second call: get query
691
+ # Second call: get query (get() executes userGroupV2 first)
650
692
{
651
693
"userGroupV2" : {
652
694
"id" : "group_id" ,
@@ -657,6 +699,8 @@ def test_update_mutation():
657
699
"members" : {"nodes" : [], "totalCount" : 0 , "userGroupRoles" : []},
658
700
}
659
701
},
702
+ # Third call: get_roles query (called by _get_members_set)
703
+ {"roles" : []},
660
704
]
661
705
662
706
group .update ()
0 commit comments