upgrade = new $class(); $this->context = new UpgradeContext( fromVersion: '1.0.0-beta.3', toVersion: '1.0.0-beta.4', currentStep: '1.0.0-beta.4', ); } private function runUpgrade(): void { $reflection = new ReflectionClass($this->upgrade); $method = $reflection->getMethod('run'); $method->invoke($this->upgrade, $this->context); } public function test_board_types_name_expands_to_dot_paths(): void { config(['app.supported_locales' => ['ko', 'en', 'ja']]); $id = DB::table('board_types')->insertGetId([ 'slug' => 'test-'.uniqid(), 'name' => json_encode(['ko' => '기본형', 'en' => 'Basic', 'ja' => '基本型']), 'user_overrides' => json_encode(['name']), 'created_at' => now(), 'updated_at' => now(), ]); $this->runUpgrade(); $row = DB::table('board_types')->where('id', $id)->first(['user_overrides']); $overrides = json_decode($row->user_overrides, true); $this->assertEqualsCanonicalizing(['name.ko', 'name.en', 'name.ja'], $overrides); } public function test_already_dot_path_idempotent(): void { config(['app.supported_locales' => ['ko', 'en']]); $id = DB::table('board_types')->insertGetId([ 'slug' => 'test-'.uniqid(), 'name' => json_encode(['ko' => '기본형', 'en' => 'Basic']), 'user_overrides' => json_encode(['name.ko']), 'created_at' => now(), 'updated_at' => now(), ]); $this->runUpgrade(); $row = DB::table('board_types')->where('id', $id)->first(['user_overrides']); $this->assertEquals(['name.ko'], json_decode($row->user_overrides, true)); } public function test_null_user_overrides_unchanged(): void { $id = DB::table('board_types')->insertGetId([ 'slug' => 'test-'.uniqid(), 'name' => json_encode(['ko' => '기본형', 'en' => 'Basic']), 'user_overrides' => null, 'created_at' => now(), 'updated_at' => now(), ]); $this->runUpgrade(); $row = DB::table('board_types')->where('id', $id)->first(['user_overrides']); $this->assertNull($row->user_overrides); } }