isolatedPublicPath = storage_path('framework/testing/public-seobypass-'.getmypid()); File::ensureDirectoryExists($this->isolatedPublicPath); $this->app->usePublicPath($this->isolatedPublicPath); } protected function tearDown(): void { File::deleteDirectory($this->isolatedPublicPath); AssetUrl::resetStaticExtBaseMemo(); ExtensionStaticCacheService::resetPublishScheduleForTesting(); parent::tearDown(); } /** * 정적 게이트가 열린 상태에서도 SEO CSS URL 은 `/build/ext/` 를 참조하지 않는다. * * @effects seo_html_never_references_gc_target_static_path */ public function test_seo_css_url_은_정적_게시_경로를_우회한다(): void { Cache::put('g7:core:ext.cache_version', self::VERSION); app()['env'] = 'production'; $dir = public_path('build/ext/'.self::VERSION); File::ensureDirectoryExists($dir.'/templates/sirsoft-basic/assets/css'); File::put($dir.'/manifest.json', '{}'); File::put($dir.'/templates/sirsoft-basic/assets/css/components.css', 'x'); AssetUrl::resetStaticExtBaseMemo(); // 전제 고정 — 블레이드 경로(기본값)는 정적 게이트를 통과하는 상태다. // 이 단언이 깨지면 아래 우회 단언은 게이트 미통과로 인한 공허한 통과가 된다. $this->assertSame( '/build/ext/'.self::VERSION.'/templates/sirsoft-basic/assets/css/components.css', AssetUrl::templateAsset('sirsoft-basic', 'css/components.css') ); $method = new \ReflectionMethod(SeoRenderer::class, 'getTemplateCssUrls'); $urls = $method->invoke(app(SeoRenderer::class), 'sirsoft-basic'); $this->assertNotEmpty($urls); foreach ($urls as $url) { $this->assertStringNotContainsString('/build/ext/', $url); } } }