create(); $balance = MileageBalance::create([ 'user_id' => $user->id, 'currency' => 'KRW', 'available' => 1000, 'pending' => 500, 'total_earned' => 1500, 'total_used' => 0, 'expiring_soon' => 200, 'expiring_date' => now()->addDays(5), 'recalculated_at' => now(), ])->fresh(); $this->assertSame('1000.00', (string) $balance->available); $this->assertInstanceOf(Carbon::class, $balance->expiring_date); $this->assertInstanceOf(Carbon::class, $balance->recalculated_at); } /** * user 관계. */ public function test_user_relation(): void { $user = User::factory()->create(); $balance = MileageBalance::create(['user_id' => $user->id, 'currency' => 'KRW', 'available' => 0]); $this->assertTrue($balance->user->is($user)); } /** * (user_id, currency) 유니크 — 동일 조합 중복 생성 거부. */ public function test_user_currency_unique(): void { $user = User::factory()->create(); MileageBalance::create(['user_id' => $user->id, 'currency' => 'KRW', 'available' => 0]); $this->expectException(QueryException::class); MileageBalance::create(['user_id' => $user->id, 'currency' => 'KRW', 'available' => 100]); } /** * 동일 회원 + 다른 통화는 별도 행으로 허용. */ public function test_different_currency_allowed(): void { $user = User::factory()->create(); MileageBalance::create(['user_id' => $user->id, 'currency' => 'KRW', 'available' => 0]); MileageBalance::create(['user_id' => $user->id, 'currency' => 'USD', 'available' => 0]); $this->assertSame(2, MileageBalance::where('user_id', $user->id)->count()); } }