@@ -21,20 +21,23 @@ jest.mock('./AddNewTeamMemberModal', () => {
2121 isOpen, close, onSave, isLoading, formValues, handleChangeForm,
2222 } ) => (
2323 isOpen ? (
24- < div data-testid = "add-team-member-modal" >
25- < button type = "button" onClick = { close } data-testid = "close-modal" > Close</ button >
26- < button type = "button" onClick = { onSave } data-testid = "save-modal" > Save</ button >
24+ < div data-testid = "add-team-member-modal" role = "dialog" aria-label = "Add New Team Member" >
25+ < button type = "button" onClick = { close } aria-label = "Close modal" data-testid = "close-modal" > Close</ button >
26+ < button type = "button" onClick = { onSave } aria-label = "Save team member" data-testid = "save-modal" > Save</ button >
2727 < textarea
2828 name = "users"
2929 value = { formValues ?. users || '' }
3030 onChange = { handleChangeForm }
3131 data-testid = "users-input"
32+ aria-label = "Enter user emails or usernames"
33+ placeholder = "Enter emails or usernames"
3234 />
3335 < select
3436 name = "role"
3537 value = { formValues ?. role || '' }
3638 onChange = { handleChangeForm }
3739 data-testid = "role-select"
40+ aria-label = "Select role"
3841 >
3942 < option value = "" > Select role</ option >
4043 < option value = "admin" > Admin</ option >
@@ -146,7 +149,7 @@ describe('AddNewTeamMemberTrigger', () => {
146149 expect ( screen . queryByTestId ( 'add-team-member-modal' ) ) . not . toBeInTheDocument ( ) ;
147150 } ) ;
148151
149- expect ( screen . getByText ( ' 2 team members added successfully.' ) ) . toBeInTheDocument ( ) ;
152+ expect ( screen . getByText ( / 2 t e a m m e m b e r s a d d e d s u c c e s s f u l l y / ) ) . toBeInTheDocument ( ) ;
150153 } ) ;
151154
152155 it ( 'displays mixed success and error toast on partial success' , async ( ) => {
@@ -179,6 +182,50 @@ describe('AddNewTeamMemberTrigger', () => {
179182 expect ( screen . getByTestId ( 'add-team-member-modal' ) ) . toBeInTheDocument ( ) ;
180183 } ) ;
181184
185+ it ( 'filters out successfully added users from error users list' , async ( ) => {
186+ const user = userEvent . setup ( ) ;
187+
188+ const mockPartialResponse = {
189+ completed : [
190+ { userIdentifier :
'[email protected] ' } , 191+ ] ,
192+ errors : [
193+ { userIdentifier :
'[email protected] ' , error :
'USER_NOT_FOUND' } , 194+ { userIdentifier :
'[email protected] ' , error :
'USER_NOT_FOUND' } , 195+ ] ,
196+ } ;
197+
198+ ( useAssignTeamMembersRole as jest . Mock ) . mockReturnValue ( {
199+ mutate : jest . fn ( ( _variables , { onSuccess } ) => {
200+ onSuccess ( mockPartialResponse ) ;
201+ } ) ,
202+ isPending : false ,
203+ } ) ;
204+
205+ renderWrapper ( < ToastManagerProvider > < AddNewTeamMemberTrigger libraryId = { mockLibraryId } /> </ ToastManagerProvider > ) ;
206+
207+ const triggerButton = screen . getByRole ( 'button' , { name : / a d d n e w t e a m m e m b e r / i } ) ;
208+ await user . click ( triggerButton ) ;
209+
210+ const usersInput = screen . getByRole ( 'textbox' , { name : / E n t e r u s e r e m a i l s o r u s e r n a m e s / i } ) ;
211+ const roleSelect = screen . getByRole ( 'combobox' , { name : / S e l e c t r o l e / i } ) ;
212+ const saveButton = screen . getByRole ( 'button' , { name : 'Save team member' } ) ;
213+
214+ 215+ await user . selectOptions ( roleSelect , 'editor' ) ;
216+ await user . click ( saveButton ) ;
217+
218+ await waitFor ( ( ) => {
219+ expect ( usersInput ) . toHaveValue ( '[email protected] , [email protected] ' ) ; 220+ } ) ;
221+
222+ await user . type ( usersInput , ', [email protected] ' ) ; 223+
224+ await waitFor ( ( ) => {
225+ 226+ } ) ;
227+ } ) ;
228+
182229 it ( 'displays only error toast when all additions fail' , async ( ) => {
183230 const user = userEvent . setup ( ) ;
184231 renderWrapper ( < ToastManagerProvider > < AddNewTeamMemberTrigger libraryId = { mockLibraryId } /> </ ToastManagerProvider > ) ;
@@ -207,6 +254,33 @@ describe('AddNewTeamMemberTrigger', () => {
207254 expect ( screen . getByTestId ( 'add-team-member-modal' ) ) . toBeInTheDocument ( ) ;
208255 } ) ;
209256
257+ it ( 'displays different error toast when different errors happen' , async ( ) => {
258+ const user = userEvent . setup ( ) ;
259+ renderWrapper ( < ToastManagerProvider > < AddNewTeamMemberTrigger libraryId = { mockLibraryId } /> </ ToastManagerProvider > ) ;
260+
261+ const triggerButton = screen . getByRole ( 'button' , { name : / a d d n e w t e a m m e m b e r / i } ) ;
262+ await user . click ( triggerButton ) ;
263+
264+ const saveButton = screen . getByRole ( 'button' , { name : 'Save team member' } ) ;
265+ await user . click ( saveButton ) ;
266+
267+ const [ , { onSuccess } ] = mockMutate . mock . calls [ 0 ] ;
268+ onSuccess ( {
269+ completed : [ ] ,
270+ errors : [
271+ { userIdentifier :
'[email protected] ' , error :
'user_not_found' } , 272+ { userIdentifier :
'[email protected] ' , error :
'user_already_has_role' } , 273+ ] ,
274+ } ) ;
275+
276+ await waitFor ( ( ) => {
277+ 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 ( ) ;
278+ expect ( screen . getByText ( / T h e u s e r a l r e a d y h a s t h e r o l e / ) ) . toBeInTheDocument ( ) ;
279+ } ) ;
280+
281+ expect ( screen . getByRole ( 'dialog' , { name : 'Add New Team Member' } ) ) . toBeInTheDocument ( ) ;
282+ } ) ;
283+
210284 it ( 'resets form values after successful addition with no errors' , async ( ) => {
211285 const user = userEvent . setup ( ) ;
212286 renderWrapper ( < ToastManagerProvider > < AddNewTeamMemberTrigger libraryId = { mockLibraryId } /> </ ToastManagerProvider > ) ;
@@ -258,7 +332,7 @@ describe('AddNewTeamMemberTrigger', () => {
258332
259333 // Toast should be visible
260334 await waitFor ( ( ) => {
261- expect ( screen . getByText ( ' 1 team member added successfully.' ) ) . toBeInTheDocument ( ) ;
335+ expect ( screen . getByText ( / 1 t e a m m e m b e r a d d e d s u c c e s s f u l l y / ) ) . toBeInTheDocument ( ) ;
262336 } ) ;
263337
264338 // Find and close the toast
0 commit comments