markTestSkipped(self::$skipReason); } // 각 테스트 시작 시 state.json 초기화 $statePath = self::$sharedBase.'/storage/installer-state.json'; if (file_exists($statePath)) { @unlink($statePath); } } #[Test] public function default_state_includes_language_packs_empty_array(): void { $default = DEFAULT_INSTALLATION_STATE; $this->assertArrayHasKey('selected_extensions', $default); $this->assertArrayHasKey('language_packs', $default['selected_extensions']); $this->assertSame([], $default['selected_extensions']['language_packs']); } #[Test] public function get_state_returns_language_packs_when_state_file_missing(): void { $state = getInstallationState(); $this->assertArrayHasKey('selected_extensions', $state); $this->assertArrayHasKey('language_packs', $state['selected_extensions']); $this->assertSame([], $state['selected_extensions']['language_packs']); } #[Test] public function save_and_get_roundtrip_preserves_language_packs(): void { $state = getInstallationState(); $state['selected_extensions'] = [ 'admin_templates' => ['sirsoft-admin_basic'], 'user_templates' => ['sirsoft-basic'], 'modules' => ['sirsoft-board'], 'plugins' => [], 'language_packs' => ['g7-core-ja', 'g7-module-sirsoft-board-ja'], ]; $saved = saveInstallationState($state); $this->assertTrue($saved, 'state.json 저장이 성공해야 함'); $reloaded = getInstallationState(); $this->assertSame( ['g7-core-ja', 'g7-module-sirsoft-board-ja'], $reloaded['selected_extensions']['language_packs'], 'language_packs 배열이 라운드트립에서 보존되어야 함' ); $this->assertSame( ['sirsoft-board'], $reloaded['selected_extensions']['modules'], '기존 modules 키도 함께 보존되어야 함 (회귀 가드)' ); } }