UserControllerTest.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. <?php
  2. namespace Tests\Feature;
  3. use App\Models\Role;
  4. use App\Models\User;
  5. use Illuminate\Foundation\Testing\RefreshDatabase;
  6. use Tests\TestCase;
  7. class UserControllerTest extends TestCase
  8. {
  9. use RefreshDatabase;
  10. protected $seed = true;
  11. private User $adminUser;
  12. private User $managerUser;
  13. protected function setUp(): void
  14. {
  15. parent::setUp();
  16. $this->adminUser = User::factory()->create(['role' => Role::ADMIN]);
  17. $this->managerUser = User::factory()->create(['role' => Role::MANAGER]);
  18. }
  19. private function validUserData(): array
  20. {
  21. return [
  22. 'name' => 'Тест Пользователь',
  23. 'email' => 'test_new@example.com',
  24. 'password' => 'password123',
  25. 'role' => Role::MANAGER,
  26. ];
  27. }
  28. // ==================== Guest redirects ====================
  29. public function test_guest_cannot_access_users_index(): void
  30. {
  31. $response = $this->get(route('user.index'));
  32. $response->assertRedirect(route('login'));
  33. }
  34. public function test_guest_cannot_access_user_create(): void
  35. {
  36. $response = $this->get(route('user.create'));
  37. $response->assertRedirect(route('login'));
  38. }
  39. public function test_guest_cannot_store_user(): void
  40. {
  41. $response = $this->post(route('user.store'), $this->validUserData());
  42. $response->assertRedirect(route('login'));
  43. }
  44. public function test_guest_cannot_delete_user(): void
  45. {
  46. $user = User::factory()->create(['role' => Role::MANAGER]);
  47. $response = $this->delete(route('user.destroy', $user));
  48. $response->assertRedirect(route('login'));
  49. }
  50. // ==================== Authorization - manager gets 403 ====================
  51. public function test_manager_cannot_access_users_index(): void
  52. {
  53. $response = $this->actingAs($this->managerUser)
  54. ->get(route('user.index'));
  55. $response->assertStatus(403);
  56. }
  57. public function test_manager_cannot_create_user(): void
  58. {
  59. $response = $this->actingAs($this->managerUser)
  60. ->post(route('user.store'), $this->validUserData());
  61. $response->assertStatus(403);
  62. }
  63. public function test_manager_cannot_delete_user(): void
  64. {
  65. $user = User::factory()->create(['role' => Role::MANAGER]);
  66. $response = $this->actingAs($this->managerUser)
  67. ->delete(route('user.destroy', $user));
  68. $response->assertStatus(403);
  69. }
  70. // ==================== Index ====================
  71. public function test_admin_can_access_users_index(): void
  72. {
  73. $response = $this->actingAs($this->adminUser)
  74. ->get(route('user.index'));
  75. $response->assertStatus(200);
  76. $response->assertViewIs('users.index');
  77. }
  78. // ==================== Create form ====================
  79. public function test_admin_can_access_user_create(): void
  80. {
  81. $response = $this->actingAs($this->adminUser)
  82. ->get(route('user.create'));
  83. $response->assertStatus(200);
  84. $response->assertViewIs('users.edit');
  85. }
  86. // ==================== Show ====================
  87. public function test_admin_can_view_user(): void
  88. {
  89. $user = User::factory()->create(['role' => Role::MANAGER]);
  90. $response = $this->actingAs($this->adminUser)
  91. ->get(route('user.show', $user));
  92. $response->assertStatus(200);
  93. $response->assertViewIs('users.edit');
  94. }
  95. // ==================== Store - create new user ====================
  96. public function test_admin_can_create_user(): void
  97. {
  98. $data = $this->validUserData();
  99. $response = $this->actingAs($this->adminUser)
  100. ->post(route('user.store'), $data);
  101. $response->assertRedirect(route('user.index'));
  102. $this->assertDatabaseHas('users', ['email' => $data['email']]);
  103. }
  104. public function test_store_requires_name(): void
  105. {
  106. $data = $this->validUserData();
  107. unset($data['name']);
  108. $response = $this->actingAs($this->adminUser)
  109. ->post(route('user.store'), $data);
  110. $response->assertSessionHasErrors('name');
  111. }
  112. public function test_store_requires_password_for_new_user(): void
  113. {
  114. $data = $this->validUserData();
  115. unset($data['password']);
  116. $response = $this->actingAs($this->adminUser)
  117. ->post(route('user.store'), $data);
  118. $response->assertSessionHasErrors('password');
  119. }
  120. // ==================== Update existing user ====================
  121. public function test_admin_can_update_user(): void
  122. {
  123. $user = User::factory()->create(['role' => Role::MANAGER]);
  124. $newName = 'Обновлённое Имя';
  125. $response = $this->actingAs($this->adminUser)
  126. ->post(route('user.store'), [
  127. 'id' => $user->id,
  128. 'name' => $newName,
  129. 'role' => Role::MANAGER,
  130. ]);
  131. $response->assertRedirect(route('user.index'));
  132. $this->assertDatabaseHas('users', ['id' => $user->id, 'name' => $newName]);
  133. }
  134. // ==================== Delete ====================
  135. public function test_admin_can_delete_user(): void
  136. {
  137. $user = User::factory()->create(['role' => Role::MANAGER]);
  138. $response = $this->actingAs($this->adminUser)
  139. ->delete(route('user.destroy', $user));
  140. $response->assertRedirect(route('user.index'));
  141. $this->assertSoftDeleted('users', ['id' => $user->id]);
  142. }
  143. public function test_admin_cannot_delete_self(): void
  144. {
  145. $response = $this->actingAs($this->adminUser)
  146. ->delete(route('user.destroy', $this->adminUser));
  147. $response->assertRedirect(route('user.index'));
  148. $response->assertSessionHas('danger');
  149. }
  150. // ==================== Undelete ====================
  151. public function test_admin_can_restore_deleted_user(): void
  152. {
  153. $user = User::factory()->create(['role' => Role::MANAGER]);
  154. $user->delete();
  155. $response = $this->actingAs($this->adminUser)
  156. ->post(route('user.undelete', $user->id));
  157. $response->assertRedirect();
  158. $this->assertDatabaseHas('users', ['id' => $user->id, 'deleted_at' => null]);
  159. }
  160. // ==================== Impersonate ====================
  161. public function test_admin_can_impersonate_user(): void
  162. {
  163. $targetUser = User::factory()->create(['role' => Role::MANAGER]);
  164. $response = $this->actingAs($this->adminUser)
  165. ->post(route('user.impersonate', $targetUser));
  166. $response->assertRedirect(route('home'));
  167. $response->assertSessionHas('impersonator_id', $this->adminUser->id);
  168. }
  169. }