AdminRoleControllerTest.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  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. protected $seed = true;
  13. private User $adminUser;
  14. protected function setUp(): void
  15. {
  16. parent::setUp();
  17. $this->adminUser = User::factory()->create(['role' => Role::ADMIN]);
  18. $this->seed(RbacSeeder::class);
  19. $this->adminUser->refresh();
  20. }
  21. public function test_admin_can_open_roles_index(): void
  22. {
  23. $this->actingAs($this->adminUser)
  24. ->get(route('admin.roles.index'))
  25. ->assertOk()
  26. ->assertSee('Роли и права');
  27. }
  28. public function test_admin_role_update_keeps_all_permissions_allowed(): void
  29. {
  30. $adminRole = Role::query()->where('slug', Role::ADMIN)->firstOrFail();
  31. $permission = Permission::query()->where('slug', 'catalog.delete')->firstOrFail();
  32. $this->actingAs($this->adminUser)
  33. ->put(route('admin.roles.update', $adminRole), [
  34. 'slug' => Role::ADMIN,
  35. 'name' => 'Админ',
  36. 'is_active' => '0',
  37. 'permission_effects' => [
  38. $permission->id => 'deny',
  39. ],
  40. ])
  41. ->assertRedirect(route('admin.roles.edit', $adminRole));
  42. $this->assertDatabaseHas('roles', [
  43. 'id' => $adminRole->id,
  44. 'is_active' => true,
  45. ]);
  46. $this->assertDatabaseHas('role_permissions', [
  47. 'role_id' => $adminRole->id,
  48. 'permission_id' => $permission->id,
  49. 'effect' => 'allow',
  50. ]);
  51. }
  52. public function test_role_cannot_be_deleted_while_any_user_references_it(): void
  53. {
  54. $role = Role::query()->where('slug', Role::MANAGER)->firstOrFail();
  55. User::factory()->create([
  56. 'role' => Role::MANAGER,
  57. 'role_id' => $role->id,
  58. 'deleted_at' => now(),
  59. ]);
  60. $this->actingAs($this->adminUser)
  61. ->delete(route('admin.roles.destroy', $role))
  62. ->assertRedirect(route('admin.roles.edit', $role));
  63. $this->assertDatabaseHas('roles', ['id' => $role->id]);
  64. }
  65. public function test_role_can_be_created_from_user_effective_permissions(): void
  66. {
  67. $managerRole = Role::query()->where('slug', Role::MANAGER)->firstOrFail();
  68. $user = User::factory()->create([
  69. 'role' => Role::MANAGER,
  70. 'role_id' => $managerRole->id,
  71. ]);
  72. $permission = Permission::query()->where('slug', 'catalog.view')->firstOrFail();
  73. $user->permissions()->syncWithoutDetaching([
  74. $permission->id => ['effect' => 'deny'],
  75. ]);
  76. $this->actingAs($this->adminUser)
  77. ->post(route('admin.roles.store-from-user', $user), [
  78. 'name' => 'Тестовая роль',
  79. 'slug' => 'test_custom_role',
  80. ])
  81. ->assertRedirect();
  82. $role = Role::query()->where('slug', 'test_custom_role')->firstOrFail();
  83. $this->assertDatabaseHas('role_permissions', [
  84. 'role_id' => $role->id,
  85. 'permission_id' => $permission->id,
  86. 'effect' => 'deny',
  87. ]);
  88. }
  89. public function test_user_permission_override_can_deny_role_permission(): void
  90. {
  91. $managerRole = Role::query()->where('slug', Role::MANAGER)->firstOrFail();
  92. $user = User::factory()->create([
  93. 'role' => Role::MANAGER,
  94. 'role_id' => $managerRole->id,
  95. ]);
  96. $permission = Permission::query()->where('slug', 'catalog.view')->firstOrFail();
  97. $this->actingAs($this->adminUser)
  98. ->post(route('user.store'), [
  99. 'id' => $user->id,
  100. 'email' => $user->email,
  101. 'name' => $user->name,
  102. 'role_id' => $managerRole->id,
  103. 'permission_effects' => [
  104. $permission->id => 'deny',
  105. ],
  106. ])
  107. ->assertRedirect(route('user.index'));
  108. $this->assertDatabaseHas('user_permissions', [
  109. 'user_id' => $user->id,
  110. 'permission_id' => $permission->id,
  111. 'effect' => 'deny',
  112. ]);
  113. $this->assertFalse($user->refresh()->hasPermission('catalog.view'));
  114. }
  115. public function test_custom_role_can_pass_legacy_role_middleware_by_route_permission(): void
  116. {
  117. $permission = Permission::query()->where('slug', 'admin.roles')->firstOrFail();
  118. $role = Role::query()->create([
  119. 'slug' => 'permissions_operator',
  120. 'name' => 'Оператор прав',
  121. 'is_system' => false,
  122. 'is_active' => true,
  123. ]);
  124. $role->permissions()->sync([
  125. $permission->id => ['effect' => 'allow'],
  126. ]);
  127. $user = User::factory()->create([
  128. 'role' => $role->slug,
  129. 'role_id' => $role->id,
  130. ]);
  131. $this->actingAs($user)
  132. ->get(route('admin.roles.index'))
  133. ->assertOk()
  134. ->assertSee('Роли и права');
  135. }
  136. public function test_role_can_be_copied_with_permissions(): void
  137. {
  138. $managerRole = Role::query()->where('slug', Role::MANAGER)->firstOrFail();
  139. $permission = Permission::query()->where('slug', 'catalog.view')->firstOrFail();
  140. $this->actingAs($this->adminUser)
  141. ->post(route('admin.roles.copy', $managerRole))
  142. ->assertRedirect();
  143. $copy = Role::query()
  144. ->where('slug', 'manager_copy')
  145. ->firstOrFail();
  146. $this->assertFalse($copy->is_system);
  147. $this->assertDatabaseHas('role_permissions', [
  148. 'role_id' => $copy->id,
  149. 'permission_id' => $permission->id,
  150. 'effect' => 'allow',
  151. ]);
  152. }
  153. }