AdminRoleControllerTest.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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 Tests\TestCase;
  9. class AdminRoleControllerTest extends TestCase
  10. {
  11. use RefreshDatabase;
  12. private User $adminUser;
  13. protected function setUp(): void
  14. {
  15. parent::setUp();
  16. $this->adminUser = User::factory()->create(['role' => Role::ADMIN]);
  17. $this->seed(RbacSeeder::class);
  18. $this->adminUser->refresh();
  19. }
  20. public function test_admin_can_open_roles_index(): void
  21. {
  22. $this->actingAs($this->adminUser)
  23. ->get(route('admin.roles.index'))
  24. ->assertOk()
  25. ->assertSee('Роли и права');
  26. }
  27. public function test_admin_role_update_keeps_all_permissions_allowed(): void
  28. {
  29. $adminRole = Role::query()->where('slug', Role::ADMIN)->firstOrFail();
  30. $permission = Permission::query()->where('slug', 'catalog.delete')->firstOrFail();
  31. $this->actingAs($this->adminUser)
  32. ->put(route('admin.roles.update', $adminRole), [
  33. 'slug' => Role::ADMIN,
  34. 'name' => 'Админ',
  35. 'is_active' => '0',
  36. 'permission_effects' => [
  37. $permission->id => 'deny',
  38. ],
  39. ])
  40. ->assertRedirect(route('admin.roles.edit', $adminRole));
  41. $this->assertDatabaseHas('roles', [
  42. 'id' => $adminRole->id,
  43. 'is_active' => true,
  44. ]);
  45. $this->assertDatabaseHas('role_permissions', [
  46. 'role_id' => $adminRole->id,
  47. 'permission_id' => $permission->id,
  48. 'effect' => 'allow',
  49. ]);
  50. }
  51. public function test_role_cannot_be_deleted_while_any_user_references_it(): void
  52. {
  53. $role = Role::query()->where('slug', Role::MANAGER)->firstOrFail();
  54. User::factory()->create([
  55. 'role' => Role::MANAGER,
  56. 'role_id' => $role->id,
  57. 'deleted_at' => now(),
  58. ]);
  59. $this->actingAs($this->adminUser)
  60. ->delete(route('admin.roles.destroy', $role))
  61. ->assertRedirect(route('admin.roles.edit', $role));
  62. $this->assertDatabaseHas('roles', ['id' => $role->id]);
  63. }
  64. public function test_role_can_be_created_from_user_effective_permissions(): void
  65. {
  66. $managerRole = Role::query()->where('slug', Role::MANAGER)->firstOrFail();
  67. $user = User::factory()->create([
  68. 'role' => Role::MANAGER,
  69. 'role_id' => $managerRole->id,
  70. ]);
  71. $permission = Permission::query()->where('slug', 'catalog.view')->firstOrFail();
  72. $user->permissions()->syncWithoutDetaching([
  73. $permission->id => ['effect' => 'deny'],
  74. ]);
  75. $this->actingAs($this->adminUser)
  76. ->post(route('admin.roles.store-from-user', $user), [
  77. 'name' => 'Тестовая роль',
  78. 'slug' => 'test_custom_role',
  79. ])
  80. ->assertRedirect();
  81. $role = Role::query()->where('slug', 'test_custom_role')->firstOrFail();
  82. $this->assertDatabaseHas('role_permissions', [
  83. 'role_id' => $role->id,
  84. 'permission_id' => $permission->id,
  85. 'effect' => 'deny',
  86. ]);
  87. }
  88. public function test_user_permission_override_can_deny_role_permission(): void
  89. {
  90. $managerRole = Role::query()->where('slug', Role::MANAGER)->firstOrFail();
  91. $user = User::factory()->create([
  92. 'role' => Role::MANAGER,
  93. 'role_id' => $managerRole->id,
  94. ]);
  95. $permission = Permission::query()->where('slug', 'catalog.view')->firstOrFail();
  96. $this->actingAs($this->adminUser)
  97. ->post(route('user.store'), [
  98. 'id' => $user->id,
  99. 'email' => $user->email,
  100. 'name' => $user->name,
  101. 'role_id' => $managerRole->id,
  102. 'permission_effects' => [
  103. $permission->id => 'deny',
  104. ],
  105. ])
  106. ->assertRedirect(route('user.index'));
  107. $this->assertDatabaseHas('user_permissions', [
  108. 'user_id' => $user->id,
  109. 'permission_id' => $permission->id,
  110. 'effect' => 'deny',
  111. ]);
  112. $this->assertFalse($user->refresh()->hasPermission('catalog.view'));
  113. }
  114. }