setBasePath()` 로 sandbox 루트를 일시 교체한다. * * 검증 시나리오: * - 레거시 파일 양쪽 존재 + 신 위치 부재 → 양쪽 이동 + 디렉토리 정리 * - 레거시 + 신 위치 모두 존재 → 신 위치 보존, 레거시 정리만 * - 부분 마이그레이션 (ko 만) → 안전 처리 * - 레거시 디렉토리 부재 → 즉시 skip (에러 없음) * - 두 번 실행 → idempotent (동일 결과) */ class MigrateCoreFrontendLangDirectoryTest extends TestCase { private MigrateCoreFrontendLangDirectory $migration; private UpgradeContext $context; private string $sandboxBasePath; private string $originalBasePath; protected function setUp(): void { parent::setUp(); require_once base_path('upgrades/data/7.0.0/migrations/02_MigrateCoreFrontendLangDirectory.php'); $this->migration = new MigrateCoreFrontendLangDirectory; $this->context = new UpgradeContext( fromVersion: '7.0.0-beta.7', toVersion: '7.0.0', currentStep: '7.0.0', ); $this->sandboxBasePath = storage_path('framework/testing/core-lang-migration-'.uniqid()); File::ensureDirectoryExists($this->sandboxBasePath); File::ensureDirectoryExists($this->sandboxBasePath.'/lang'); $this->originalBasePath = base_path(); app()->setBasePath($this->sandboxBasePath); } protected function tearDown(): void { app()->setBasePath($this->originalBasePath); if (File::isDirectory($this->sandboxBasePath)) { File::deleteDirectory($this->sandboxBasePath); } parent::tearDown(); } public function test_name_returns_identifier(): void { $this->assertSame('MigrateCoreFrontendLangDirectory', $this->migration->name()); } public function test_skips_when_legacy_directory_absent(): void { // 레거시 디렉토리 미생성 — 즉시 return $this->migration->run($this->context); // 신 위치도 그대로 (생성/삭제 없음) $this->assertFalse(file_exists($this->sandboxBasePath.'/lang/ko.json')); } public function test_moves_both_legacy_files_to_new_location(): void { $legacyDir = $this->sandboxBasePath.'/resources/js/core/lang'; File::ensureDirectoryExists($legacyDir); file_put_contents($legacyDir.'/ko.json', '{"core":{"errors":{"x":"한글"}}}'); file_put_contents($legacyDir.'/en.json', '{"core":{"errors":{"x":"English"}}}'); $this->migration->run($this->context); $this->assertFileExists($this->sandboxBasePath.'/lang/ko.json'); $this->assertFileExists($this->sandboxBasePath.'/lang/en.json'); $this->assertSame('{"core":{"errors":{"x":"한글"}}}', file_get_contents($this->sandboxBasePath.'/lang/ko.json')); // 레거시 파일은 사라짐 $this->assertFileDoesNotExist($legacyDir.'/ko.json'); $this->assertFileDoesNotExist($legacyDir.'/en.json'); // 빈 레거시 디렉토리도 정리 $this->assertDirectoryDoesNotExist($legacyDir); } public function test_preserves_new_location_when_already_migrated(): void { $legacyDir = $this->sandboxBasePath.'/resources/js/core/lang'; File::ensureDirectoryExists($legacyDir); file_put_contents($legacyDir.'/ko.json', '{"core":{"errors":{"x":"OLD"}}}'); // 신 위치에 이미 새 내용이 있음 file_put_contents($this->sandboxBasePath.'/lang/ko.json', '{"core":{"errors":{"x":"NEW"}}}'); $this->migration->run($this->context); // 신 위치 보존 (덮어쓰기 금지) $this->assertSame('{"core":{"errors":{"x":"NEW"}}}', file_get_contents($this->sandboxBasePath.'/lang/ko.json')); // 레거시는 정리됨 $this->assertFileDoesNotExist($legacyDir.'/ko.json'); } public function test_handles_partial_ko_only_migration(): void { $legacyDir = $this->sandboxBasePath.'/resources/js/core/lang'; File::ensureDirectoryExists($legacyDir); // ko 만 존재, en 부재 file_put_contents($legacyDir.'/ko.json', '{"core":{"a":1}}'); $this->migration->run($this->context); $this->assertFileExists($this->sandboxBasePath.'/lang/ko.json'); $this->assertFileDoesNotExist($this->sandboxBasePath.'/lang/en.json'); $this->assertDirectoryDoesNotExist($legacyDir); } public function test_is_idempotent_on_repeated_execution(): void { $legacyDir = $this->sandboxBasePath.'/resources/js/core/lang'; File::ensureDirectoryExists($legacyDir); file_put_contents($legacyDir.'/ko.json', '{"core":{"a":1}}'); $this->migration->run($this->context); // 두 번째 실행 — 레거시 부재 상태에서 안전하게 skip $this->migration->run($this->context); $this->assertFileExists($this->sandboxBasePath.'/lang/ko.json'); $this->assertSame('{"core":{"a":1}}', file_get_contents($this->sandboxBasePath.'/lang/ko.json')); } public function test_preserves_legacy_directory_when_unrelated_files_remain(): void { $legacyDir = $this->sandboxBasePath.'/resources/js/core/lang'; File::ensureDirectoryExists($legacyDir); file_put_contents($legacyDir.'/ko.json', '{"core":{"a":1}}'); // 사용자가 추가한 무관한 파일 file_put_contents($legacyDir.'/custom.json', '{"keep":true}'); $this->migration->run($this->context); $this->assertFileExists($this->sandboxBasePath.'/lang/ko.json'); $this->assertFileExists($legacyDir.'/custom.json'); // 디렉토리는 무관 파일 때문에 보존됨 $this->assertDirectoryExists($legacyDir); } }