AgentAdminAccessTest.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. <?php
  2. namespace Tests\Integration;
  3. use App\Http\Middleware\AgentAdminMiddleware;
  4. use App\Services\Agent\AgentAdminAccess;
  5. use Illuminate\Config\Repository;
  6. use Illuminate\Database\Capsule\Manager;
  7. use Illuminate\Events\Dispatcher;
  8. use Illuminate\Foundation\Application;
  9. use Illuminate\Http\Request;
  10. use Illuminate\Support\Facades\DB;
  11. use Illuminate\Support\Facades\Facade;
  12. use PHPUnit\Framework\TestCase;
  13. class AgentAdminAccessTest extends TestCase
  14. {
  15. private Application $app;
  16. protected function setUp(): void
  17. {
  18. Facade::clearResolvedInstances(); $this->app = new Application(dirname(__DIR__, 2));
  19. $this->app->instance('config', new Repository(['agent' => ['admin_ids' => [1, 9]]]) /* 旧白名单配置已不再生效 */);
  20. Facade::setFacadeApplication($this->app);
  21. $db = new Manager($this->app); $db->addConnection(['driver' => 'sqlite', 'database' => ':memory:', 'prefix' => 'bot_']);
  22. $db->setEventDispatcher(new Dispatcher($this->app)); $db->setAsGlobal(); $db->bootEloquent();
  23. $this->app->instance('db', $db->getDatabaseManager());
  24. $this->app->instance(\Illuminate\Contracts\Routing\ResponseFactory::class, new \Tests\Support\JsonResponseFactory());
  25. DB::statement('CREATE TABLE bot_menus (id INTEGER PRIMARY KEY, uri TEXT, type INTEGER)');
  26. DB::statement('CREATE TABLE bot_role_menu (role_id INTEGER, menu_id INTEGER)');
  27. DB::statement('CREATE TABLE bot_role_user (role_id INTEGER, user_id INTEGER)');
  28. DB::table('menus')->insert([
  29. ['id' => 1, 'uri' => 'user', 'type' => 1], ['id' => 2, 'uri' => 'admin/user', 'type' => 2],
  30. ['id' => 3, 'uri' => 'agentSettings', 'type' => 1], ['id' => 4, 'uri' => 'admin/agent', 'type' => 2],
  31. ['id' => 5, 'uri' => 'admin/agent/recharges/audit', 'type' => 2], ['id' => 6, 'uri' => 'admin/agentless', 'type' => 2],
  32. ]);
  33. // 角色 10:只有会员菜单;11:代理页面菜单;12:代理列表按钮;13:代理子按钮;14:前缀相似但不属于代理
  34. DB::table('role_menu')->insert([
  35. ['role_id' => 10, 'menu_id' => 1], ['role_id' => 10, 'menu_id' => 2], ['role_id' => 11, 'menu_id' => 3],
  36. ['role_id' => 12, 'menu_id' => 4], ['role_id' => 13, 'menu_id' => 5], ['role_id' => 14, 'menu_id' => 6],
  37. ]);
  38. DB::table('role_user')->insert([
  39. ['role_id' => 10, 'user_id' => 2], ['role_id' => 11, 'user_id' => 3], ['role_id' => 12, 'user_id' => 4],
  40. ['role_id' => 13, 'user_id' => 5], ['role_id' => 14, 'user_id' => 6], ['role_id' => 10, 'user_id' => 7], ['role_id' => 12, 'user_id' => 7],
  41. ]);
  42. }
  43. protected function tearDown(): void { DB::disconnect(); Facade::clearResolvedInstances(); parent::tearDown(); }
  44. public function test_super_admin_or_role_with_agent_menu_grants_access(): void
  45. {
  46. $this->assertTrue(AgentAdminAccess::allowed(1));
  47. $this->assertFalse(AgentAdminAccess::allowed(9), '不再读 AGENT_ADMIN_IDS,只看数据库角色');
  48. $this->assertFalse(AgentAdminAccess::allowed(0));
  49. $this->assertFalse(AgentAdminAccess::allowed(8), '没有角色');
  50. $this->assertFalse(AgentAdminAccess::allowed(2), '角色没有勾选代理菜单');
  51. $this->assertTrue(AgentAdminAccess::allowed(3), '勾选代理页面菜单');
  52. $this->assertTrue(AgentAdminAccess::allowed(4), '勾选代理列表按钮');
  53. $this->assertTrue(AgentAdminAccess::allowed(5), '勾选代理子按钮');
  54. $this->assertFalse(AgentAdminAccess::allowed(6), 'admin/agentless 不属于代理模块');
  55. $this->assertTrue(AgentAdminAccess::allowed(7), '多个角色中任一个有代理菜单即可');
  56. }
  57. public function test_middleware_follows_role_menus(): void
  58. {
  59. $call = function (int $adminId) {
  60. $request = Request::create('/admin/agent'); $request->user = (object) ['id' => $adminId];
  61. return (new AgentAdminMiddleware())->handle($request, static fn () => 'passed');
  62. };
  63. $this->assertSame('passed', $call(4));
  64. $this->assertSame('无代理管理权限', $call(2)->getData(true)['msg']);
  65. DB::table('role_menu')->where('role_id', 12)->delete();
  66. $this->assertSame('无代理管理权限', $call(4)->getData(true)['msg'], '取消勾选后立即失效');
  67. }
  68. }