| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- <?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_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'], '取消勾选后立即失效');
- }
- }
|