seed(CurrencySeeder::class); config(['lottery.main_site.wallet_api_url' => null]); }); test('wallet balance creates lottery wallet row and returns zeros', function () { $player = Player::query()->create([ 'site_code' => 'test', 'site_player_id' => 'p1', 'username' => null, 'nickname' => null, 'default_currency' => 'NPR', 'status' => 0, ]); $response = $this->withHeaders([ 'Authorization' => 'Bearer dev:'.$player->id, 'X-Locale' => 'zh', ])->getJson('/api/v1/wallet/balance'); $response->assertOk() ->assertJsonPath('code', ErrorCode::Success->value) ->assertJsonPath('data.balance', 0) ->assertJsonPath('data.available_balance', 0) ->assertJsonPath('data.frozen_balance', 0) ->assertJsonPath('data.currency_code', 'NPR') ->assertJsonPath('data.wallet_type', 'lottery') ->assertJsonPath('data.main_balance', null); expect(PlayerWallet::query()->where('player_id', $player->id)->count())->toBe(1); }); test('wallet balance rejects illegal currency query', function () { $player = Player::query()->create([ 'site_code' => 'test', 'site_player_id' => 'p2', 'username' => null, 'nickname' => null, 'default_currency' => 'NPR', 'status' => 0, ]); $this->withHeader('Authorization', 'Bearer dev:'.$player->id) ->getJson('/api/v1/wallet/balance?currency=!!') ->assertStatus(400) ->assertJsonPath('code', ErrorCode::WalletInvalidCurrency->value); }); test('wallet balance returns main_balance when main site wallet api is configured', function () { config([ 'lottery.main_site.wallet_api_url' => 'http://fake-main.test', 'lottery.main_site.wallet_balance_path' => '/wallet/balance', ]); Http::preventStrayRequests(); Http::fake([ 'http://fake-main.test/wallet/balance*' => Http::response([ 'success' => true, 'data' => [ 'main_balance' => 499_900, 'currency_code' => 'NPR', ], ], 200), ]); $player = Player::query()->create([ 'site_code' => 'main-site', 'site_player_id' => '10003', 'username' => null, 'nickname' => null, 'default_currency' => 'NPR', 'status' => 0, ]); $this->withHeader('Authorization', 'Bearer dev:'.$player->id) ->getJson('/api/v1/wallet/balance') ->assertOk() ->assertJsonPath('data.main_balance', 499_900); }); test('wallet balance rejects currency that is not configured or disabled', function () { $player = Player::query()->create([ 'site_code' => 'test', 'site_player_id' => 'p3', 'username' => null, 'nickname' => null, 'default_currency' => 'NPR', 'status' => 0, ]); $this->withHeader('Authorization', 'Bearer dev:'.$player->id) ->getJson('/api/v1/wallet/balance?currency=ABC') ->assertStatus(400) ->assertJsonPath('code', ErrorCode::WalletInvalidCurrency->value); });