saveSettings([ '_tab' => 'advanced', 'advanced' => [ 'pagination_result_cap' => 5000, 'pagination_max_page' => 300, ], ]); $this->assertTrue($saved, '고급 탭 저장이 실패했습니다.'); $pagination = app(ConfigRepositoryInterface::class)->getCategory('pagination'); $this->assertSame( 5000, $pagination['result_cap'] ?? null, 'pagination.result_cap 이 저장되지 않았습니다 — 고급 탭 분류표에서 누락되면 값이 조용히 버려집니다.' ); $this->assertSame( 300, $pagination['max_page'] ?? null, 'pagination.max_page 가 저장되지 않았습니다.' ); } /** * 고급 탭에 병합되는 모든 카테고리가 저장 경로에서 분류되는지 확인합니다. * * 모집단은 스키마에서 도출하므로, 분류표가 뒤처지면 그 카테고리에서 실패합니다. * * @effects advanced_tab_persists_every_merged_category */ public function test_every_category_merged_into_advanced_is_persisted(): void { $repository = app(ConfigRepositoryInterface::class); $schema = $repository->getFrontendSchema(); $mergedCategories = []; foreach ($schema as $category => $categorySchema) { if (str_starts_with($category, '_') || ($categorySchema['merge_into'] ?? null) !== 'advanced') { continue; } $mergedCategories[$category] = $categorySchema['fields'] ?? []; } $this->assertNotEmpty( $mergedCategories, '고급 탭 병합 카테고리 모집단이 비었습니다 — 스키마 조회가 바뀌었는지 확인하세요.' ); $payload = []; $expected = []; foreach ($mergedCategories as $category => $fields) { $this->assertNotEmpty($fields, "카테고리 {$category} 의 필드 목록이 비었습니다."); foreach ($fields as $fieldName => $fieldSchema) { $value = $this->sampleValueFor($fieldSchema['type'] ?? 'string', $fieldName); $payload[$fieldSchema['frontend_key'] ?? $fieldName] = $value; $expected[$category][$fieldName] = $value; } } $saved = app(SettingsService::class)->saveSettings([ '_tab' => 'advanced', 'advanced' => $payload, ]); $this->assertTrue($saved, '고급 탭 저장이 실패했습니다.'); foreach ($expected as $category => $fields) { $stored = $repository->getCategory($category); foreach ($fields as $fieldName => $value) { $this->assertSame( $value, $stored[$fieldName] ?? null, "{$category}.{$fieldName} 이 저장되지 않았습니다 — 고급 탭 분류표에 이 카테고리가 없습니다." ); } } } /** * 필드 타입에 맞는 검사용 값을 만듭니다. * * @param string $type 스키마가 선언한 타입 * @param string $fieldName 필드명 (문자열 값의 구분용) * @return mixed 검사용 값 */ private function sampleValueFor(string $type, string $fieldName): mixed { return match ($type) { 'integer' => 4242, 'boolean' => true, default => 'advanced-tab-'.$fieldName, }; } }