@@ -687,6 +687,81 @@ describe('useRevokeUserRoles', () => {
687687 expect ( calledUrl . searchParams . get ( 'role' ) ) . toBe ( revokeRoleData . role ) ;
688688 expect ( calledUrl . searchParams . get ( 'scope' ) ) . toBe ( revokeRoleData . scope ) ;
689689 } ) ;
690+
691+ it ( 'invalidates userRoles queries on mutation completion' , async ( ) => {
692+ const mockResponse = {
693+ completed : [
694+ {
695+ userIdentifiers : 'jdoe' ,
696+ status : 'role_removed' ,
697+ } ,
698+ ] ,
699+ errors : [ ] ,
700+ } ;
701+
702+ ( getAuthenticatedHttpClient as jest . Mock ) . mockReturnValue ( {
703+ delete : jest . fn ( ) . mockResolvedValue ( { data : mockResponse } ) ,
704+ } ) ;
705+
706+ const queryClient = new QueryClient ( {
707+ defaultOptions : {
708+ queries : { retry : false } ,
709+ mutations : { retry : false } ,
710+ } ,
711+ } ) ;
712+
713+ const invalidateQueriesSpy = jest . spyOn ( queryClient , 'invalidateQueries' ) ;
714+
715+ const wrapper = ( { children } : { children : ReactNode } ) => (
716+ < QueryClientProvider client = { queryClient } >
717+ { children }
718+ </ QueryClientProvider >
719+ ) ;
720+
721+ const { result } = renderHook ( ( ) => useRevokeUserRoles ( ) , {
722+ wrapper,
723+ } ) ;
724+
725+ const revokeRoleData = {
726+ scope : 'lib:123' ,
727+ users : 'jdoe' ,
728+ role : 'author' ,
729+ } ;
730+
731+ await act ( async ( ) => {
732+ result . current . mutate ( { data : revokeRoleData } ) ;
733+ } ) ;
734+
735+ await waitFor ( ( ) => expect ( result . current . isSuccess ) . toBe ( true ) ) ;
736+
737+ expect ( invalidateQueriesSpy ) . toHaveBeenCalledWith ( {
738+ predicate : expect . any ( Function ) ,
739+ } ) ;
740+
741+ const userRolesCalls = invalidateQueriesSpy . mock . calls . filter ( call => {
742+ const filters = call [ 0 ] ;
743+ return filters && typeof ( filters as any ) . predicate === 'function' ;
744+ } ) ;
745+
746+ const userRolesCall = userRolesCalls . find ( call => {
747+ const filters = call [ 0 ] ;
748+ const predicate = filters && ( filters as any ) . predicate ;
749+ return typeof predicate === 'function' && predicate ( { queryKey : [ 'test-app' , 'authz' , 'userRoles' , 'testuser' ] } ) ;
750+ } ) ;
751+
752+ expect ( userRolesCall ) . toBeDefined ( ) ;
753+
754+ let predicate ;
755+ if ( userRolesCall ) {
756+ const filters = userRolesCall [ 0 ] ;
757+ predicate = filters && ( filters as any ) . predicate ;
758+ }
759+ expect ( typeof predicate ) . toBe ( 'function' ) ;
760+ expect ( predicate && predicate ( { queryKey : [ 'test-app' , 'authz' , 'userRoles' ] } ) ) . toBe ( true ) ;
761+ expect ( predicate && predicate ( { queryKey : [ 'test-app' , 'authz' , 'teamMembers' ] } ) ) . toBe ( false ) ;
762+
763+ invalidateQueriesSpy . mockRestore ( ) ;
764+ } ) ;
690765} ) ;
691766
692767describe ( 'useAllRoleAssignments' , ( ) => {
0 commit comments