Files
Gnuboard7/tests/Unit/Extension/ClearsTemplateCachesTest.php
T
2026-04-01 10:30:52 +09:00

223 lines
7.5 KiB
PHP

<?php
namespace Tests\Unit\Extension;
use App\Enums\ExtensionStatus;
use App\Extension\Traits\ClearsTemplateCaches;
use App\Models\Template;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Cache;
use Tests\TestCase;
/**
* ClearsTemplateCaches trait 테스트
*
* 모듈/플러그인 활성화/비활성화 시 캐시 무효화 기능을 테스트합니다.
*/
class ClearsTemplateCachesTest extends TestCase
{
use RefreshDatabase;
/**
* trait을 사용하는 테스트용 클래스
*/
private object $traitUser;
protected function setUp(): void
{
parent::setUp();
// trait을 사용하는 익명 클래스 생성
$this->traitUser = new class
{
use ClearsTemplateCaches;
// protected 메서드를 public으로 노출
public function callIncrementExtensionCacheVersion(): void
{
$this->incrementExtensionCacheVersion();
}
public function callClearAllTemplateLanguageCaches(): void
{
$this->clearAllTemplateLanguageCaches();
}
public function callClearAllTemplateRoutesCaches(): void
{
$this->clearAllTemplateRoutesCaches();
}
};
// 캐시 초기화
Cache::flush();
}
/**
* 캐시 버전 증가 테스트
*/
public function test_increment_extension_cache_version(): void
{
// 초기 상태: 캐시 버전이 0
$this->assertEquals(0, ClearsTemplateCaches::getExtensionCacheVersion());
// 캐시 버전 증가
$beforeTime = time();
$this->traitUser->callIncrementExtensionCacheVersion();
$afterTime = time();
// 캐시 버전이 현재 타임스탬프로 설정됨
$version = ClearsTemplateCaches::getExtensionCacheVersion();
$this->assertGreaterThanOrEqual($beforeTime, $version);
$this->assertLessThanOrEqual($afterTime, $version);
}
/**
* 캐시 버전 연속 증가 테스트
*/
public function test_increment_extension_cache_version_multiple_times(): void
{
// 첫 번째 증가
$this->traitUser->callIncrementExtensionCacheVersion();
$firstVersion = ClearsTemplateCaches::getExtensionCacheVersion();
// 1초 대기 (time() 기반이므로)
sleep(1);
// 두 번째 증가
$this->traitUser->callIncrementExtensionCacheVersion();
$secondVersion = ClearsTemplateCaches::getExtensionCacheVersion();
// 두 번째 버전이 첫 번째보다 크거나 같음 (동일 초 내에서는 같을 수 있음)
$this->assertGreaterThanOrEqual($firstVersion, $secondVersion);
}
/**
* getExtensionCacheVersion 정적 메서드 테스트
*/
public function test_get_extension_cache_version_returns_zero_when_not_set(): void
{
Cache::forget('extension_cache_version');
$version = ClearsTemplateCaches::getExtensionCacheVersion();
$this->assertEquals(0, $version);
}
/**
* getExtensionCacheVersion 정적 메서드가 캐시된 값 반환
*/
public function test_get_extension_cache_version_returns_cached_value(): void
{
$expectedVersion = 1735000000;
Cache::put('extension_cache_version', $expectedVersion);
$version = ClearsTemplateCaches::getExtensionCacheVersion();
$this->assertEquals($expectedVersion, $version);
}
/**
* 템플릿 언어 캐시 무효화 테스트
*/
public function test_clear_all_template_language_caches(): void
{
// 활성 템플릿 생성 - 고유 identifier 사용하여 트랜잭션 락 충돌 방지
$identifier = 'test-template-'.uniqid();
$template = Template::create([
'identifier' => $identifier,
'vendor' => 'test',
'name' => ['ko' => '테스트', 'en' => 'Test'],
'version' => '1.0.0',
'type' => 'admin',
'status' => ExtensionStatus::Active->value,
'description' => ['ko' => '테스트용', 'en' => 'For testing'],
]);
// 언어 캐시 설정
Cache::put("template.language.{$template->identifier}.ko", ['key' => 'value']);
Cache::put("template.language.{$template->identifier}.en", ['key' => 'value']);
// 캐시 존재 확인
$this->assertTrue(Cache::has("template.language.{$template->identifier}.ko"));
$this->assertTrue(Cache::has("template.language.{$template->identifier}.en"));
// 캐시 무효화
$this->traitUser->callClearAllTemplateLanguageCaches();
// 캐시가 삭제됨
$this->assertFalse(Cache::has("template.language.{$template->identifier}.ko"));
$this->assertFalse(Cache::has("template.language.{$template->identifier}.en"));
}
/**
* 템플릿 routes 캐시 무효화 테스트
*/
public function test_clear_all_template_routes_caches(): void
{
// 활성 템플릿 생성 - 고유 identifier 사용하여 트랜잭션 락 충돌 방지
$identifier = 'test-template-'.uniqid();
$template = Template::create([
'identifier' => $identifier,
'vendor' => 'test',
'name' => ['ko' => '테스트', 'en' => 'Test'],
'version' => '1.0.0',
'type' => 'admin',
'status' => ExtensionStatus::Active->value,
'description' => ['ko' => '테스트용', 'en' => 'For testing'],
]);
// routes 캐시 설정
Cache::put("template.routes.{$template->identifier}", ['routes' => []]);
// 캐시 존재 확인
$this->assertTrue(Cache::has("template.routes.{$template->identifier}"));
// 캐시 무효화
$this->traitUser->callClearAllTemplateRoutesCaches();
// 캐시가 삭제됨
$this->assertFalse(Cache::has("template.routes.{$template->identifier}"));
}
/**
* 비활성 템플릿의 캐시는 무효화하지 않음
*/
public function test_clear_caches_only_affects_active_templates(): void
{
// 활성 템플릿
$activeTemplate = Template::create([
'identifier' => 'active-template',
'vendor' => 'test',
'name' => ['ko' => '활성', 'en' => 'Active'],
'version' => '1.0.0',
'type' => 'admin',
'status' => ExtensionStatus::Active->value,
'description' => ['ko' => '테스트용', 'en' => 'For testing'],
]);
// 비활성 템플릿
$inactiveTemplate = Template::create([
'identifier' => 'inactive-template',
'vendor' => 'test',
'name' => ['ko' => '비활성', 'en' => 'Inactive'],
'version' => '1.0.0',
'type' => 'admin',
'status' => ExtensionStatus::Inactive->value,
'description' => ['ko' => '테스트용', 'en' => 'For testing'],
]);
// 두 템플릿의 언어 캐시 설정
Cache::put("template.language.{$activeTemplate->identifier}.ko", ['key' => 'active']);
Cache::put("template.language.{$inactiveTemplate->identifier}.ko", ['key' => 'inactive']);
// 캐시 무효화
$this->traitUser->callClearAllTemplateLanguageCaches();
// 활성 템플릿 캐시만 삭제됨
$this->assertFalse(Cache::has("template.language.{$activeTemplate->identifier}.ko"));
// 비활성 템플릿 캐시는 유지됨
$this->assertTrue(Cache::has("template.language.{$inactiveTemplate->identifier}.ko"));
}
}