artisan('lottery:admin-auth-sync')->assertExitCode(0); }); test('agent dashboard returns agent overview for operator with dashboard permission', function (): void { $siteId = (int) DB::table('admin_sites')->where('is_default', true)->value('id'); $rootId = (int) DB::table('agent_nodes')->where('admin_site_id', $siteId)->where('depth', 0)->value('id'); $service = app(\App\Services\Agent\AgentNodeService::class); $super = AdminUser::query()->create([ 'username' => 'super_dash_agent', 'name' => 'Super', 'email' => null, 'password' => Hash::make('secret-strong'), 'status' => 0, ]); grantSuperAdminRole($super); $branch = $service->createChild($super, [ 'parent_id' => $rootId, 'code' => 'dash-branch', 'name' => 'Dash Branch', 'can_create_player' => true, ]); $operator = AdminUser::query()->where('username', 'agent_'.$branch->code)->first(); if ($operator === null) { $operator = AdminUser::query() ->whereIn('id', DB::table('admin_user_agents')->where('agent_node_id', $branch->id)->pluck('admin_user_id')) ->first(); } expect($operator)->not->toBeNull(); $platformRoleId = AgentPlatformRole::id(); $boundRoleId = (int) DB::table('admin_user_agent_roles') ->where('admin_user_id', $operator->id) ->where('agent_node_id', $branch->id) ->value('role_id'); expect($boundRoleId)->toBe($platformRoleId); $slugs = DB::table('admin_role_menu_actions as rma') ->join('admin_menu_actions as ma', 'ma.id', '=', 'rma.menu_action_id') ->where('rma.role_id', $platformRoleId) ->pluck('ma.permission_code') ->all(); expect(in_array('dashboard.view', $slugs, true))->toBeTrue(); $token = $operator->createToken('test', ['*'], now()->addDay())->plainTextToken; $this->withHeader('Authorization', 'Bearer '.$token) ->getJson('/api/v1/admin/dashboard') ->assertOk() ->assertJsonPath('data.agent_overview.agent_node_id', $branch->id) ->assertJsonPath('data.agent_overview.agent_code', 'dash-branch'); });