|
|
@@ -0,0 +1,75 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace Tests\Integration;
|
|
|
+
|
|
|
+use App\Http\Middleware\AgentAdminMiddleware;
|
|
|
+use App\Services\Agent\AgentAdminAccess;
|
|
|
+use Illuminate\Config\Repository;
|
|
|
+use Illuminate\Database\Capsule\Manager;
|
|
|
+use Illuminate\Events\Dispatcher;
|
|
|
+use Illuminate\Foundation\Application;
|
|
|
+use Illuminate\Http\Request;
|
|
|
+use Illuminate\Support\Facades\DB;
|
|
|
+use Illuminate\Support\Facades\Facade;
|
|
|
+use PHPUnit\Framework\TestCase;
|
|
|
+
|
|
|
+class AgentAdminAccessTest extends TestCase
|
|
|
+{
|
|
|
+ private Application $app;
|
|
|
+
|
|
|
+ protected function setUp(): void
|
|
|
+ {
|
|
|
+ Facade::clearResolvedInstances(); $this->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_whitelist_or_role_with_agent_menu_grants_access(): void
|
|
|
+ {
|
|
|
+ $this->assertTrue(AgentAdminAccess::allowed(1));
|
|
|
+ $this->assertTrue(AgentAdminAccess::allowed(9), '白名单内的管理员不需要角色');
|
|
|
+ $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'], '取消勾选后立即失效');
|
|
|
+ }
|
|
|
+}
|