fix(core): harden settlement and wallet integration

This commit is contained in:
wchino
2026-07-22 01:40:37 +08:00
parent 150c3e7ebd
commit 35f6e46958
54 changed files with 2564 additions and 359 deletions

View File

@@ -2,9 +2,24 @@
use Tests\TestCase;
use App\Models\AdminUser;
use App\Models\AgentProfile;
use Illuminate\Support\Carbon;
use App\Support\SuperAdminAccount;
use Illuminate\Support\Facades\DB;
use App\Events\OddsUpdateBroadcast;
use App\Events\PlayToggleBroadcast;
use App\Events\RiskSoldOutBroadcast;
use App\Events\RiskWarningBroadcast;
use App\Support\PlatformSystemRoles;
use App\Events\JackpotBurstBroadcast;
use App\Events\BalanceUpdateBroadcast;
use App\Events\DrawCountdownBroadcast;
use Illuminate\Support\Facades\Schema;
use App\Contracts\WalletApiDnsResolver;
use App\Events\DrawStatusChangeBroadcast;
use App\Events\PlayCatalogUpdatedBroadcast;
use App\Events\DrawResultPublishedBroadcast;
use App\Support\Integration\WalletApiRequestGuard;
use Illuminate\Foundation\Testing\RefreshDatabase;
/*
@@ -53,8 +68,8 @@ expect()->extend('toBeOne', function () {
/** 为后台测试账号挂上唯一超级管理员(不绑定站点)。 */
function grantSuperAdminRole(AdminUser $admin): void
{
\App\Support\PlatformSystemRoles::ensureSuperAdminRole();
\App\Support\SuperAdminAccount::assign($admin);
PlatformSystemRoles::ensureSuperAdminRole();
SuperAdminAccount::assign($admin);
}
/** 为后台测试账号挂上代理节点(需已存在 agent_nodes / admin_user_agents 表)。 */
@@ -76,6 +91,37 @@ function agentChildPayload(array $overrides = []): array
], $overrides);
}
/**
* 为钱包 HTTP 测试提供离线 DNS避免测试依赖机器或公网解析状态。
*
* @param array<string, list<string>> $recordsByHost
* @param list<string> $defaultRecords
*/
function fakeWalletApiDns(
array $recordsByHost = [],
array $defaultRecords = ['93.184.216.34'],
): void {
app()->instance(WalletApiDnsResolver::class, new class($recordsByHost, $defaultRecords) implements WalletApiDnsResolver
{
/**
* @param array<string, list<string>> $recordsByHost
* @param list<string> $defaultRecords
*/
public function __construct(
private readonly array $recordsByHost,
private readonly array $defaultRecords,
) {}
public function resolveAll(string $hostname): array
{
return $this->recordsByHost[$hostname] ?? $this->defaultRecords;
}
});
// Guard 可能已在当前测试中解析过,清除后确保使用刚绑定的 DNS resolver。
app()->forgetInstance(WalletApiRequestGuard::class);
}
function bindAdminUserToAgent(AdminUser $admin, int $agentNodeId): void
{
DB::table('admin_user_agents')->updateOrInsert(
@@ -96,7 +142,7 @@ function ensureRootAgentProfileSeeded(): void
return;
}
\App\Models\AgentProfile::query()->updateOrCreate(
AgentProfile::query()->updateOrCreate(
['agent_node_id' => (int) $rootId],
[
'total_share_rate' => 100,
@@ -154,15 +200,15 @@ function ensureAdminActionCatalogSeeded(): void
function allBroadcastEvents(): array
{
return [
\App\Events\BalanceUpdateBroadcast::class,
\App\Events\DrawCountdownBroadcast::class,
\App\Events\DrawResultPublishedBroadcast::class,
\App\Events\DrawStatusChangeBroadcast::class,
\App\Events\JackpotBurstBroadcast::class,
\App\Events\OddsUpdateBroadcast::class,
\App\Events\PlayCatalogUpdatedBroadcast::class,
\App\Events\PlayToggleBroadcast::class,
\App\Events\RiskSoldOutBroadcast::class,
\App\Events\RiskWarningBroadcast::class,
BalanceUpdateBroadcast::class,
DrawCountdownBroadcast::class,
DrawResultPublishedBroadcast::class,
DrawStatusChangeBroadcast::class,
JackpotBurstBroadcast::class,
OddsUpdateBroadcast::class,
PlayCatalogUpdatedBroadcast::class,
PlayToggleBroadcast::class,
RiskSoldOutBroadcast::class,
RiskWarningBroadcast::class,
];
}