RoutePermissionMiddlewareTest.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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 function setUp(): void
  15. {
  16. parent::setUp();
  17. $this->seed(RbacSeeder::class);
  18. }
  19. public function test_mapped_auth_route_requires_permission_for_rbac_user(): void
  20. {
  21. $role = Role::query()->create([
  22. 'slug' => 'no_orders',
  23. 'name' => 'No orders',
  24. 'is_system' => false,
  25. 'is_active' => true,
  26. ]);
  27. $user = User::factory()->create(['role' => $role->slug, 'role_id' => $role->id]);
  28. $this->actingAs($user)
  29. ->get(route('order.index'))
  30. ->assertForbidden();
  31. }
  32. public function test_mapped_auth_route_allows_permission_for_rbac_user(): void
  33. {
  34. $permission = Permission::query()->where('slug', 'orders.view')->firstOrFail();
  35. $role = Role::query()->create([
  36. 'slug' => 'orders_viewer',
  37. 'name' => 'Orders viewer',
  38. 'is_system' => false,
  39. 'is_active' => true,
  40. ]);
  41. $role->permissions()->sync([
  42. $permission->id => ['effect' => 'allow'],
  43. ]);
  44. $user = User::factory()->create(['role' => $role->slug, 'role_id' => $role->id]);
  45. $this->actingAs($user)
  46. ->get(route('order.index'))
  47. ->assertOk();
  48. }
  49. public function test_catalog_import_requires_catalog_import_permission(): void
  50. {
  51. Bus::fake();
  52. $importPermission = Permission::query()->where('slug', 'import.create')->firstOrFail();
  53. $role = Role::query()->create([
  54. 'slug' => 'generic_importer',
  55. 'name' => 'Generic importer',
  56. 'is_system' => false,
  57. 'is_active' => true,
  58. ]);
  59. $role->permissions()->sync([
  60. $importPermission->id => ['effect' => 'allow'],
  61. ]);
  62. $user = User::factory()->create(['role' => $role->slug, 'role_id' => $role->id]);
  63. $this->actingAs($user)
  64. ->post(route('import.create'), [
  65. 'type' => 'catalog',
  66. 'import_file' => UploadedFile::fake()->create('catalog.xlsx', 10),
  67. ])
  68. ->assertForbidden();
  69. }
  70. public function test_catalog_import_allows_catalog_import_permission(): void
  71. {
  72. Bus::fake();
  73. $permission = Permission::query()->where('slug', 'catalog.import')->firstOrFail();
  74. $role = Role::query()->create([
  75. 'slug' => 'catalog_importer',
  76. 'name' => 'Catalog importer',
  77. 'is_system' => false,
  78. 'is_active' => true,
  79. ]);
  80. $role->permissions()->sync([
  81. $permission->id => ['effect' => 'allow'],
  82. ]);
  83. $user = User::factory()->create(['role' => $role->slug, 'role_id' => $role->id]);
  84. $this->actingAs($user)
  85. ->post(route('import.create'), [
  86. 'type' => 'catalog',
  87. 'import_file' => UploadedFile::fake()->create('catalog.xlsx', 10),
  88. ])
  89. ->assertRedirect(route('import.index'));
  90. }
  91. }