@@ -337,6 +337,71 @@ void findUsers_lockedCursor_success() {
337337 assertThat (secondPage .get (0 ).getId ()).isEqualTo (expectedOrder .get (1 ).getId ());
338338 }
339339
340+ @ Test
341+ @ DisplayName ("권한 커서로 사용자 목록을 이어서 조회한다" )
342+ void findUsers_roleCursor_success () {
343+ // Given
344+ User firstUser = User .create ("role-cursor-a@example.com" , "password" , "권한 A" );
345+ User secondUser = User .create ("role-cursor-b@example.com" , "password" , "권한 B" );
346+ User firstAdmin = User .create ("role-cursor-c@example.com" , "password" , "권한 C" );
347+ firstAdmin .updateRole (UserRole .ADMIN );
348+ User secondAdmin = User .create ("role-cursor-d@example.com" , "password" , "권한 D" );
349+ secondAdmin .updateRole (UserRole .ADMIN );
350+
351+ userRepository .saveAll (List .of (secondUser , firstAdmin , firstUser , secondAdmin ));
352+ entityManager .flush ();
353+ entityManager .clear ();
354+
355+ UserCursorRequest firstPageRequest = new UserCursorRequest (
356+ "role-cursor" ,
357+ null ,
358+ false ,
359+ null ,
360+ null ,
361+ 1 ,
362+ Sort .Direction .ASC ,
363+ UserSortBy .ROLE
364+ );
365+
366+ // When
367+ List <User > expectedOrder = userRepository .findUsers (firstPageRequest , 10 );
368+ List <User > firstPage = userRepository .findUsers (firstPageRequest , 1 );
369+ User lastUserOfFirstPage = firstPage .get (0 );
370+ UserCursorRequest secondPageRequest = new UserCursorRequest (
371+ "role-cursor" ,
372+ null ,
373+ false ,
374+ lastUserOfFirstPage .getRole ().name (),
375+ lastUserOfFirstPage .getId (),
376+ 10 ,
377+ Sort .Direction .ASC ,
378+ UserSortBy .ROLE
379+ );
380+ List <User > secondPage = userRepository .findUsers (secondPageRequest , 10 );
381+
382+ // Then
383+ List <User > combinedPages = new ArrayList <>(firstPage );
384+ combinedPages .addAll (secondPage );
385+
386+ assertThat (expectedOrder )
387+ .extracting (User ::getRole )
388+ .containsExactly (UserRole .ADMIN , UserRole .ADMIN , UserRole .USER , UserRole .USER );
389+ assertThat (combinedPages )
390+ .extracting (User ::getId )
391+ .containsExactlyElementsOf (expectedOrder .stream ()
392+ .map (User ::getId )
393+ .toList ());
394+ assertThat (firstPage )
395+ .extracting (User ::getId )
396+ .doesNotContainAnyElementsOf (secondPage .stream ()
397+ .map (User ::getId )
398+ .toList ());
399+ assertThat (firstPage ).containsExactly (expectedOrder .get (0 ));
400+ assertThat (secondPage .get (0 )).isEqualTo (expectedOrder .get (1 ));
401+ assertThat (secondPage .get (0 ).getRole ()).isEqualTo (lastUserOfFirstPage .getRole ());
402+ assertThat (secondPage .get (0 ).getId ()).isEqualTo (expectedOrder .get (1 ).getId ());
403+ }
404+
340405 @ Test
341406 @ DisplayName ("잘못된 커서 값이면 예외가 발생한다" )
342407 void findUsers_malformedCursor_throwsException () {
0 commit comments