1- import { act } from 'react' ;
1+ import React , { act } from 'react' ;
22import { screen , waitFor } from '@testing-library/react' ;
33import userEvent from '@testing-library/user-event' ;
44import { renderWrapper } from '@src/setupTest' ;
5- import { useAssignTeamMembersRole , useValidateUsers } from '@src/authz-module/data/hooks' ;
5+ import { useAssignTeamMembersRole } from '@src/authz-module/data/hooks' ;
66import { ToastManagerProvider } from '@src/authz-module/libraries-manager/ToastManagerContext' ;
77import AddNewTeamMemberTrigger from './AddNewTeamMemberTrigger' ;
88
99jest . mock ( '@edx/frontend-platform/logging' ) ;
1010
1111const mockMutate = jest . fn ( ) ;
12- const mockMutateAsync = jest . fn ( ) ;
1312
1413// Mock the hooks module
1514jest . mock ( '@src/authz-module/data/hooks' , ( ) => ( {
1615 useAssignTeamMembersRole : jest . fn ( ) ,
17- useValidateUsers : jest . fn ( ) ,
1816} ) ) ;
1917
2018jest . mock ( './AddNewTeamMemberModal' , ( ) => {
@@ -56,17 +54,12 @@ describe('AddNewTeamMemberTrigger', () => {
5654
5755 beforeEach ( ( ) => {
5856 jest . clearAllMocks ( ) ;
59- mockMutateAsync . mockResolvedValue ( { validUsers : [ ] , invalidUsers : [ ] } ) ;
6057 ( useAssignTeamMembersRole as jest . Mock ) . mockReturnValue ( {
6158 mutate : mockMutate ,
6259 isPending : false ,
6360 isError : false ,
6461 isSuccess : false ,
6562 } as any ) ;
66- ( useValidateUsers as jest . Mock ) . mockReturnValue ( {
67- mutateAsync : mockMutateAsync ,
68- isPending : false ,
69- } as any ) ;
7063 } ) ;
7164
7265 it ( 'renders the trigger button' , ( ) => {
@@ -116,7 +109,7 @@ describe('AddNewTeamMemberTrigger', () => {
116109 await user . selectOptions ( roleSelect , 'editor' ) ;
117110 await user . click ( saveButton ) ;
118111
119- await waitFor ( ( ) => expect ( mockMutate ) . toHaveBeenCalledWith (
112+ expect ( mockMutate ) . toHaveBeenCalledWith (
120113 {
121114 data : {
122115@@ -127,7 +120,7 @@ describe('AddNewTeamMemberTrigger', () => {
127120 expect . objectContaining ( {
128121 onSuccess : expect . any ( Function ) ,
129122 } ) ,
130- ) ) ;
123+ ) ;
131124 } ) ;
132125
133126 it ( 'displays success toast and closes modal on successful addition with no errors' , async ( ) => {
@@ -137,14 +130,10 @@ describe('AddNewTeamMemberTrigger', () => {
137130 const triggerButton = screen . getByRole ( 'button' , { name : / a s s i g n r o l e / i } ) ;
138131 await user . click ( triggerButton ) ;
139132
140- const usersInput = screen . getByRole ( 'textbox' , { name : 'Enter user emails or usernames' } ) ;
141- await user . type ( usersInput , '[email protected] , [email protected] ' ) ; 142-
143133 const saveButton = screen . getByRole ( 'button' , { name : 'Save team member' } ) ;
144134 await user . click ( saveButton ) ;
145135
146- await waitFor ( ( ) => expect ( mockMutate ) . toHaveBeenCalled ( ) ) ;
147-
136+ // Simulate successful response with no errors
148137 const [ , { onSuccess } ] = mockMutate . mock . calls [ 0 ] ;
149138 onSuccess ( {
150139 completed : [
@@ -168,14 +157,10 @@ describe('AddNewTeamMemberTrigger', () => {
168157 const triggerButton = screen . getByRole ( 'button' , { name : / a s s i g n r o l e / i } ) ;
169158 await user . click ( triggerButton ) ;
170159
171- const usersInput = screen . getByRole ( 'textbox' , { name : 'Enter user emails or usernames' } ) ;
172- await user . type ( usersInput , '[email protected] , [email protected] ' ) ; 173-
174160 const saveButton = screen . getByRole ( 'button' , { name : 'Save team member' } ) ;
175161 await user . click ( saveButton ) ;
176162
177- await waitFor ( ( ) => expect ( mockMutate ) . toHaveBeenCalled ( ) ) ;
178-
163+ // Simulate partial success response
179164 const [ , { onSuccess } ] = mockMutate . mock . calls [ 0 ] ;
180165 onSuccess ( {
181166 completed : [
@@ -246,14 +231,10 @@ describe('AddNewTeamMemberTrigger', () => {
246231 const triggerButton = screen . getByRole ( 'button' , { name : / a s s i g n r o l e / i } ) ;
247232 await user . click ( triggerButton ) ;
248233
249- const usersInput = screen . getByRole ( 'textbox' , { name : 'Enter user emails or usernames' } ) ;
250- await user . type ( usersInput , '[email protected] , [email protected] ' ) ; 251-
252234 const saveButton = screen . getByRole ( 'button' , { name : 'Save team member' } ) ;
253235 await user . click ( saveButton ) ;
254236
255- await waitFor ( ( ) => expect ( mockMutate ) . toHaveBeenCalled ( ) ) ;
256-
237+ // Simulate all failed response
257238 const [ , { onSuccess } ] = mockMutate . mock . calls [ 0 ] ;
258239 onSuccess ( {
259240 completed : [ ] ,
@@ -278,14 +259,9 @@ describe('AddNewTeamMemberTrigger', () => {
278259 const triggerButton = screen . getByRole ( 'button' , { name : / a s s i g n r o l e / i } ) ;
279260 await user . click ( triggerButton ) ;
280261
281- const usersInput = screen . getByRole ( 'textbox' , { name : 'Enter user emails or usernames' } ) ;
282- await user . type ( usersInput , '[email protected] , [email protected] ' ) ; 283-
284262 const saveButton = screen . getByRole ( 'button' , { name : 'Save team member' } ) ;
285263 await user . click ( saveButton ) ;
286264
287- await waitFor ( ( ) => expect ( mockMutate ) . toHaveBeenCalled ( ) ) ;
288-
289265 const [ , { onSuccess } ] = mockMutate . mock . calls [ 0 ] ;
290266 onSuccess ( {
291267 completed : [ ] ,
@@ -318,8 +294,7 @@ describe('AddNewTeamMemberTrigger', () => {
318294 await user . selectOptions ( roleSelect , 'editor' ) ;
319295 await user . click ( saveButton ) ;
320296
321- await waitFor ( ( ) => expect ( mockMutate ) . toHaveBeenCalled ( ) ) ;
322-
297+ // Simulate successful response with no errors
323298 const [ , { onSuccess } ] = mockMutate . mock . calls [ 0 ] ;
324299 onSuccess ( {
325300 completed :
[ { userIdentifier :
'[email protected] ' , status :
'role_added' } ] , @@ -343,14 +318,10 @@ describe('AddNewTeamMemberTrigger', () => {
343318 const triggerButton = screen . getByRole ( 'button' , { name : / a s s i g n r o l e / i } ) ;
344319 await user . click ( triggerButton ) ;
345320
346- const usersInput = screen . getByRole ( 'textbox' , { name : 'Enter user emails or usernames' } ) ;
347- await user . type ( usersInput , '[email protected] ' ) ; 348-
349321 const saveButton = screen . getByRole ( 'button' , { name : 'Save team member' } ) ;
350322 await user . click ( saveButton ) ;
351323
352- await waitFor ( ( ) => expect ( mockMutate ) . toHaveBeenCalled ( ) ) ;
353-
324+ // Simulate successful response
354325 const [ , { onSuccess } ] = mockMutate . mock . calls [ 0 ] ;
355326 onSuccess ( {
356327 completed :
[ { userIdentifier :
'[email protected] ' , status :
'role_added' } ] , @@ -390,9 +361,6 @@ describe('AddNewTeamMemberTrigger', () => {
390361 const triggerButton = screen . getByRole ( 'button' , { name : / a s s i g n r o l e / i } ) ;
391362 await user . click ( triggerButton ) ;
392363
393- const usersInput = screen . getByRole ( 'textbox' , { name : 'Enter user emails or usernames' } ) ;
394- await user . type ( usersInput , '[email protected] ' ) ; 395-
396364 const saveButton = screen . getByRole ( 'button' , { name : 'Save team member' } ) ;
397365 await user . click ( saveButton ) ;
398366
@@ -416,38 +384,6 @@ describe('AddNewTeamMemberTrigger', () => {
416384 expect ( mockMutate ) . toHaveBeenCalledTimes ( 2 ) ;
417385 } ) ;
418386
419- it ( 'shows error toast and highlights invalid users when validation finds unknown users' , async ( ) => {
420- const user = userEvent . setup ( ) ;
421-
422- mockMutateAsync . mockResolvedValue ( { validUsers :
[ ] , invalidUsers :
[ '[email protected] ' ] } ) ; 423-
424- renderWrapper ( < ToastManagerProvider > < AddNewTeamMemberTrigger libraryId = { mockLibraryId } /> </ ToastManagerProvider > ) ;
425-
426- const triggerButton = screen . getByRole ( 'button' , { name : / a s s i g n r o l e / i } ) ;
427- await user . click ( triggerButton ) ;
428-
429- const usersInput = screen . getByRole ( 'textbox' , { name : 'Enter user emails or usernames' } ) ;
430- const roleSelect = screen . getByRole ( 'combobox' , { name : 'Select role' } ) ;
431- const saveButton = screen . getByRole ( 'button' , { name : 'Save team member' } ) ;
432-
433- await user . type ( usersInput , '[email protected] ' ) ; 434- await user . selectOptions ( roleSelect , 'editor' ) ;
435- await user . click ( saveButton ) ;
436-
437- await waitFor ( ( ) => {
438- expect ( screen . getByText ( / W e c o u l d n ' t f i n d a u s e r f o r 1 e m a i l a d d r e s s o r u s e r n a m e / ) ) . toBeInTheDocument ( ) ;
439- } ) ;
440-
441- // assignTeamMembersRole should NOT have been called
442- expect ( mockMutate ) . not . toHaveBeenCalled ( ) ;
443-
444- // Modal should remain open
445- expect ( screen . getByRole ( 'dialog' , { name : 'assign role' } ) ) . toBeInTheDocument ( ) ;
446-
447- // Input should be updated to show only invalid users
448- expect ( usersInput ) . toHaveValue ( '[email protected] ' ) ; 449- } ) ;
450-
451387 it ( 'displays loading state when adding team member' , async ( ) => {
452388 const user = userEvent . setup ( ) ;
453389
@@ -502,7 +438,7 @@ describe('AddNewTeamMemberTrigger', () => {
502438 expect ( loadingIndicator ) . toHaveTextContent ( 'Loading...' ) ;
503439 } ) ;
504440
505- await waitFor ( ( ) => expect ( mutateMock ) . toHaveBeenCalledWith (
441+ expect ( mutateMock ) . toHaveBeenCalledWith (
506442 {
507443 data : {
508444@@ -511,6 +447,6 @@ describe('AddNewTeamMemberTrigger', () => {
511447 } ,
512448 } ,
513449 expect . any ( Object ) ,
514- ) ) ;
450+ ) ;
515451 } ) ;
516452} ) ;
0 commit comments