$disk, ]); $request->setContainer($this->app)->setRedirector($this->app['redirect']); $request->setRouteResolver(fn () => new class { public function parameter(string $key, $default = null): string { return 'sirsoft-ckeditor5'; } }); $request->validateResolved(); return $request; } #[Test] public function core_catalog_disk_is_accepted(): void { $request = $this->resolve('public'); $this->assertSame('public', $request->validated()['public_asset_disk']); } #[Test] public function empty_value_is_accepted_as_follow_core(): void { $request = $this->resolve(''); $this->assertSame('', $request->validated()['public_asset_disk'] ?? ''); } #[Test] public function unknown_disk_is_rejected(): void { $this->expectException(ValidationException::class); try { $this->resolve('nonexistent_disk'); } catch (ValidationException $e) { $this->assertArrayHasKey( 'public_asset_disk', $e->validator->errors()->toArray(), '카탈로그에 없는 디스크는 public_asset_disk 오류를 내야 한다' ); throw $e; } } #[Test] public function validation_gate_is_closed_when_schema_lacks_the_key(): void { // 이 키를 선언하지 않은 플러그인에는 검증도 붙지 않아야 한다 — // 부착 게이트(PluginSettingsController)와 검증 게이트가 같은 조건이어야 한다. $plugin = $this->createMock(AbstractPlugin::class); $plugin->method('getSettingsSchema')->willReturn([ 'some_other_key' => ['type' => 'string'], ]); $manager = $this->createMock(PluginManager::class); $manager->method('getPlugin')->willReturn($plugin); $this->app->instance(PluginManager::class, $manager); $request = UpdatePluginSettingsRequest::create('/', 'PUT', [ 'some_other_key' => 'value', ]); $request->setContainer($this->app)->setRedirector($this->app['redirect']); $request->setRouteResolver(fn () => new class { public function parameter(string $key, $default = null): string { return 'other-plugin'; } }); $this->assertArrayNotHasKey('public_asset_disk', $request->rules()); } protected function tearDown(): void { $this->app->forgetInstance(PluginManager::class); parent::tearDown(); } }