'ko', 'title' => '베이직 오버핏 코튼 티셔츠', 'titleSuffix' => ' | 코지홈', 'description' => '사계절 입기 좋은 오버핏 기본 티셔츠', 'keywords' => '티셔츠,오버핏', 'canonicalUrl' => 'https://example.com/shop/products/1', 'hreflangTags' => '', 'ogTags' => '', 'twitterTags' => '', 'jsonLd' => '{"@type":"Product","name":"베이직 오버핏 코튼 티셔츠"}', 'bodyHtml' => '
', 'googleAnalyticsId' => 'G-XXXX', 'googleVerification' => 'gverify123', 'naverVerification' => 'nverify456', 'stylesheets' => ['/api/templates/assets/sirsoft-basic/css/components.css', 'https://cdnjs.cloudflare.com/font-awesome.css'], 'extraHeadTags' => '', 'extraBodyEnd' => '', 'generatorTag' => '', ], $overrides); } private function renderPreview(array $overrides = []): string { return View::make('seo-preview', $this->viewData($overrides))->render(); } public function test_seo_설정_산출물은_포함된다(): void { $out = $this->renderPreview(); $this->assertStringContainsString('베이직 오버핏 코튼 티셔츠 | 코지홈', $out); $this->assertStringContainsString('name="description"', $out); $this->assertStringContainsString('name="keywords"', $out); $this->assertStringContainsString('rel="canonical"', $out); $this->assertStringContainsString('hreflang="en"', $out); $this->assertStringContainsString('property="og:title"', $out); $this->assertStringContainsString('name="twitter:card"', $out); $this->assertStringContainsString('application/ld+json', $out); $this->assertStringContainsString('"@type":"Product"', $out); // 사이트 소유권 확인 메타 = 검색엔진 SEO 설정 산출물. $this->assertStringContainsString('google-site-verification', $out); $this->assertStringContainsString('naver-site-verification', $out); } public function test_seo_설정_산출물이_아닌_것은_제외된다(): void { $out = $this->renderPreview(); // body 컴포넌트 마크업 — 페이지 본문(검색엔진 탭과 무관). $this->assertStringNotContainsString('app-chrome', $out); $this->assertStringNotContainsString('장바구니', $out); $this->assertStringNotContainsString('assertStringNotContainsString('app.css', $out); $this->assertStringNotContainsString('components.css', $out); $this->assertStringNotContainsString('font-awesome', $out); // 시스템 기본 메타(charset/viewport/generator). $this->assertStringNotContainsString('charset', $out); $this->assertStringNotContainsString('viewport', $out); $this->assertStringNotContainsString('generator', $out); // Google Analytics 추적 스크립트(검색 노출 산출물 아님). $this->assertStringNotContainsString('googletagmanager', $out); // body 영역 자체 미포함. $this->assertStringNotContainsString('renderPreview(['keywords' => '']); $this->assertStringNotContainsString('name="keywords"', $out); } public function test_json_ld_없으면_구조화_스크립트_미출력(): void { $out = $this->renderPreview(['jsonLd' => '']); $this->assertStringNotContainsString('application/ld+json', $out); } }