incrementExtensionCacheVersion(); } public function read(): int { return self::getExtensionCacheVersion(); } }; } #[Test] public function version_bump_is_readable_after_cache_default_changes(): void { $subject = $this->makeSubject(); // write 시점 — 한 스토어(예: array) Config::set('cache.default', 'array'); $subject->bump(); $written = $subject->read(); $this->assertGreaterThan(0, $written, 'bump 직후 같은 스토어에서 읽혀야 함'); // read 시점 — settings 오버라이드로 cache.default 가 바뀐 상황 시뮬레이션 Config::set('cache.default', 'file'); $afterChange = $subject->read(); // 핵심 불변식: write 와 read 가 같은 고정 스토어를 쓰므로 cache.default 변경에 // 영향받지 않고 동일 값이 보여야 한다(스토어 분기 = stale 캐시 회귀). $this->assertSame( $written, $afterChange, 'ext.cache_version 은 cache.default 변경과 무관하게 동일 스토어로 일관 read/write 되어야 함' ); } #[Test] public function version_written_under_one_default_is_visible_under_another(): void { $subject = $this->makeSubject(); // database(.env 기본) 스토어 컨텍스트에서 write Config::set('cache.default', 'database'); $subject->bump(); $v1 = $subject->read(); // file(settings 오버라이드) 스토어 컨텍스트에서 read — 같은 값이어야 함 Config::set('cache.default', 'file'); $v2 = $subject->read(); $this->assertSame($v1, $v2, 'write/read 컨텍스트의 cache.default 가 달라도 같은 버전이 보여야 함'); $this->assertGreaterThan(0, $v2, 'read 컨텍스트에서 0(미설정)으로 떨어지면 stale 캐시 회귀'); } }