';
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());
}
}