null]); $this->seed(CurrencySeeder::class); $this->seed(LotterySettingsSeeder::class); }); test('wallet logs returns transfer rows and pagination', function () { $player = Player::query()->create([ 'site_code' => 'main', 'site_player_id' => 'wl1', 'username' => null, 'nickname' => null, 'default_currency' => 'NPR', 'status' => 0, ]); $this->withHeader('Authorization', 'Bearer dev:'.$player->id) ->postJson('/api/v1/wallet/transfer-in', [ 'amount' => 300, 'idempotent_key' => 'log-test-1', ]) ->assertOk(); $this->withHeader('Authorization', 'Bearer dev:'.$player->id) ->getJson('/api/v1/wallet/logs?page=1&size=10') ->assertOk() ->assertJsonPath('code', ErrorCode::Success->value) ->assertJsonPath('data.total', 1) ->assertJsonPath('data.items.0.type', 'transfer_in'); expect(WalletTxn::query()->where('player_id', $player->id)->count())->toBe(1); }); test('wallet logs filters by type refund', function () { $player = Player::query()->create([ 'site_code' => 'main', 'site_player_id' => 'wl2', 'default_currency' => 'NPR', 'status' => 0, ]); PlayerWallet::query()->create([ 'player_id' => $player->id, 'wallet_type' => 'lottery', 'currency_code' => 'NPR', 'balance' => 500, 'frozen_balance' => 0, 'status' => 0, 'version' => 0, ]); config(['lottery.main_site.wallet_api_url' => 'http://failure.test']); Http::fake([ 'failure.test/*' => Http::response(['success' => false, 'message' => 'no'], 200), ]); $this->withHeader('Authorization', 'Bearer dev:'.$player->id) ->postJson('/api/v1/wallet/transfer-out', [ 'amount' => 200, 'idempotent_key' => 'out-fail', ]) ->assertStatus(400); $this->withHeader('Authorization', 'Bearer dev:'.$player->id) ->getJson('/api/v1/wallet/logs?type=refund') ->assertOk() ->assertJsonPath('data.total', 1) ->assertJsonPath('data.items.0.type', 'refund'); });