instance('config', new Repository(['operations' => ['admin_ids' => [1, 9]]])); Facade::setFacadeApplication($app); $db = new Manager($app); $db->addConnection(['driver' => 'sqlite', 'database' => ':memory:', 'prefix' => 'bot_']); $db->setEventDispatcher(new Dispatcher($app)); $db->setAsGlobal(); $db->bootEloquent(); $app->instance('db', $db->getDatabaseManager()); $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, status 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' => 'maintenance', 'type' => 1, 'status' => 1], ['id' => 2, 'uri' => 'admin/maintenance', 'type' => 2, 'status' => 1], ['id' => 3, 'uri' => 'admin/maintenance/submit', 'type' => 2, 'status' => 0], ]); // 角色 10:只有页面菜单;11:维护列表按钮;12:保存按钮(隐藏状态也算授权) DB::table('role_menu')->insert([['role_id' => 10, 'menu_id' => 1], ['role_id' => 11, 'menu_id' => 2], ['role_id' => 12, 'menu_id' => 3]]); 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' => 11, 'user_id' => 4]]); } protected function tearDown(): void { DB::disconnect(); Facade::clearResolvedInstances(); parent::tearDown(); } private function call(int $adminId, string $uri, ?string $permissionUri = null) { $request = Request::create('/' . $uri); $request->user = (object) ['id' => $adminId]; $route = new Route('GET', $uri, []); if ($permissionUri !== null) $route->defaults('permission_uri', $permissionUri); $request->setRouteResolver(fn () => $route); $result = (new OperationsAdminMiddleware())->handle($request, static fn () => 'passed'); return $result === 'passed' ? $result : $result->getData(true)['msg']; } public function test_super_admin_or_role_with_the_route_button_passes(): void { $this->assertSame('passed', $this->call(1, 'admin/maintenance')); $this->assertSame('无运营配置管理权限', $this->call(9, 'admin/maintenance'), '不再读 OPERATIONS_ADMIN_IDS'); $this->assertSame('无运营配置管理权限', $this->call(0, 'admin/maintenance')); $this->assertSame('无运营配置管理权限', $this->call(2, 'admin/maintenance'), '只勾页面菜单不够,要勾接口按钮'); $this->assertSame('passed', $this->call(3, 'admin/maintenance')); $this->assertSame('passed', $this->call(3, 'admin/maintenance/detail', 'admin/maintenance'), 'permission_uri 复用列表按钮'); $this->assertSame('无运营配置管理权限', $this->call(3, 'admin/maintenance/submit')); $this->assertSame('passed', $this->call(4, 'admin/maintenance/submit')); $this->assertSame('passed', $this->call(3, 'admin/maintenance/logs'), '按钮没建时跟随同模块授权'); $this->assertSame('无运营配置管理权限', $this->call(2, 'admin/maintenance/logs'), '只有前端页面菜单不算模块授权'); $this->assertSame('无运营配置管理权限', $this->call(3, 'admin/paymentConfig/direct/save'), '其他模块没有授权'); $this->assertSame('无运营配置管理权限', $this->call(3, 'admin/maintenanceX/logs'), '前缀相似但不是同一模块'); DB::table('role_menu')->where('role_id', 11)->delete(); $this->assertSame('无运营配置管理权限', $this->call(3, 'admin/maintenance'), '取消勾选后立即失效'); } }