RegisterControllerTest.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <?php
  2. namespace Tests\Feature\Http\Auth;
  3. use App\Facades\Settings;
  4. use App\Http\Controllers\Auth\RegisterController;
  5. use App\Http\Requests\UserStoreRequest;
  6. use App\Models\User;
  7. use Illuminate\Support\Facades\DB;
  8. use PHPUnit\Framework\Attributes\CoversClass;
  9. use Tests\FeatureTestCase;
  10. /**
  11. * RegisterControllerTest test class
  12. */
  13. #[CoversClass(RegisterController::class)]
  14. #[CoversClass(UserStoreRequest::class)]
  15. class RegisterControllerTest extends FeatureTestCase
  16. {
  17. private const USERNAME = 'john doe';
  18. private const EMAIL = 'johndoe@example.org';
  19. private const PASSWORD = 'password';
  20. /**
  21. * @test
  22. */
  23. public function setUp() : void
  24. {
  25. parent::setUp();
  26. }
  27. /**
  28. * @test
  29. */
  30. public function test_register_returns_success()
  31. {
  32. DB::table('users')->delete();
  33. $response = $this->json('POST', '/user', [
  34. 'name' => self::USERNAME,
  35. 'email' => self::EMAIL,
  36. 'password' => self::PASSWORD,
  37. 'password_confirmation' => self::PASSWORD,
  38. ])
  39. ->assertCreated()
  40. ->assertJsonStructure([
  41. 'message',
  42. 'name',
  43. ])
  44. ->assertJsonFragment([
  45. 'name' => self::USERNAME,
  46. ]);
  47. $this->assertDatabaseHas('users', [
  48. 'name' => self::USERNAME,
  49. 'email' => self::EMAIL,
  50. ]);
  51. }
  52. /**
  53. * @test
  54. */
  55. public function test_register_with_uppercased_email_returns_success()
  56. {
  57. DB::table('users')->delete();
  58. $response = $this->json('POST', '/user', [
  59. 'name' => self::USERNAME,
  60. 'email' => strtoupper(self::EMAIL),
  61. 'password' => self::PASSWORD,
  62. 'password_confirmation' => self::PASSWORD,
  63. ])
  64. ->assertCreated()
  65. ->assertJsonStructure([
  66. 'message',
  67. 'name',
  68. ])
  69. ->assertJsonFragment([
  70. 'name' => self::USERNAME,
  71. ]);
  72. $this->assertDatabaseHas('users', [
  73. 'name' => self::USERNAME,
  74. 'email' => self::EMAIL,
  75. ]);
  76. }
  77. /**
  78. * @test
  79. */
  80. public function test_register_with_invalid_data_returns_validation_error()
  81. {
  82. $response = $this->json('POST', '/user', [
  83. 'name' => null,
  84. 'email' => self::EMAIL,
  85. 'password' => self::PASSWORD,
  86. 'password_confirmation' => self::PASSWORD,
  87. ])
  88. ->assertStatus(422);
  89. }
  90. /**
  91. * @test
  92. */
  93. public function test_register_first_user_only_as_admin()
  94. {
  95. $this->assertDatabaseCount('users', 0);
  96. $response = $this->json('POST', '/user', [
  97. 'name' => self::USERNAME,
  98. 'email' => self::EMAIL,
  99. 'password' => self::PASSWORD,
  100. 'password_confirmation' => self::PASSWORD,
  101. ]);
  102. $this->assertDatabaseCount('users', 1);
  103. $this->assertDatabaseHas('users', [
  104. 'name' => self::USERNAME,
  105. 'email' => self::EMAIL,
  106. 'is_admin' => true,
  107. ]);
  108. $response = $this->json('POST', '/user', [
  109. 'name' => 'jane',
  110. 'email' => 'jane@example.org',
  111. 'password' => self::PASSWORD,
  112. 'password_confirmation' => self::PASSWORD,
  113. ]);
  114. $this->assertEquals(1, User::admins()->count());
  115. }
  116. /**
  117. * @test
  118. */
  119. public function test_register_is_forbidden_when_registration_is_disabled()
  120. {
  121. Settings::set('disableRegistration', true);
  122. $this->json('POST', '/user', [
  123. 'name' => self::USERNAME,
  124. 'email' => self::EMAIL,
  125. 'password' => self::PASSWORD,
  126. 'password_confirmation' => self::PASSWORD,
  127. ])
  128. ->assertStatus(403);
  129. }
  130. }