feat: 扩展玩法配置快照字段并切换目录生效来源

This commit is contained in:
2026-05-16 10:27:59 +08:00
parent f7f6c58b02
commit 7daf0c3bba
15 changed files with 254 additions and 47 deletions

View File

@@ -3,7 +3,7 @@
/**
* 验收自动化(对应测试任务 §5 / 完成标准 §12.6
*
* - 配置改动是否生效 赔率 / 玩法限额发布后 GET /api/v1/play/effective 可读出新值;PATCH play-types 可改目录开关
* - 配置改动是否生效 赔率 / 玩法限额发布后 GET /api/v1/play/effective 可读出新值;玩法目录开关随版本草稿发布后生效
* - 配置改动是否影响已下注订单 ticket_items 行的 odds_snapshot_json 不因新赔率版本发布而被改写(注单链路尚未实现时,用数据不变量验证)。
* - 配置历史是否可追溯 odds_versions 存在 archived + activeaudit_logs 记录 publish。
*
@@ -73,10 +73,18 @@ test('§12.6 published play limits are visible on public effective catalog witho
foreach (PlayType::query()->orderBy('play_code')->get() as $t) {
$itemPayload[] = [
'play_code' => $t->play_code,
'category' => $t->category,
'dimension' => $t->dimension,
'bet_mode' => $t->bet_mode,
'display_name_zh' => $t->display_name_zh ?? $t->play_code,
'display_name_en' => $t->display_name_en,
'display_name_ne' => $t->display_name_ne,
'is_enabled' => true,
'min_bet_amount' => 777,
'max_bet_amount' => 400_000_000,
'display_order' => (int) $t->sort_order,
'supports_multi_number' => (bool) $t->supports_multi_number,
'reserved_rule_json' => $t->reserved_rule_json,
];
}
@@ -245,16 +253,47 @@ test('§5 existing ticket_items odds snapshot row is not mutated when new odds v
expect($plays->firstWhere('play_code', 'big')['odds']['odds_value'])->toBe(9_999_999);
});
test('§12.6 PATCH play-types controls master_enabled on public catalog without code deploy', function (): void {
test('§12.6 published play config controls master_enabled on public catalog without code deploy', function (): void {
$token = acceptanceMintAdminToken();
$auth = ['Authorization' => 'Bearer '.$token];
$this->patchJson('/api/v1/admin/play-types/big', ['is_enabled' => false], $auth)->assertOk();
$create = $this->postJson('/api/v1/admin/config/play-versions', ['reason' => 'acceptance master'], $auth);
$create->assertOk();
$draftId = (int) $create->json('data.id');
$rows = $this->getJson('/api/v1/admin/config/play-versions/'.$draftId, $auth)->assertOk()->json('data.items');
$payload = collect($rows)->map(fn (array $r) => [
'play_code' => $r['play_code'],
'category' => $r['category'],
'dimension' => $r['dimension'],
'bet_mode' => $r['bet_mode'],
'display_name_zh' => $r['display_name_zh'],
'display_name_en' => $r['display_name_en'],
'display_name_ne' => $r['display_name_ne'],
'is_enabled' => $r['is_enabled'],
'min_bet_amount' => (int) $r['min_bet_amount'],
'max_bet_amount' => (int) $r['max_bet_amount'],
'display_order' => (int) $r['display_order'],
'supports_multi_number' => (bool) $r['supports_multi_number'],
'reserved_rule_json' => $r['reserved_rule_json'] ?? null,
'rule_text_zh' => $r['rule_text_zh'] ?? null,
'rule_text_en' => $r['rule_text_en'] ?? null,
'rule_text_ne' => $r['rule_text_ne'] ?? null,
'extra_config_json' => $r['extra_config_json'] ?? null,
])->all();
foreach ($payload as &$row) {
if ($row['play_code'] === 'big') {
$row['is_enabled'] = false;
}
}
unset($row);
$this->putJson('/api/v1/admin/config/play-versions/'.$draftId.'/items', ['items' => $payload], $auth)->assertOk();
$this->postJson('/api/v1/admin/config/play-versions/'.$draftId.'/publish', [], $auth)->assertOk();
$plays = collect($this->getJson('/api/v1/play/effective?currency=NPR')->assertOk()->json('data.plays'));
expect($plays->firstWhere('play_code', 'big')['master_enabled'])->toBeFalse();
$this->patchJson('/api/v1/admin/play-types/big', ['is_enabled' => true], $auth)->assertOk();
});
test('§5 risk cap publish is audited and version history exists', function (): void {
@@ -303,10 +342,18 @@ test('§5 play_config publish is audited', function (): void {
foreach (PlayType::query()->orderBy('play_code')->get() as $t) {
$itemPayload[] = [
'play_code' => $t->play_code,
'category' => $t->category,
'dimension' => $t->dimension,
'bet_mode' => $t->bet_mode,
'display_name_zh' => $t->display_name_zh ?? $t->play_code,
'display_name_en' => $t->display_name_en,
'display_name_ne' => $t->display_name_ne,
'is_enabled' => true,
'min_bet_amount' => 100,
'max_bet_amount' => 500_000_000,
'display_order' => (int) $t->sort_order,
'supports_multi_number' => (bool) $t->supports_multi_number,
'reserved_rule_json' => $t->reserved_rule_json,
];
}

View File

@@ -75,10 +75,18 @@ test('admin play config draft publish flow', function (): void {
foreach ($types as $t) {
$itemPayload[] = [
'play_code' => $t->play_code,
'category' => $t->category,
'dimension' => $t->dimension,
'bet_mode' => $t->bet_mode,
'display_name_zh' => $t->display_name_zh ?? $t->play_code,
'display_name_en' => $t->display_name_en,
'display_name_ne' => $t->display_name_ne,
'is_enabled' => true,
'min_bet_amount' => 200,
'max_bet_amount' => 400_000_000,
'display_order' => (int) $t->sort_order,
'supports_multi_number' => (bool) $t->supports_multi_number,
'reserved_rule_json' => $t->reserved_rule_json,
];
}