cache = new CoreCacheDriver('array'); $this->app->instance(CacheInterface::class, $this->cache); } protected function tearDown(): void { Cache::flush(); parent::tearDown(); } /** * X-1: 모듈 설치 → 전체 캐시 카스케이드 무효화. * * 그룹 A(상태) + B(레이아웃) + C(SEO) 캐시가 한 번에 무효화되고, * ext.cache_version 이 증가하는 시나리오를 키 차원에서 검증. */ #[Test] public function x_1_module_install_cascades_all_groups(): void { // 초기 상태: 모든 그룹에 캐시 존재 $this->cache->put('ext.modules.active_identifiers', ['mod-a']); // A $this->cache->put('ext.cache_version', 1000); // A $this->cache->put('template.1.layout.admin/dashboard', 'merged'); // B $this->cache->put('seo.page.abc123', ''); // C $this->cache->put('seo.config.sirsoft-admin_basic', ['v' => 1]); // C $this->cache->put('seo.sitemap', ''); // C // 모듈 설치 시 카스케이드 무효화 시뮬레이션 $this->cache->forget('ext.modules.active_identifiers'); // A: 상태 캐시 $this->cache->put('ext.cache_version', 2000); // A: 버전 증가 $this->cache->forget('template.1.layout.admin/dashboard'); // B: 레이아웃 $this->cache->forget('seo.page.abc123'); // C: SEO 페이지 $this->cache->forget('seo.config.sirsoft-admin_basic'); // C: SEO config $this->cache->forget('seo.sitemap'); // C: Sitemap // 모든 그룹 캐시 무효화 확인 $this->assertFalse($this->cache->has('ext.modules.active_identifiers')); $this->assertSame(2000, $this->cache->get('ext.cache_version')); $this->assertFalse($this->cache->has('template.1.layout.admin/dashboard')); $this->assertFalse($this->cache->has('seo.page.abc123')); $this->assertFalse($this->cache->has('seo.config.sirsoft-admin_basic')); $this->assertFalse($this->cache->has('seo.sitemap')); } /** * X-2: 설정 저장(SEO 탭) → 설정 + SEO 캐시 카스케이드. */ #[Test] public function x_2_seo_settings_save_cascades_settings_and_seo(): void { $this->cache->put('settings.system', ['cached' => true]); // E $this->cache->put('seo.page.abc', ''); // C $this->cache->put('seo.sitemap', ''); // C // SEO 탭 저장 시 카스케이드 $this->cache->forget('settings.system'); // E: 설정 $this->cache->forget('seo.page.abc'); // C: SEO 페이지 $this->cache->forget('seo.sitemap'); // C: sitemap $this->assertFalse($this->cache->has('settings.system')); $this->assertFalse($this->cache->has('seo.page.abc')); $this->assertFalse($this->cache->has('seo.sitemap')); } /** * X-3: 모듈 비활성화 → 코어 상태/레이아웃 + 모듈 자체(ModuleCacheDriver) 캐시 모두 정리. */ #[Test] public function x_3_module_deactivation_clears_core_and_module_own_cache(): void { // 코어 캐시 $this->cache->put('ext.modules.active_identifiers', ['sirsoft-ecommerce']); $this->cache->put('template.1.layout.sirsoft-ecommerce.admin_products', 'merged'); // 모듈 자체 캐시 (ModuleCacheDriver) — remember 로 저장하여 인덱스 등록 $moduleCache = new ModuleCacheDriver('sirsoft-ecommerce', 'array'); $moduleCache->remember('products_count', fn () => 100); $moduleCache->remember('orders_today', fn () => 50); $this->assertTrue($moduleCache->has('products_count')); // 비활성화 시뮬레이션 — 코어 정리 $this->cache->forget('ext.modules.active_identifiers'); $this->cache->forget('template.1.layout.sirsoft-ecommerce.admin_products'); // ModuleManager.flushModuleCache 호출 시뮬레이션 $moduleCache->flush(); $this->assertFalse($this->cache->has('ext.modules.active_identifiers')); $this->assertFalse($this->cache->has('template.1.layout.sirsoft-ecommerce.admin_products')); $this->assertFalse($moduleCache->has('products_count')); $this->assertFalse($moduleCache->has('orders_today')); } /** * X-4: 캐시 드라이버 전환 후 정상 동작 (withStore). */ #[Test] public function x_4_driver_switch_isolates_data(): void { $arrayDriver = new CoreCacheDriver('array'); $arrayDriver->put('switch.test', 'array-value'); $this->assertSame('array-value', $arrayDriver->get('switch.test')); // withStore 로 다른 스토어 인스턴스 — 동일 array 풀 공유 // (file 드라이버 테스트는 부수효과 회피를 위해 array 인스턴스 두 개로 검증) $cloned = $arrayDriver->withStore('array'); $this->assertSame('array', $cloned->getStore()); // 새 인스턴스도 동일 키 접두사 사용 $this->assertSame( $arrayDriver->resolveKey('switch.test'), $cloned->resolveKey('switch.test') ); } /** * X-5: CacheService 완전 제거 검증. * * CacheService 클래스 파일 삭제 + 어디에도 참조되지 않는지 grep 검증. */ #[Test] public function x_5_cache_service_class_removed(): void { // 파일 삭제 확인 $this->assertFalse( file_exists(base_path('app/Services/CacheService.php')), 'app/Services/CacheService.php 가 삭제되어야 합니다' ); // 클래스 미존재 확인 (오토로드 차단 — 파일이 없으면 false) $this->assertFalse( class_exists('App\\Services\\CacheService', false), 'CacheService 클래스가 로드되지 않아야 합니다' ); // 모든 코어 + 마이그레이션 테스트가 통과한다는 사실 자체가 // CacheService 미참조의 증거이다. $this->assertTrue(true); } }