RoutePermissionMiddlewareTest.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. <?php
  2. namespace Tests\Feature;
  3. use App\Models\Permission;
  4. use App\Models\Role;
  5. use App\Models\User;
  6. use Database\Seeders\RbacSeeder;
  7. use Illuminate\Foundation\Testing\RefreshDatabase;
  8. use Illuminate\Http\UploadedFile;
  9. use Illuminate\Support\Facades\Bus;
  10. use Tests\TestCase;
  11. class RoutePermissionMiddlewareTest extends TestCase
  12. {
  13. use RefreshDatabase;
  14. protected $seed = true;
  15. protected function setUp(): void
  16. {
  17. parent::setUp();
  18. $this->seed(RbacSeeder::class);
  19. }
  20. public function test_mapped_auth_route_requires_permission_for_rbac_user(): void
  21. {
  22. $role = Role::query()->create([
  23. 'slug' => 'no_orders',
  24. 'name' => 'No orders',
  25. 'is_system' => false,
  26. 'is_active' => true,
  27. ]);
  28. $user = User::factory()->create(['role' => $role->slug, 'role_id' => $role->id]);
  29. $this->actingAs($user)
  30. ->get(route('order.index'))
  31. ->assertForbidden();
  32. }
  33. public function test_mapped_auth_route_allows_permission_for_rbac_user(): void
  34. {
  35. $permission = Permission::query()->where('slug', 'orders.view')->firstOrFail();
  36. $role = Role::query()->create([
  37. 'slug' => 'orders_viewer',
  38. 'name' => 'Orders viewer',
  39. 'is_system' => false,
  40. 'is_active' => true,
  41. ]);
  42. $role->permissions()->sync([
  43. $permission->id => ['effect' => 'allow'],
  44. ]);
  45. $user = User::factory()->create(['role' => $role->slug, 'role_id' => $role->id]);
  46. $this->actingAs($user)
  47. ->get(route('order.index'))
  48. ->assertOk();
  49. }
  50. public function test_catalog_import_requires_catalog_import_permission(): void
  51. {
  52. Bus::fake();
  53. $importPermission = Permission::query()->where('slug', 'import.create')->firstOrFail();
  54. $role = Role::query()->create([
  55. 'slug' => 'generic_importer',
  56. 'name' => 'Generic importer',
  57. 'is_system' => false,
  58. 'is_active' => true,
  59. ]);
  60. $role->permissions()->sync([
  61. $importPermission->id => ['effect' => 'allow'],
  62. ]);
  63. $user = User::factory()->create(['role' => $role->slug, 'role_id' => $role->id]);
  64. $this->actingAs($user)
  65. ->post(route('import.create'), [
  66. 'type' => 'catalog',
  67. 'import_file' => UploadedFile::fake()->create('catalog.xlsx', 10),
  68. ])
  69. ->assertForbidden();
  70. }
  71. public function test_catalog_import_allows_catalog_import_permission(): void
  72. {
  73. Bus::fake();
  74. $permission = Permission::query()->where('slug', 'catalog.import')->firstOrFail();
  75. $role = Role::query()->create([
  76. 'slug' => 'catalog_importer',
  77. 'name' => 'Catalog importer',
  78. 'is_system' => false,
  79. 'is_active' => true,
  80. ]);
  81. $role->permissions()->sync([
  82. $permission->id => ['effect' => 'allow'],
  83. ]);
  84. $user = User::factory()->create(['role' => $role->slug, 'role_id' => $role->id]);
  85. $this->actingAs($user)
  86. ->post(route('import.create'), [
  87. 'type' => 'catalog',
  88. 'import_file' => UploadedFile::fake()->create('catalog.xlsx', 10),
  89. ])
  90. ->assertRedirect(route('import.index'));
  91. }
  92. public function test_custom_role_with_admin_permissions_can_open_admin_routes(): void
  93. {
  94. $user = $this->createUserWithAllPermissions('root_admin_routes');
  95. $this->actingAs($user)
  96. ->get(route('admin.roles.index'))
  97. ->assertOk()
  98. ->assertSee('Роли и права');
  99. }
  100. public function test_custom_role_with_admin_permissions_sees_admin_catalog_actions(): void
  101. {
  102. $user = $this->createUserWithAllPermissions('root_catalog_ui');
  103. $this->actingAs($user)
  104. ->get(route('catalog.index'))
  105. ->assertOk()
  106. ->assertSee(route('catalog.create'), false)
  107. ->assertSee('data-bs-target="#importModal"', false)
  108. ->assertSee('data-bs-target="#exportModal"', false);
  109. }
  110. private function createUserWithAllPermissions(string $slug): User
  111. {
  112. $role = Role::query()->create([
  113. 'slug' => $slug,
  114. 'name' => $slug,
  115. 'is_system' => false,
  116. 'is_active' => true,
  117. ]);
  118. $permissions = Permission::query()
  119. ->pluck('id')
  120. ->mapWithKeys(fn (int $id): array => [$id => ['effect' => 'allow']]);
  121. $role->permissions()->sync($permissions);
  122. return User::factory()->create(['role' => $role->slug, 'role_id' => $role->id]);
  123. }
  124. }