app = new Application(dirname(__DIR__, 2)); $this->app->instance('config', new Repository(['agent' => ['admin_ids' => [1, 9]]]) /* 旧白名单配置已不再生效 */); Facade::setFacadeApplication($this->app); $db = new Manager($this->app); $db->addConnection(['driver' => 'sqlite', 'database' => ':memory:', 'prefix' => 'bot_']); $db->setEventDispatcher(new Dispatcher($this->app)); $db->setAsGlobal(); $db->bootEloquent(); $this->app->instance('db', $db->getDatabaseManager()); $this->app->instance(\Illuminate\Contracts\Routing\ResponseFactory::class, new \Tests\Support\JsonResponseFactory()); DB::statement('CREATE TABLE bot_menus (id INTEGER PRIMARY KEY, uri TEXT, type INTEGER)'); DB::statement('CREATE TABLE bot_role_menu (role_id INTEGER, menu_id INTEGER)'); DB::statement('CREATE TABLE bot_role_user (role_id INTEGER, user_id INTEGER)'); DB::table('menus')->insert([ ['id' => 1, 'uri' => 'user', 'type' => 1], ['id' => 2, 'uri' => 'admin/user', 'type' => 2], ['id' => 3, 'uri' => 'agentSettings', 'type' => 1], ['id' => 4, 'uri' => 'admin/agent', 'type' => 2], ['id' => 5, 'uri' => 'admin/agent/recharges/audit', 'type' => 2], ['id' => 6, 'uri' => 'admin/agentless', 'type' => 2], ]); // 角色 10:只有会员菜单;11:代理页面菜单;12:代理列表按钮;13:代理子按钮;14:前缀相似但不属于代理 DB::table('role_menu')->insert([ ['role_id' => 10, 'menu_id' => 1], ['role_id' => 10, 'menu_id' => 2], ['role_id' => 11, 'menu_id' => 3], ['role_id' => 12, 'menu_id' => 4], ['role_id' => 13, 'menu_id' => 5], ['role_id' => 14, 'menu_id' => 6], ]); DB::table('role_user')->insert([ ['role_id' => 10, 'user_id' => 2], ['role_id' => 11, 'user_id' => 3], ['role_id' => 12, 'user_id' => 4], ['role_id' => 13, 'user_id' => 5], ['role_id' => 14, 'user_id' => 6], ['role_id' => 10, 'user_id' => 7], ['role_id' => 12, 'user_id' => 7], ]); } protected function tearDown(): void { DB::disconnect(); Facade::clearResolvedInstances(); parent::tearDown(); } public function test_super_admin_or_role_with_agent_menu_grants_access(): void { $this->assertTrue(AgentAdminAccess::allowed(1)); $this->assertFalse(AgentAdminAccess::allowed(9), '不再读 AGENT_ADMIN_IDS,只看数据库角色'); $this->assertFalse(AgentAdminAccess::allowed(0)); $this->assertFalse(AgentAdminAccess::allowed(8), '没有角色'); $this->assertFalse(AgentAdminAccess::allowed(2), '角色没有勾选代理菜单'); $this->assertTrue(AgentAdminAccess::allowed(3), '勾选代理页面菜单'); $this->assertTrue(AgentAdminAccess::allowed(4), '勾选代理列表按钮'); $this->assertTrue(AgentAdminAccess::allowed(5), '勾选代理子按钮'); $this->assertFalse(AgentAdminAccess::allowed(6), 'admin/agentless 不属于代理模块'); $this->assertTrue(AgentAdminAccess::allowed(7), '多个角色中任一个有代理菜单即可'); } public function test_middleware_follows_role_menus(): void { $call = function (int $adminId) { $request = Request::create('/admin/agent'); $request->user = (object) ['id' => $adminId]; return (new AgentAdminMiddleware())->handle($request, static fn () => 'passed'); }; $this->assertSame('passed', $call(4)); $this->assertSame('无代理管理权限', $call(2)->getData(true)['msg']); DB::table('role_menu')->where('role_id', 12)->delete(); $this->assertSame('无代理管理权限', $call(4)->getData(true)['msg'], '取消勾选后立即失效'); } }