'; Cache::put('g7:core:seo.sitemap', $sampleXml, 86400); $response = $this->get('/sitemap.xml'); $response->assertStatus(200); $response->assertHeader('Content-Type', 'application/xml'); } /** * sitemap_enabled가 false일 때 404를 반환하는지 확인합니다. */ public function test_sitemap_returns_404_when_disabled(): void { Config::set('g7_settings.core.seo.sitemap_enabled', false); $response = $this->get('/sitemap.xml'); $response->assertStatus(404); } /** * 캐시에 저장된 XML이 있으면 해당 내용을 반환하는지 확인합니다. */ public function test_sitemap_returns_cached_content(): void { Config::set('g7_settings.core.seo.sitemap_enabled', true); $cachedXml = '' .'' .'https://example.com/cached' .''; Cache::put('g7:core:seo.sitemap', $cachedXml, 86400); $response = $this->get('/sitemap.xml'); $response->assertStatus(200); $response->assertSee('https://example.com/cached'); $this->assertSame($cachedXml, $response->getContent()); } /** * 캐시가 없을 때 SitemapGenerator::generate()를 호출하고 * 결과를 캐시에 저장하는지 확인합니다. */ public function test_sitemap_generates_and_caches_when_not_cached(): void { Config::set('g7_settings.core.seo.sitemap_enabled', true); Config::set('g7_settings.core.seo.sitemap_cache_ttl', 3600); // 캐시 비우기 Cache::forget('g7:core:seo.sitemap'); $generatedXml = '' .'' .'https://example.com/generated' .''; // SitemapGenerator Mock $generatorMock = Mockery::mock(SitemapGenerator::class); $generatorMock->shouldReceive('generate') ->once() ->andReturn($generatedXml); // 컨테이너에 Mock 바인딩 $this->app->instance(SitemapGenerator::class, $generatorMock); $response = $this->get('/sitemap.xml'); $response->assertStatus(200); $response->assertHeader('Content-Type', 'application/xml'); $this->assertSame($generatedXml, $response->getContent()); // 캐시에 저장되었는지 확인 $this->assertSame($generatedXml, Cache::get('g7:core:seo.sitemap')); } /** * sitemap_enabled가 null로 설정되면 (bool) 캐스팅에 의해 비활성으로 처리되는지 확인합니다. * * Config에 키가 null로 존재하면 Config::get()이 null을 반환하고, * (bool) null = false이므로 404가 됩니다. */ public function test_sitemap_returns_404_when_enabled_is_null(): void { Config::set('g7_settings.core.seo.sitemap_enabled', null); $response = $this->get('/sitemap.xml'); $response->assertStatus(404); } /** * sitemap_enabled가 true일 때 정상 동작하는지 확인합니다. */ public function test_sitemap_works_when_explicitly_enabled(): void { Config::set('g7_settings.core.seo.sitemap_enabled', true); $sampleXml = ''; Cache::put('g7:core:seo.sitemap', $sampleXml, 86400); $response = $this->get('/sitemap.xml'); $response->assertStatus(200); } /** * sitemap XML 응답 본문이 XML 형식인지 확인합니다. */ public function test_sitemap_response_body_is_valid_xml(): void { Config::set('g7_settings.core.seo.sitemap_enabled', true); $validXml = ''."\n" .''."\n" .' '."\n" .' https://example.com/'."\n" .' '."\n" .''; Cache::put('g7:core:seo.sitemap', $validXml, 86400); $response = $this->get('/sitemap.xml'); $response->assertStatus(200); // XML 파싱이 성공하는지 확인 $xml = simplexml_load_string($response->getContent()); $this->assertNotFalse($xml, 'sitemap 응답이 유효한 XML이어야 합니다'); $this->assertSame('urlset', $xml->getName()); } }