feat: 重构注单控制器以复用共享筛选逻辑
新增 TicketItemListFilters trait,用于封装注单列表的通用筛选逻辑。 更新 AdminPlayerTicketItemsIndexController、AdminTicketItemIndexController 与 TicketItemsIndexController,统一使用新的注单编号搜索与订单日期范围筛选方法,提升代码复用性与可读性。 增强 AdminRiskPoolManualStatusController:支持发布手动停售状态变更通知。 优化 RiskPoolService 与 TicketWalletService:钱包资金变动后实时通知余额更新。 更新测试用例,确保重构后功能行为保持一致。
This commit is contained in:
129
tests/Feature/PlayerRealtimeBroadcastTest.php
Normal file
129
tests/Feature/PlayerRealtimeBroadcastTest.php
Normal file
@@ -0,0 +1,129 @@
|
||||
<?php
|
||||
|
||||
use App\Events\BalanceUpdateBroadcast;
|
||||
use App\Events\RiskSoldOutBroadcast;
|
||||
use App\Events\RiskWarningBroadcast;
|
||||
use App\Models\Draw;
|
||||
use App\Models\Player;
|
||||
use App\Models\PlayerWallet;
|
||||
use App\Models\RiskPool;
|
||||
use App\Services\Ticket\RiskPoolService;
|
||||
use App\Services\Wallet\LotteryTransferService;
|
||||
use App\Services\Wallet\WalletBalanceRealtimeNotifier;
|
||||
use Database\Seeders\CurrencySeeder;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Illuminate\Support\Facades\Event;
|
||||
|
||||
uses(RefreshDatabase::class);
|
||||
|
||||
beforeEach(function (): void {
|
||||
config(['broadcasting.default' => 'reverb']);
|
||||
$this->seed(CurrencySeeder::class);
|
||||
});
|
||||
|
||||
test('wallet balance notifier dispatches balance update broadcast', function (): void {
|
||||
Event::fake([BalanceUpdateBroadcast::class]);
|
||||
|
||||
$player = Player::query()->create([
|
||||
'site_code' => 'test',
|
||||
'site_player_id' => 'ws-p1',
|
||||
'username' => null,
|
||||
'nickname' => null,
|
||||
'default_currency' => 'NPR',
|
||||
'status' => 0,
|
||||
]);
|
||||
|
||||
$wallet = PlayerWallet::query()->create([
|
||||
'player_id' => $player->id,
|
||||
'wallet_type' => 'lottery',
|
||||
'currency_code' => 'NPR',
|
||||
'balance' => 10_000,
|
||||
'frozen_balance' => 0,
|
||||
'status' => 0,
|
||||
'version' => 0,
|
||||
]);
|
||||
|
||||
app(WalletBalanceRealtimeNotifier::class)->notifyAfterMovement($wallet, -500, 'bet_deduct');
|
||||
|
||||
Event::assertDispatched(
|
||||
BalanceUpdateBroadcast::class,
|
||||
fn (BalanceUpdateBroadcast $event): bool => $event->playerId === $player->id
|
||||
&& $event->currencyCode === 'NPR'
|
||||
&& $event->balanceMinor === 10_000
|
||||
&& $event->changeMinor === -500
|
||||
&& $event->reason === 'bet',
|
||||
);
|
||||
});
|
||||
|
||||
test('risk pool acquire dispatches warning and sold out broadcasts', function (): void {
|
||||
Event::fake([RiskWarningBroadcast::class, RiskSoldOutBroadcast::class]);
|
||||
|
||||
$draw = Draw::query()->create([
|
||||
'draw_no' => '20260526-001',
|
||||
'business_date' => '2026-05-26',
|
||||
'sequence_no' => 1,
|
||||
'status' => 'open',
|
||||
'start_time' => now()->subHour(),
|
||||
'close_time' => now()->addHour(),
|
||||
'draw_time' => now()->addHours(2),
|
||||
'cooling_end_time' => null,
|
||||
'result_source' => null,
|
||||
'current_result_version' => 0,
|
||||
'settle_version' => 0,
|
||||
'is_reopened' => false,
|
||||
]);
|
||||
|
||||
RiskPool::query()->create([
|
||||
'draw_id' => $draw->id,
|
||||
'normalized_number' => '1234',
|
||||
'total_cap_amount' => 1000,
|
||||
'locked_amount' => 750,
|
||||
'remaining_amount' => 250,
|
||||
'sold_out_status' => 0,
|
||||
'version' => 0,
|
||||
]);
|
||||
|
||||
app(RiskPoolService::class)->acquire($draw->id, null, [
|
||||
['number_4d' => '1234', 'amount' => 250],
|
||||
]);
|
||||
|
||||
Event::assertDispatched(
|
||||
RiskWarningBroadcast::class,
|
||||
fn (RiskWarningBroadcast $event): bool => $event->drawId === $draw->id
|
||||
&& $event->drawNo === '20260526-001'
|
||||
&& $event->normalizedNumber === '1234',
|
||||
);
|
||||
|
||||
Event::assertDispatched(
|
||||
RiskSoldOutBroadcast::class,
|
||||
fn (RiskSoldOutBroadcast $event): bool => $event->drawId === $draw->id
|
||||
&& $event->normalizedNumber === '1234',
|
||||
);
|
||||
});
|
||||
|
||||
test('transfer in dispatches balance update after success', function (): void {
|
||||
Event::fake([BalanceUpdateBroadcast::class]);
|
||||
|
||||
$player = Player::query()->create([
|
||||
'site_code' => 'test',
|
||||
'site_player_id' => 'ws-p2',
|
||||
'username' => null,
|
||||
'nickname' => null,
|
||||
'default_currency' => 'NPR',
|
||||
'status' => 0,
|
||||
]);
|
||||
|
||||
PlayerWallet::query()->create([
|
||||
'player_id' => $player->id,
|
||||
'wallet_type' => 'lottery',
|
||||
'currency_code' => 'NPR',
|
||||
'balance' => 0,
|
||||
'frozen_balance' => 0,
|
||||
'status' => 0,
|
||||
'version' => 0,
|
||||
]);
|
||||
|
||||
app(LotteryTransferService::class)->transferIn($player, 'NPR', 500, 'idem-ws-'.uniqid('', true));
|
||||
|
||||
Event::assertDispatched(BalanceUpdateBroadcast::class);
|
||||
});
|
||||
Reference in New Issue
Block a user