|
@@ -89,7 +89,7 @@ class ShareAdminManagementTest extends TestCase
|
|
|
|
|
|
|
|
private function config(array $extra = []): array
|
|
private function config(array $extra = []): array
|
|
|
{
|
|
{
|
|
|
- return array_replace(['enabled' => 1, 'benefit_enabled' => 1, 'share_domain' => 'https://PC.example.com/',
|
|
|
|
|
|
|
+ return array_replace(['enabled' => 1, 'share_domain' => 'https://PC.example.com/',
|
|
|
'valid_member_min_deposit' => '20.00', 'valid_member_min_effective_bet' => '100.00'], $extra);
|
|
'valid_member_min_deposit' => '20.00', 'valid_member_min_effective_bet' => '100.00'], $extra);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -104,22 +104,35 @@ class ShareAdminManagementTest extends TestCase
|
|
|
catch (ValidationException $e) { $this->assertStringContainsString($contains, $e->validator->errors()->first()); }
|
|
catch (ValidationException $e) { $this->assertStringContainsString($contains, $e->validator->errors()->first()); }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ private function assertNoCommissionSwitch(array $settings): void
|
|
|
|
|
+ {
|
|
|
|
|
+ $this->assertArrayNotHasKey('benefit_enabled', $settings);
|
|
|
|
|
+ foreach (['current_policy', 'pending_policy'] as $key) {
|
|
|
|
|
+ if ($settings[$key] !== null) $this->assertArrayNotHasKey('benefit_enabled', $settings[$key]);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
public function test_explicit_setup_and_initializer_gate_enablement(): void
|
|
public function test_explicit_setup_and_initializer_gate_enablement(): void
|
|
|
{
|
|
{
|
|
|
- $this->assertNull($this->admin->settings()['activation_date']);
|
|
|
|
|
|
|
+ $initial = $this->admin->settings();
|
|
|
|
|
+ $this->assertNull($initial['activation_date']);
|
|
|
|
|
+ $this->assertNoCommissionSwitch($initial);
|
|
|
$this->fails(fn () => $this->admin->saveSettings($this->config()), '初始化');
|
|
$this->fails(fn () => $this->admin->saveSettings($this->config()), '初始化');
|
|
|
|
|
+ $this->fails(fn () => $this->admin->saveSettings($this->config(['benefit_enabled' => 0])), '初始化');
|
|
|
$this->assertSame(0, DB::table('share_settings')->count());
|
|
$this->assertSame(0, DB::table('share_settings')->count());
|
|
|
$this->initialized();
|
|
$this->initialized();
|
|
|
$incomplete = $this->config(); unset($incomplete['valid_member_min_effective_bet']);
|
|
$incomplete = $this->config(); unset($incomplete['valid_member_min_effective_bet']);
|
|
|
- $this->fails(fn () => $this->admin->saveSettings($incomplete), 'required_if');
|
|
|
|
|
|
|
+ $this->fails(fn () => $this->admin->saveSettings($incomplete), 'required');
|
|
|
$this->fails(fn () => $this->admin->saveSettings($this->config(['tier_one_rate' => 4])), '已移除');
|
|
$this->fails(fn () => $this->admin->saveSettings($this->config(['tier_one_rate' => 4])), '已移除');
|
|
|
$this->fails(fn () => $this->admin->saveSettings($this->config(['activation_date' => '2020-01-01'])), '不可指定');
|
|
$this->fails(fn () => $this->admin->saveSettings($this->config(['activation_date' => '2020-01-01'])), '不可指定');
|
|
|
$this->fails(fn () => $this->admin->saveSettings($this->config(['share_domain' => 'https://pc.example/a'])), '源地址');
|
|
$this->fails(fn () => $this->admin->saveSettings($this->config(['share_domain' => 'https://pc.example/a'])), '源地址');
|
|
|
$data = $this->admin->saveSettings($this->config());
|
|
$data = $this->admin->saveSettings($this->config());
|
|
|
$this->assertSame('2026-10-25', $data['activation_date']);
|
|
$this->assertSame('2026-10-25', $data['activation_date']);
|
|
|
$this->assertSame('https://pc.example.com', $data['share_domain']);
|
|
$this->assertSame('https://pc.example.com', $data['share_domain']);
|
|
|
- $this->assertSame(0, $data['current_policy']['benefit_enabled']);
|
|
|
|
|
- $this->assertSame(1, $data['pending_policy']['benefit_enabled']);
|
|
|
|
|
|
|
+ $this->assertNoCommissionSwitch($data);
|
|
|
|
|
+ $this->assertSame(0, (int) DB::table('share_policies')->where('id', $data['current_policy']['id'])->value('benefit_enabled'));
|
|
|
|
|
+ $this->assertSame(1, (int) DB::table('share_policies')->where('id', $data['pending_policy']['id'])->value('benefit_enabled'));
|
|
|
|
|
+ $this->assertSame(1, (int) DB::table('share_settings')->value('benefit_enabled'));
|
|
|
$this->assertArrayNotHasKey('tier_one_rate', $data);
|
|
$this->assertArrayNotHasKey('tier_one_rate', $data);
|
|
|
$this->assertArrayNotHasKey('indirect_bonus_rate', $data);
|
|
$this->assertArrayNotHasKey('indirect_bonus_rate', $data);
|
|
|
$this->assertArrayNotHasKey('indirect_bonus_rate', $data['current_policy']);
|
|
$this->assertArrayNotHasKey('indirect_bonus_rate', $data['current_policy']);
|
|
@@ -141,12 +154,87 @@ class ShareAdminManagementTest extends TestCase
|
|
|
$this->admin->saveSettings($this->config(['benefit_enabled' => 0]));
|
|
$this->admin->saveSettings($this->config(['benefit_enabled' => 0]));
|
|
|
$this->admin->saveRateRules('third:2', [['min_valid_members' => 0, 'min_performance' => 10, 'rate' => '0.50']]);
|
|
$this->admin->saveRateRules('third:2', [['min_valid_members' => 0, 'min_performance' => 10, 'rate' => '0.50']]);
|
|
|
$this->assertSame($before, (array)DB::table('share_policies')->where('id', $pendingId)->first());
|
|
$this->assertSame($before, (array)DB::table('share_policies')->where('id', $pendingId)->first());
|
|
|
- $this->assertSame(0, $this->admin->settings()['pending_policy']['benefit_enabled']);
|
|
|
|
|
|
|
+ $settings = $this->admin->settings();
|
|
|
|
|
+ $this->assertNoCommissionSwitch($settings);
|
|
|
|
|
+ $this->assertSame(1, (int) DB::table('share_policies')->where('id', $settings['pending_policy']['id'])->value('benefit_enabled'));
|
|
|
|
|
+ $this->assertSame(1, (int) DB::table('share_policies')->where('id', $settings['current_policy']['id'])->value('benefit_enabled'));
|
|
|
$this->admin->saveSettings($this->config());
|
|
$this->admin->saveSettings($this->config());
|
|
|
$this->assertSame('2026-10-25', $this->admin->settings()['activation_date']);
|
|
$this->assertSame('2026-10-25', $this->admin->settings()['activation_date']);
|
|
|
$this->assertSame(3, DB::table('share_policies')->count());
|
|
$this->assertSame(3, DB::table('share_policies')->count());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ public function test_both_member_thresholds_are_required_and_invalid_values_cannot_create_configuration(): void
|
|
|
|
|
+ {
|
|
|
|
|
+ $this->initialized();
|
|
|
|
|
+ foreach (['valid_member_min_deposit', 'valid_member_min_effective_bet'] as $field) {
|
|
|
|
|
+ foreach ([null, ''] as $value) {
|
|
|
|
|
+ $input = $this->config([$field => $value, 'benefit_enabled' => 0]);
|
|
|
|
|
+ try { $this->admin->saveSettings($input); $this->fail('Expected a required member threshold'); }
|
|
|
|
|
+ catch (ValidationException $e) {
|
|
|
|
|
+ $this->assertArrayHasKey('Required', $e->validator->failed()[$field]);
|
|
|
|
|
+ $this->assertArrayNotHasKey('RequiredIf', $e->validator->failed()[$field]);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ $input = $this->config(['benefit_enabled' => 0]); unset($input[$field]);
|
|
|
|
|
+ try { $this->admin->saveSettings($input); $this->fail('Expected a missing member threshold rejection'); }
|
|
|
|
|
+ catch (ValidationException $e) { $this->assertArrayHasKey('Required', $e->validator->failed()[$field]); }
|
|
|
|
|
+ foreach ([-1, 'invalid', '20.001'] as $value) {
|
|
|
|
|
+ $this->fails(fn () => $this->admin->saveSettings($this->config([$field => $value, 'benefit_enabled' => 0])), 'regex');
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ $this->assertSame(0, DB::table('share_settings')->count());
|
|
|
|
|
+ $this->assertSame(1, DB::table('share_policies')->count());
|
|
|
|
|
+ $this->assertSame(0, DB::table('operation_audits')->count());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public function test_legacy_switch_input_is_ignored_and_cannot_disable_complete_configuration(): void
|
|
|
|
|
+ {
|
|
|
|
|
+ $this->initialized();
|
|
|
|
|
+ $past = (array) DB::table('share_policies')->where('effective_date', '1970-01-01')->first();
|
|
|
|
|
+ $legacyInputs = [[]];
|
|
|
|
|
+ foreach ([0, 1, '0', '1', null, 'obsolete', []] as $value) $legacyInputs[] = ['benefit_enabled' => $value];
|
|
|
|
|
+ foreach ($legacyInputs as $legacyInput) {
|
|
|
|
|
+ $request = Request::create('/admin/shareEarning/settings', 'POST', $this->config($legacyInput + ['enabled' => 0]));
|
|
|
|
|
+ $request->user = (object) ['id' => 8, 'username' => 'admin'];
|
|
|
|
|
+ $this->app->instance('request', $request);
|
|
|
|
|
+ $body = (new ShareEarning())->saveSettings($this->admin)->getData(true);
|
|
|
|
|
+ $this->assertSame(0, $body['code'], $body['msg']);
|
|
|
|
|
+ $this->assertNoCommissionSwitch($body['data']);
|
|
|
|
|
+ $this->assertSame(0, $body['data']['enabled']);
|
|
|
|
|
+ $this->assertSame('2026-10-25', $body['data']['activation_date']);
|
|
|
|
|
+ $this->assertSame(1, (int) DB::table('share_settings')->value('benefit_enabled'));
|
|
|
|
|
+ $this->assertSame(1, (int) DB::table('share_policies')->where('effective_date', '2026-10-25')->value('benefit_enabled'));
|
|
|
|
|
+ }
|
|
|
|
|
+ $this->assertSame(2, DB::table('share_policies')->count());
|
|
|
|
|
+ $this->assertSame($past, (array) DB::table('share_policies')->where('id', $past['id'])->first());
|
|
|
|
|
+ $this->assertArrayNotHasKey('benefit_enabled', ShareSetting::query()->firstOrFail()->toArray());
|
|
|
|
|
+ Carbon::setTestNow(Carbon::parse('2026-10-24 23:59:59', 'Asia/Shanghai'));
|
|
|
|
|
+ $this->assertSame($past['id'], $this->admin->settings()['current_policy']['id']);
|
|
|
|
|
+ Carbon::setTestNow(Carbon::parse('2026-10-25 00:00:00', 'Asia/Shanghai'));
|
|
|
|
|
+ $current = $this->admin->settings();
|
|
|
|
|
+ $this->assertNoCommissionSwitch($current);
|
|
|
|
|
+ $this->assertSame('2026-10-25', $current['current_policy']['effective_date']);
|
|
|
|
|
+ $this->assertSame(1, (int) DB::table('share_policies')->where('id', $current['current_policy']['id'])->value('benefit_enabled'));
|
|
|
|
|
+ $this->assertNull($current['pending_policy']);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public function test_existing_disabled_configuration_remains_unchanged_until_a_complete_save(): void
|
|
|
|
|
+ {
|
|
|
|
|
+ $id = DB::table('share_settings')->insertGetId(['benefit_enabled' => 0, 'share_domain' => 'https://legacy.example.test']);
|
|
|
|
|
+ $before = (array) DB::table('share_settings')->where('id', $id)->first();
|
|
|
|
|
+ $this->assertNoCommissionSwitch($this->admin->settings());
|
|
|
|
|
+ $this->assertArrayNotHasKey('benefit_enabled', ShareSetting::query()->findOrFail($id)->toArray());
|
|
|
|
|
+ $this->assertSame($before, (array) DB::table('share_settings')->where('id', $id)->first());
|
|
|
|
|
+ $this->fails(fn () => $this->admin->saveSettings($this->config(['benefit_enabled' => 1])), '初始化');
|
|
|
|
|
+ $this->assertSame($before, (array) DB::table('share_settings')->where('id', $id)->first());
|
|
|
|
|
+ $this->initialized();
|
|
|
|
|
+ $saved = $this->admin->saveSettings($this->config(['benefit_enabled' => 0]));
|
|
|
|
|
+ $this->assertNoCommissionSwitch($saved);
|
|
|
|
|
+ $this->assertSame(1, (int) DB::table('share_settings')->where('id', $id)->value('benefit_enabled'));
|
|
|
|
|
+ $this->assertSame('2026-10-25', $saved['activation_date']);
|
|
|
|
|
+ $this->assertSame(0, (int) DB::table('share_policies')->where('id', $saved['current_policy']['id'])->value('benefit_enabled'));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
public function test_retired_indirect_coefficient_is_rejected_even_when_null_without_saving(): void
|
|
public function test_retired_indirect_coefficient_is_rejected_even_when_null_without_saving(): void
|
|
|
{
|
|
{
|
|
|
$this->initialized();
|
|
$this->initialized();
|
|
@@ -179,6 +267,7 @@ class ShareAdminManagementTest extends TestCase
|
|
|
$model = ShareSetting::query()->firstOrFail();
|
|
$model = ShareSetting::query()->firstOrFail();
|
|
|
$this->assertArrayNotHasKey('indirect_bonus_rate', $model->getCasts());
|
|
$this->assertArrayNotHasKey('indirect_bonus_rate', $model->getCasts());
|
|
|
$this->assertArrayNotHasKey('indirect_bonus_rate', $model->toArray());
|
|
$this->assertArrayNotHasKey('indirect_bonus_rate', $model->toArray());
|
|
|
|
|
+ $this->assertArrayNotHasKey('benefit_enabled', $model->toArray());
|
|
|
|
|
|
|
|
$rules = $this->admin->saveRateRules('third:1', [['min_valid_members' => 0, 'min_performance' => 0, 'rate' => '10']]);
|
|
$rules = $this->admin->saveRateRules('third:1', [['min_valid_members' => 0, 'min_performance' => 0, 'rate' => '10']]);
|
|
|
$this->assertSame('10.0000', $rules['categories'][0]['pending_rules'][0]['rate']);
|
|
$this->assertSame('10.0000', $rules['categories'][0]['pending_rules'][0]['rate']);
|
|
@@ -208,10 +297,11 @@ class ShareAdminManagementTest extends TestCase
|
|
|
$t->id(); $t->date('stat_date'); $t->integer('status');
|
|
$t->id(); $t->date('stat_date'); $t->integer('status');
|
|
|
});
|
|
});
|
|
|
DB::table('config')->insert(['field' => 'recharge_rate', 'val' => '2.5000']);
|
|
DB::table('config')->insert(['field' => 'recharge_rate', 'val' => '2.5000']);
|
|
|
- DB::table('share_settings')->insert(['indirect_bonus_rate' => '30', 'valid_member_min_effective_bet' => '100']);
|
|
|
|
|
|
|
+ DB::table('share_settings')->insert(['benefit_enabled' => 1, 'indirect_bonus_rate' => '30', 'valid_member_min_effective_bet' => '100']);
|
|
|
$before = (array) DB::table('share_settings')->first();
|
|
$before = (array) DB::table('share_settings')->first();
|
|
|
$data = (new ShareCommissionDiagnostics())->inspect(null);
|
|
$data = (new ShareCommissionDiagnostics())->inspect(null);
|
|
|
$this->assertArrayNotHasKey('indirect_bonus_rate', $data);
|
|
$this->assertArrayNotHasKey('indirect_bonus_rate', $data);
|
|
|
|
|
+ $this->assertArrayNotHasKey('benefit_enabled', $data);
|
|
|
$this->assertEquals('100', $data['valid_member_min_effective_bet']);
|
|
$this->assertEquals('100', $data['valid_member_min_effective_bet']);
|
|
|
$command = new BackfillShareCommissions();
|
|
$command = new BackfillShareCommissions();
|
|
|
$command->setLaravel($this->app);
|
|
$command->setLaravel($this->app);
|
|
@@ -219,6 +309,7 @@ class ShareAdminManagementTest extends TestCase
|
|
|
$tester->execute(['--diagnose' => true, '--all' => true]);
|
|
$tester->execute(['--diagnose' => true, '--all' => true]);
|
|
|
$this->assertSame(0, $tester->getStatusCode(), $tester->getDisplay());
|
|
$this->assertSame(0, $tester->getStatusCode(), $tester->getDisplay());
|
|
|
$this->assertStringNotContainsString('indirect_bonus_rate', $tester->getDisplay());
|
|
$this->assertStringNotContainsString('indirect_bonus_rate', $tester->getDisplay());
|
|
|
|
|
+ $this->assertStringNotContainsString('benefit_enabled', $tester->getDisplay());
|
|
|
$this->assertStringContainsString('valid_member_min_effective_bet: 100', $tester->getDisplay());
|
|
$this->assertStringContainsString('valid_member_min_effective_bet: 100', $tester->getDisplay());
|
|
|
$this->assertSame($before, (array) DB::table('share_settings')->first());
|
|
$this->assertSame($before, (array) DB::table('share_settings')->first());
|
|
|
$this->assertSame(0, DB::table('share_commission_records')->count());
|
|
$this->assertSame(0, DB::table('share_commission_records')->count());
|
|
@@ -233,8 +324,9 @@ class ShareAdminManagementTest extends TestCase
|
|
|
$this->assertSame(1, DB::table('share_policies')->count());
|
|
$this->assertSame(1, DB::table('share_policies')->count());
|
|
|
$saved = $this->admin->saveSettings($this->config(['enabled' => 0, 'valid_member_min_deposit' => '20.12']));
|
|
$saved = $this->admin->saveSettings($this->config(['enabled' => 0, 'valid_member_min_deposit' => '20.12']));
|
|
|
$this->assertSame(0, $saved['enabled']);
|
|
$this->assertSame(0, $saved['enabled']);
|
|
|
- $this->assertSame(1, $saved['benefit_enabled']);
|
|
|
|
|
- $this->assertSame(1, $saved['pending_policy']['benefit_enabled']);
|
|
|
|
|
|
|
+ $this->assertNoCommissionSwitch($saved);
|
|
|
|
|
+ $this->assertSame(1, (int) DB::table('share_settings')->value('benefit_enabled'));
|
|
|
|
|
+ $this->assertSame(1, (int) DB::table('share_policies')->where('id', $saved['pending_policy']['id'])->value('benefit_enabled'));
|
|
|
$this->assertSame('20.12', $saved['pending_policy']['valid_member_min_deposit']);
|
|
$this->assertSame('20.12', $saved['pending_policy']['valid_member_min_deposit']);
|
|
|
$this->assertSame('20.12', $saved['valid_member_min_deposit']);
|
|
$this->assertSame('20.12', $saved['valid_member_min_deposit']);
|
|
|
$this->assertSame('20.1200000000', bcadd((string)DB::table('share_policies')->where('effective_date', '2026-10-25')->value('valid_member_min_deposit'), '0', 10));
|
|
$this->assertSame('20.1200000000', bcadd((string)DB::table('share_policies')->where('effective_date', '2026-10-25')->value('valid_member_min_deposit'), '0', 10));
|