@@ -37,8 +37,9 @@ jest.mock('@openedx/paragon', () => {
3737jest . mock ( './SelectUsersAndRoleStep' , ( ) => ( {
3838 __esModule : true ,
3939 default : ( {
40- setUsers, setSelectedRole, invalidUsers, validationError,
40+ users , setUsers, setSelectedRole, invalidUsers, validationError,
4141 } : {
42+ users : string ;
4243 setUsers : ( v : string ) => void ;
4344 setSelectedRole : ( v : string ) => void ;
4445 invalidUsers : string [ ] ;
@@ -47,6 +48,7 @@ jest.mock('./SelectUsersAndRoleStep', () => ({
4748 < div >
4849 < input
4950 data-testid = "users-input"
51+ value = { users }
5052 onChange = { ( e ) => setUsers ( e . target . value ) }
5153 />
5254 < button type = "button" data-testid = "select-role" onClick = { ( ) => setSelectedRole ( 'library_admin' ) } >
@@ -250,11 +252,14 @@ describe('AssignRoleWizard', () => {
250252
251253 it ( 'calls assignRole for each scope on Save' , async ( ) => {
252254 const user = userEvent . setup ( ) ;
255+ mockValidateMutateAsync . mockResolvedValue ( { invalidUsers : [ ] , validUsers : [ 'alice' ] } ) ;
253256 mockAssignMutateAsync . mockResolvedValue ( { completed : [ ] , errors : [ ] } ) ;
254257
255258 renderWizard ( ) ;
256259 await user . type ( screen . getByTestId ( 'users-input' ) , 'alice' ) ;
257260 await user . click ( screen . getByTestId ( 'select-role' ) ) ;
261+ await user . click ( screen . getByRole ( 'button' , { name : / N e x t / i } ) ) ;
262+ await waitFor ( ( ) => expect ( mockValidateMutateAsync ) . toHaveBeenCalled ( ) ) ;
258263 await user . click ( screen . getByTestId ( 'toggle-scope' ) ) ;
259264 await user . click ( screen . getByRole ( 'button' , { name : / S a v e / i } ) ) ;
260265
@@ -268,11 +273,14 @@ describe('AssignRoleWizard', () => {
268273 it ( 'shows success toast and calls onClose after successful save' , async ( ) => {
269274 const user = userEvent . setup ( ) ;
270275 const onClose = jest . fn ( ) ;
276+ mockValidateMutateAsync . mockResolvedValue ( { invalidUsers : [ ] , validUsers : [ 'alice' ] } ) ;
271277 mockAssignMutateAsync . mockResolvedValue ( { completed : [ ] , errors : [ ] } ) ;
272278
273279 renderWizard ( { onClose } ) ;
274280 await user . type ( screen . getByTestId ( 'users-input' ) , 'alice' ) ;
275281 await user . click ( screen . getByTestId ( 'select-role' ) ) ;
282+ await user . click ( screen . getByRole ( 'button' , { name : / N e x t / i } ) ) ;
283+ await waitFor ( ( ) => expect ( mockValidateMutateAsync ) . toHaveBeenCalled ( ) ) ;
276284 await user . click ( screen . getByTestId ( 'toggle-scope' ) ) ;
277285 await user . click ( screen . getByRole ( 'button' , { name : / S a v e / i } ) ) ;
278286
@@ -285,11 +293,14 @@ describe('AssignRoleWizard', () => {
285293 it ( 'shows error toast when save fails' , async ( ) => {
286294 const user = userEvent . setup ( ) ;
287295 const saveError = new Error ( 'Server error' ) ;
296+ mockValidateMutateAsync . mockResolvedValue ( { invalidUsers : [ ] , validUsers : [ 'alice' ] } ) ;
288297 mockAssignMutateAsync . mockRejectedValue ( saveError ) ;
289298
290299 renderWizard ( ) ;
291300 await user . type ( screen . getByTestId ( 'users-input' ) , 'alice' ) ;
292301 await user . click ( screen . getByTestId ( 'select-role' ) ) ;
302+ await user . click ( screen . getByRole ( 'button' , { name : / N e x t / i } ) ) ;
303+ await waitFor ( ( ) => expect ( mockValidateMutateAsync ) . toHaveBeenCalled ( ) ) ;
293304 await user . click ( screen . getByTestId ( 'toggle-scope' ) ) ;
294305 await user . click ( screen . getByRole ( 'button' , { name : / S a v e / i } ) ) ;
295306
@@ -298,11 +309,15 @@ describe('AssignRoleWizard', () => {
298309 } ) ;
299310 } ) ;
300311
301- it ( 'initialUsers prop pre-fills the users field' , ( ) => {
312+ it ( 'initialUsers prop pre-fills the users field' , async ( ) => {
313+ const user = userEvent . setup ( ) ;
302314 renderWizard ( { initialUsers : 'prefilled_user' } ) ;
303- // The wizard starts with initialUsers set, but our mock input doesn't show it
304- // We verify the Next button state — it's still disabled without role
315+ expect ( screen . getByTestId ( 'users- input' ) ) . toHaveValue ( 'prefilled_user' ) ;
316+ // Next is still disabled without a role selected
305317 expect ( screen . getByRole ( 'button' , { name : / N e x t / i } ) ) . toBeDisabled ( ) ;
318+ // Selecting a role enables Next since users are already pre-filled
319+ await user . click ( screen . getByTestId ( 'select-role' ) ) ;
320+ expect ( screen . getByRole ( 'button' , { name : / N e x t / i } ) ) . not . toBeDisabled ( ) ;
306321 } ) ;
307322
308323 it ( 'filters roles based on user permissions (library allowed, course not)' , ( ) => {
0 commit comments