@@ -620,6 +620,41 @@ def test_get_scopes_for_subject_and_permission(self, subject_name, action_name,
620620 for expected_scope in expected_scope_names :
621621 self .assertIn (expected_scope , actual_scope_names )
622622
623+ def test_get_scopes_for_subject_and_permission_no_duplicates (self ):
624+ """Test that get_scopes_for_subject_and_permission returns no duplicate scopes.
625+
626+ This test verifies that when a subject has multiple roles in the same scope
627+ that grant the same permission, the scope appears only once in the result.
628+
629+ Expected result:
630+ - Each scope appears exactly once in the returned list
631+ - No duplicate scopes even when multiple roles grant the same permission
632+ """
633+ test_scope = "lib:TestOrg:duplicate_test"
634+ test_subject = "test_user_duplicates"
635+
636+ assign_role_to_subject_in_scope (
637+ SubjectData (external_key = test_subject ),
638+ RoleData (external_key = roles .LIBRARY_ADMIN .external_key ),
639+ ScopeData (external_key = test_scope ),
640+ )
641+
642+ assign_role_to_subject_in_scope (
643+ SubjectData (external_key = test_subject ),
644+ RoleData (external_key = roles .LIBRARY_AUTHOR .external_key ),
645+ ScopeData (external_key = test_scope ),
646+ )
647+
648+ subject = SubjectData (external_key = test_subject )
649+ permission = PermissionData (action = ActionData (external_key = "view_library" ))
650+
651+ scopes = get_scopes_for_subject_and_permission (subject , permission )
652+ scope_external_keys = [scope .external_key for scope in scopes ]
653+
654+ self .assertEqual (len (scope_external_keys ), 1 )
655+ self .assertEqual (scope_external_keys [0 ], test_scope )
656+ self .assertEqual (len (scope_external_keys ), len (set (scope_external_keys )))
657+
623658 @ddt_data (
624659 (roles .LIBRARY_AUTHOR .external_key , "lib:Org4:art_101" , {"liam" }),
625660 (roles .LIBRARY_AUTHOR .external_key , "lib:Org4:art_201" , {"liam" }),
0 commit comments