11// Copyright (C) 2022-2025 Intel Corporation
22// LIMITED EDGE SOFTWARE DISTRIBUTION LICENSE
33
4- import { ReactNode } from 'react' ;
5-
6- import { QueryClient , QueryClientProvider } from '@tanstack/react-query' ;
7- import { renderHook , waitFor } from '@testing-library/react' ;
4+ import { act , waitFor } from '@testing-library/react' ;
85
96import { getMockedUser } from '../../../../../src/test-utils/mocked-items-factory/mocked-users' ;
10- import { ApplicationServicesProvider } from '../../services/application-services-provider.component ' ;
7+ import { renderHookWithProviders } from '../../../../../src/test-utils/render-hook-with-providers ' ;
118import { createInMemoryUsersService } from '../services/in-memory-users-service' ;
9+ import { getRoleCreationPayload , getRoleDeletionPayload } from '../services/utils' ;
10+ import { RESOURCE_TYPE , USER_ROLE } from '../users.interface' ;
1211import { useActiveUser , useUsers } from './use-users.hook' ;
1312
1413jest . mock ( 'react-router-dom' , ( ) => ( {
1514 ...jest . requireActual ( 'react-router-dom' ) ,
1615 useParams : ( ) => ( { workspaceId : 'workspace-id' , projectId : 'project-id' , organizationId : 'organization-123' } ) ,
1716} ) ) ;
1817
19- const queryClient = new QueryClient ( {
20- defaultOptions : {
21- queries : {
22- retry : false , // Disable query retries (default is 3)
23- } ,
24- } ,
25- } ) ;
26-
2718const mockedUser = getMockedUser ( ) ;
28- const mockedUsersService = createInMemoryUsersService ( ) ;
19+ let mockedUsersService = createInMemoryUsersService ( ) ;
2920mockedUsersService . getUser = jest . fn ( async ( ) => mockedUser ) ;
21+ mockedUsersService . updateRoles = jest . fn ( mockedUsersService . updateRoles ) ;
22+ mockedUsersService . updateMemberRole = jest . fn ( mockedUsersService . updateMemberRole ) ;
3023
31- const wrapper = ( { children } : { children ?: ReactNode } ) => {
32- return (
33- < QueryClientProvider client = { queryClient } >
34- < ApplicationServicesProvider usersService = { mockedUsersService } useInMemoryEnvironment >
35- { children }
36- </ ApplicationServicesProvider >
37- </ QueryClientProvider >
38- ) ;
39- } ;
24+ const getProviderProps = ( featureFlags ?: Record < string , boolean > ) => ( {
25+ usersService : mockedUsersService ,
26+ useInMemoryEnvironment : true as const ,
27+ featureFlags,
28+ } ) ;
4029
4130describe ( 'useUsers' , ( ) => {
31+ beforeEach ( ( ) => {
32+ mockedUsersService = createInMemoryUsersService ( ) ;
33+ mockedUsersService . getUser = jest . fn ( async ( ) => mockedUser ) ;
34+ const originalUpdateRoles = mockedUsersService . updateRoles ;
35+ mockedUsersService . updateRoles = jest . fn ( originalUpdateRoles ) ;
36+ const originalUpdateMemberRole = mockedUsersService . updateMemberRole ;
37+ mockedUsersService . updateMemberRole = jest . fn ( originalUpdateMemberRole ) ;
38+ } ) ;
39+
4240 afterEach ( ( ) => {
4341 jest . clearAllMocks ( ) ;
4442 } ) ;
4543
4644 it ( 'gets activeUser' , async ( ) => {
47- const { result } = renderHook ( ( ) => useActiveUser ( 'organization-id' ) , { wrapper } ) ;
45+ const { result } = renderHookWithProviders ( ( ) => useActiveUser ( 'organization-id' ) , {
46+ providerProps : getProviderProps ( ) ,
47+ } ) ;
4848
4949 await waitFor ( ( ) => {
5050 expect ( result . current ) . not . toBeNull ( ) ;
@@ -56,26 +56,83 @@ describe('useUsers', () => {
5656 } ) ;
5757
5858 it ( 'query is not executed if the user id is "undefined"' , async ( ) => {
59- const { result } = renderHook ( ( ) => useUsers ( ) , { wrapper } ) ;
60-
61- renderHook ( ( ) => result . current . useGetUserQuery ( 'organization-id' , undefined ) , {
62- wrapper,
59+ renderHookWithProviders ( ( ) => useUsers ( ) . useGetUserQuery ( 'organization-id' , undefined ) , {
60+ providerProps : getProviderProps ( ) ,
6361 } ) ;
6462
6563 expect ( mockedUsersService . getUser ) . not . toHaveBeenCalled ( ) ;
6664 } ) ;
6765
6866 it ( 'query is not executed if the user id is invalid' , async ( ) => {
69- const { result } = renderHook ( ( ) => useUsers ( ) , { wrapper } ) ;
67+ renderHookWithProviders ( ( ) => useUsers ( ) . useGetUserQuery ( 'organization-id' , '[email protected] ' ) , { 68+ providerProps : getProviderProps ( ) ,
69+ } ) ;
70+
71+ expect ( mockedUsersService . getUser ) . not . toHaveBeenCalled ( ) ;
72+ } ) ;
73+
74+ it ( 'updates member role when feature flag is enabled' , async ( ) => {
75+ const { result } = renderHookWithProviders ( ( ) => useUsers ( ) . useUpdateRole ( ) , {
76+ providerProps : getProviderProps ( { FEATURE_FLAG_MANAGE_USERS_ROLES : true } ) ,
77+ } ) ;
7078
7179 await waitFor ( ( ) => {
7280 expect ( result . current ) . not . toBeNull ( ) ;
7381 } ) ;
7482
75- renderHook ( ( ) => result . current . useGetUserQuery ( 'organization-id' , '[email protected] ' ) , { 76- wrapper,
83+ await act ( async ( ) => {
84+ await result . current . mutateAsync ( {
85+ organizationId : 'organization-id' ,
86+ userId : 'user-id' ,
87+ resourceId : 'organization-id' ,
88+ resourceType : RESOURCE_TYPE . ORGANIZATION ,
89+ newRole : USER_ROLE . ORGANIZATION_CONTRIBUTOR ,
90+ } ) ;
7791 } ) ;
7892
79- expect ( mockedUsersService . getUser ) . not . toHaveBeenCalled ( ) ;
93+ expect ( mockedUsersService . updateMemberRole ) . toHaveBeenCalledTimes ( 1 ) ;
94+ expect ( mockedUsersService . updateMemberRole ) . toHaveBeenCalledWith ( 'organization-id' , 'user-id' , {
95+ role : USER_ROLE . ORGANIZATION_CONTRIBUTOR ,
96+ resourceId : 'organization-id' ,
97+ } ) ;
98+ expect ( mockedUsersService . updateRoles ) . not . toHaveBeenCalled ( ) ;
99+ } ) ;
100+
101+ it ( 'updates roles when feature flag is disabled' , async ( ) => {
102+ const { result } = renderHookWithProviders ( ( ) => useUsers ( ) . useUpdateRole ( ) , {
103+ providerProps : getProviderProps ( { FEATURE_FLAG_MANAGE_USERS_ROLES : false } ) ,
104+ } ) ;
105+
106+ const payload = {
107+ organizationId : 'organization-id' ,
108+ userId : 'user-id' ,
109+ resourceId : 'organization-id' ,
110+ resourceType : RESOURCE_TYPE . ORGANIZATION ,
111+ newRole : USER_ROLE . ORGANIZATION_CONTRIBUTOR ,
112+ previousRole : USER_ROLE . ORGANIZATION_ADMIN ,
113+ } as const ;
114+
115+ await waitFor ( ( ) => {
116+ expect ( result . current ) . not . toBeNull ( ) ;
117+ } ) ;
118+
119+ await act ( async ( ) => {
120+ await result . current . mutateAsync ( payload ) ;
121+ } ) ;
122+
123+ expect ( mockedUsersService . updateRoles ) . toHaveBeenCalledTimes ( 1 ) ;
124+ expect ( mockedUsersService . updateRoles ) . toHaveBeenCalledWith ( 'organization-id' , 'user-id' , [
125+ getRoleDeletionPayload ( {
126+ role : payload . previousRole ,
127+ resourceId : payload . resourceId ,
128+ resourceType : payload . resourceType ,
129+ } ) ,
130+ getRoleCreationPayload ( {
131+ role : payload . newRole ,
132+ resourceId : payload . resourceId ,
133+ resourceType : payload . resourceType ,
134+ } ) ,
135+ ] ) ;
136+ expect ( mockedUsersService . updateMemberRole ) . not . toHaveBeenCalled ( ) ;
80137 } ) ;
81138} ) ;
0 commit comments