pageService = app(PageService::class); } /** * 커서 없이 깊은 페이지를 지목한 요청이 offset 을 유지하는지 확인 * * @effects search_deep_page_link_keeps_offset */ public function test_deep_page_without_cursor_stays_on_offset(): void { // Given/When: 커서 없이 3 페이지를 직접 지목한 최신순 검색 $result = $this->pageService->searchByKeywordWithCursor( keyword: '커서키워드', sort: 'latest', perPage: 10, cursor: null, page: 3 ); // Then: 커서 경로를 타지 않는다 $this->assertNull( $result, '커서 없이 깊은 페이지를 지목한 요청은 offset 을 유지해야 한다' ); } /** * 첫 페이지는 커서가 없어도 커서 경로로 시작하는지 확인 * * @effects search_first_page_starts_cursor */ public function test_first_page_starts_cursor_mode(): void { // Given/When: 커서 없는 1 페이지 최신순 검색 $result = $this->pageService->searchByKeywordWithCursor( keyword: '커서키워드', sort: 'latest', perPage: 10, cursor: null, page: 1 ); // Then: 커서 페이지네이터를 돌려준다 $this->assertNotNull($result, '첫 페이지는 커서 시작점으로 읽어야 한다'); } /** * 관련도순은 페이지 번호와 무관하게 offset 을 유지하는지 확인 * * @effects search_deep_page_link_keeps_offset */ public function test_relevance_sort_never_uses_cursor(): void { foreach ([1, 3] as $page) { $this->assertNull( $this->pageService->searchByKeywordWithCursor( keyword: '커서키워드', sort: 'relevance', perPage: 10, cursor: null, page: $page ), $page.' 페이지 관련도순은 커서를 쓸 수 없어야 한다' ); } } }