upgrade = new $class(); $this->context = new UpgradeContext( fromVersion: '1.0.0-beta.2', toVersion: '1.0.0-beta.3', currentStep: '1.0.0-beta.3', ); } private function runUpgrade(): void { $reflection = new ReflectionClass($this->upgrade); $method = $reflection->getMethod('run'); $method->invoke($this->upgrade, $this->context); } public function test_claim_reasons_name_expands_to_dot_paths(): void { config(['app.supported_locales' => ['ko', 'en', 'ja']]); $id = DB::table('ecommerce_claim_reasons')->insertGetId([ 'type' => 'refund', 'code' => 'test_'.uniqid(), 'name' => json_encode(['ko' => '주문 실수', 'en' => 'Order Mistake', 'ja' => '注文ミス']), 'fault_type' => 'customer', 'is_user_selectable' => true, 'is_active' => true, 'sort_order' => 0, 'user_overrides' => json_encode(['name']), 'created_at' => now(), 'updated_at' => now(), ]); $this->runUpgrade(); $row = DB::table('ecommerce_claim_reasons')->where('id', $id)->first(['user_overrides']); $this->assertEqualsCanonicalizing( ['name.ko', 'name.en', 'name.ja'], json_decode($row->user_overrides, true) ); } public function test_idempotent_for_dot_path_overrides(): void { config(['app.supported_locales' => ['ko', 'en']]); $id = DB::table('ecommerce_claim_reasons')->insertGetId([ 'type' => 'refund', 'code' => 'test_'.uniqid(), 'name' => json_encode(['ko' => '주문 실수', 'en' => 'Order Mistake']), 'fault_type' => 'customer', 'is_user_selectable' => true, 'is_active' => true, 'sort_order' => 0, 'user_overrides' => json_encode(['name.ko']), 'created_at' => now(), 'updated_at' => now(), ]); $this->runUpgrade(); $row = DB::table('ecommerce_claim_reasons')->where('id', $id)->first(['user_overrides']); $this->assertEquals(['name.ko'], json_decode($row->user_overrides, true)); } public function test_scalar_columns_preserved(): void { // sort_order/is_active 같은 scalar 필드는 변환 영향 없음 config(['app.supported_locales' => ['ko', 'en']]); $id = DB::table('ecommerce_claim_reasons')->insertGetId([ 'type' => 'refund', 'code' => 'test_'.uniqid(), 'name' => json_encode(['ko' => '주문 실수', 'en' => 'Order Mistake']), 'fault_type' => 'customer', 'is_user_selectable' => true, 'is_active' => true, 'sort_order' => 0, 'user_overrides' => json_encode(['name', 'sort_order', 'is_active']), 'created_at' => now(), 'updated_at' => now(), ]); $this->runUpgrade(); $row = DB::table('ecommerce_claim_reasons')->where('id', $id)->first(['user_overrides']); $overrides = json_decode($row->user_overrides, true); $this->assertEqualsCanonicalizing( ['name.ko', 'name.en', 'sort_order', 'is_active'], $overrides ); } }