builder = app(ExtensionInstallPreviewBuilder::class); $this->testTemplatePath = base_path('templates/test-preview'); if (File::exists($this->testTemplatePath)) { File::deleteDirectory($this->testTemplatePath); } } protected function tearDown(): void { if (File::exists($this->testTemplatePath)) { File::deleteDirectory($this->testTemplatePath); } parent::tearDown(); } private function createTestTemplate(array $dependencies): void { File::makeDirectory($this->testTemplatePath.'/layouts', 0755, true); File::put( $this->testTemplatePath.'/template.json', json_encode([ 'identifier' => 'test-preview', 'vendor' => 'test', 'name' => ['ko' => '테스트 프리뷰', 'en' => 'Test Preview'], 'version' => '1.0.0', 'type' => 'admin', 'description' => ['ko' => '', 'en' => ''], 'dependencies' => $dependencies, ], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) ); // builder 가 TemplateService 를 통해 매니페스트를 다시 읽도록 매니저 캐시 갱신 app(\App\Extension\TemplateManager::class)->loadTemplates(); } public function test_template_dependencies_are_returned_as_enriched_flat_array(): void { $this->createTestTemplate([ 'modules' => ['missing-foo' => '>=1.0.0'], 'plugins' => ['missing-bar' => '>=2.0.0'], ]); $preview = $this->builder->build(LanguagePackScope::Template, 'test-preview'); $this->assertIsArray($preview['dependencies']); $this->assertCount(2, $preview['dependencies'], '의존성은 enriched 평면 배열이어야 함 (modules+plugins 합산)'); $byId = []; foreach ($preview['dependencies'] as $dep) { $this->assertArrayHasKey('identifier', $dep); $this->assertArrayHasKey('name', $dep); $this->assertArrayHasKey('type', $dep); $this->assertArrayHasKey('required_version', $dep); $this->assertArrayHasKey('is_installed', $dep); $this->assertArrayHasKey('is_met', $dep); $this->assertArrayHasKey('default_selected', $dep); $byId[$dep['identifier']] = $dep; } $this->assertArrayHasKey('missing-foo', $byId); $this->assertSame('module', $byId['missing-foo']['type']); $this->assertSame('>=1.0.0', $byId['missing-foo']['required_version']); $this->assertFalse($byId['missing-foo']['is_installed']); $this->assertFalse($byId['missing-foo']['is_met']); $this->assertTrue($byId['missing-foo']['default_selected']); $this->assertArrayHasKey('missing-bar', $byId); $this->assertSame('plugin', $byId['missing-bar']['type']); $this->assertSame('>=2.0.0', $byId['missing-bar']['required_version']); } public function test_template_with_empty_dependencies_returns_empty_array(): void { $this->createTestTemplate([ 'modules' => [], 'plugins' => [], ]); $preview = $this->builder->build(LanguagePackScope::Template, 'test-preview'); $this->assertSame([], $preview['dependencies']); } }