3, 'total_relation' => TotalRelation::Exact->value, 'total_is_exact' => true, 'items' => [], ]; return $results; }, 5); // When: 통합 검색을 호출 $response = $this->getJson('/api/search?q=테스트'); // Then: HTTP 200 이되 실패가 응답 키로 구분된다 $response->assertOk(); $response->assertJsonPath('data.categories_failed.alpha', true); $response->assertJsonPath('data.categories_failed.beta', false); $response->assertJsonPath('data.search_failed', true); // 실패한 0건은 "정확한 0건" 이 아니다 $response->assertJsonPath('data.counts_are_exact.alpha', false); } /** * 실패가 없으면 두 키 모두 false 로 존재하는지 확인 * * 키 자체가 없으면 화면이 "실패 정보 없음(구버전)" 과 "실패 없음" 을 구분하지 못한다. * * @effects failure_flags_default_to_false */ public function test_flags_default_to_false_when_no_failure(): void { // Given: 정상 카테고리만 있는 검색 결과 HookManager::addFilter('core.search.results', function (array $results): array { $results['alpha'] = [ 'total' => 7, 'total_relation' => TotalRelation::Exact->value, 'total_is_exact' => true, 'items' => [], ]; return $results; }, 5); // When: 통합 검색을 호출 $response = $this->getJson('/api/search?q=테스트'); // Then: 실패 키는 존재하되 전부 false $response->assertOk(); $response->assertJsonPath('data.categories_failed.alpha', false); $response->assertJsonPath('data.search_failed', false); } }