feat: 扩展玩法配置快照字段并切换目录生效来源
This commit is contained in:
@@ -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 + active;audit_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,
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user