admin = $this->createSettingsAdmin(); $this->token = $this->admin->createToken('test-token')->plainTextToken; } /** * 설정 조회 권한을 가진 관리자를 생성합니다. * * @return User 생성된 관리자 */ private function createSettingsAdmin(): User { $user = User::factory()->create(['password' => Hash::make('password123')]); $permission = Permission::firstOrCreate( ['identifier' => 'core.settings.read'], [ 'name' => json_encode(['ko' => 'core.settings.read', 'en' => 'core.settings.read']), 'description' => json_encode(['ko' => 'core.settings.read', 'en' => 'core.settings.read']), 'extension_type' => ExtensionOwnerType::Core, 'extension_identifier' => 'core', 'type' => 'admin', ] ); $role = Role::create([ 'identifier' => 'settings_limits_admin_'.uniqid(), 'name' => json_encode(['ko' => '테스트 관리자', 'en' => 'Test Admin']), 'description' => json_encode(['ko' => '테스트', 'en' => 'Test']), 'is_active' => true, ]); $role->permissions()->sync([$permission->id]); $adminBaseRole = Role::firstOrCreate( ['identifier' => 'admin'], [ 'name' => json_encode(['ko' => '관리자', 'en' => 'Administrator']), 'description' => json_encode(['ko' => '시스템 관리자', 'en' => 'System Administrator']), 'extension_type' => ExtensionOwnerType::Core, 'extension_identifier' => 'core', 'is_active' => true, ] ); $user->roles()->attach($adminBaseRole->id, ['assigned_at' => now(), 'assigned_by' => null]); $user->roles()->attach($role->id, ['assigned_at' => now(), 'assigned_by' => null]); return $user->fresh(); } /** * 설정 조회 응답이 화면이 바인딩할 한계값을 함께 내려주는지 검증합니다. */ #[Test] public function index_response_includes_settings_limits_meta(): void { $response = $this->withHeaders([ 'Authorization' => 'Bearer '.$this->token, 'Accept' => 'application/json', ])->getJson('/api/admin/settings'); $response->assertStatus(200); $limits = $response->json('data._meta.limits'); $this->assertIsArray($limits, '설정 응답에 _meta.limits 가 없습니다 — 화면이 경계값을 받을 수 없습니다.'); $this->assertSame(config('core.settings_limits'), $limits); } /** * 저장 규칙이 리터럴이 아니라 설정 한계값을 읽는지 검증합니다. */ #[Test] public function save_rules_read_password_length_bounds_from_config(): void { config([ 'core.settings_limits.security_password_min_length_min' => 9, 'core.settings_limits.security_password_min_length_max' => 33, ]); $rules = (new SaveSettingsRequest)->rules()['security.password_min_length']; $this->assertContains('min:9', $rules); $this->assertContains('max:33', $rules); } }