RegisterControllerTest.php 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  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 EMAIL_NOT_IN_FILTERING_LIST = 'jane@example.org';
  20. private const EMAIL_EXCLUDED_BY_FILTERING_RULE = 'johndoe@anywhere.org';
  21. private const PASSWORD = 'password';
  22. private const EMAIL_FILTERING_LIST = 'johndoe@example.org|johndoe@test.org|johndoe@anywhere.org';
  23. private const EMAIL_FILTERING_RULE = '^[A-Za-z0-9._%+-]+@example\.org';
  24. /**
  25. * @test
  26. */
  27. public function setUp() : void
  28. {
  29. parent::setUp();
  30. }
  31. /**
  32. * @test
  33. */
  34. public function test_register_returns_success()
  35. {
  36. DB::table('users')->delete();
  37. $response = $this->json('POST', '/user', [
  38. 'name' => self::USERNAME,
  39. 'email' => self::EMAIL,
  40. 'password' => self::PASSWORD,
  41. 'password_confirmation' => self::PASSWORD,
  42. ])
  43. ->assertCreated()
  44. ->assertJsonStructure([
  45. 'message',
  46. 'name',
  47. ])
  48. ->assertJsonFragment([
  49. 'name' => self::USERNAME,
  50. ]);
  51. $this->assertDatabaseHas('users', [
  52. 'name' => self::USERNAME,
  53. 'email' => self::EMAIL,
  54. ]);
  55. }
  56. /**
  57. * @test
  58. */
  59. public function test_register_with_uppercased_email_returns_success()
  60. {
  61. DB::table('users')->delete();
  62. $response = $this->json('POST', '/user', [
  63. 'name' => self::USERNAME,
  64. 'email' => strtoupper(self::EMAIL),
  65. 'password' => self::PASSWORD,
  66. 'password_confirmation' => self::PASSWORD,
  67. ])
  68. ->assertCreated()
  69. ->assertJsonStructure([
  70. 'message',
  71. 'name',
  72. ])
  73. ->assertJsonFragment([
  74. 'name' => self::USERNAME,
  75. ]);
  76. $this->assertDatabaseHas('users', [
  77. 'name' => self::USERNAME,
  78. 'email' => self::EMAIL,
  79. ]);
  80. }
  81. /**
  82. * @test
  83. */
  84. public function test_register_with_invalid_data_returns_validation_error()
  85. {
  86. $response = $this->json('POST', '/user', [
  87. 'name' => null,
  88. 'email' => self::EMAIL,
  89. 'password' => self::PASSWORD,
  90. 'password_confirmation' => self::PASSWORD,
  91. ])
  92. ->assertStatus(422);
  93. }
  94. /**
  95. * @test
  96. */
  97. public function test_register_first_user_only_as_admin()
  98. {
  99. $this->assertDatabaseCount('users', 0);
  100. $response = $this->json('POST', '/user', [
  101. 'name' => self::USERNAME,
  102. 'email' => self::EMAIL,
  103. 'password' => self::PASSWORD,
  104. 'password_confirmation' => self::PASSWORD,
  105. ]);
  106. $this->assertDatabaseCount('users', 1);
  107. $this->assertDatabaseHas('users', [
  108. 'name' => self::USERNAME,
  109. 'email' => self::EMAIL,
  110. 'is_admin' => true,
  111. ]);
  112. $response = $this->json('POST', '/user', [
  113. 'name' => 'jane',
  114. 'email' => 'jane@example.org',
  115. 'password' => self::PASSWORD,
  116. 'password_confirmation' => self::PASSWORD,
  117. ]);
  118. $this->assertEquals(1, User::admins()->count());
  119. }
  120. /**
  121. * @test
  122. */
  123. public function test_register_is_forbidden_when_registration_is_disabled()
  124. {
  125. Settings::set('disableRegistration', true);
  126. $this->json('POST', '/user', [
  127. 'name' => self::USERNAME,
  128. 'email' => self::EMAIL,
  129. 'password' => self::PASSWORD,
  130. 'password_confirmation' => self::PASSWORD,
  131. ])
  132. ->assertStatus(403);
  133. }
  134. /**
  135. * @test
  136. */
  137. public function test_register_succeeds_when_email_is_in_restricted_list()
  138. {
  139. Settings::set('restrictRegistration', true);
  140. Settings::set('restrictList', self::EMAIL_FILTERING_LIST);
  141. Settings::set('restrictRule', '');
  142. $this->json('POST', '/user', [
  143. 'name' => self::USERNAME,
  144. 'email' => self::EMAIL,
  145. 'password' => self::PASSWORD,
  146. 'password_confirmation' => self::PASSWORD,
  147. ])
  148. ->assertStatus(201);
  149. }
  150. /**
  151. * @test
  152. */
  153. public function test_register_fails_when_email_is_not_in_restricted_list()
  154. {
  155. Settings::set('restrictRegistration', true);
  156. Settings::set('restrictList', self::EMAIL_FILTERING_LIST);
  157. Settings::set('restrictRule', '');
  158. $this->json('POST', '/user', [
  159. 'name' => self::USERNAME,
  160. 'email' => self::EMAIL_NOT_IN_FILTERING_LIST,
  161. 'password' => self::PASSWORD,
  162. 'password_confirmation' => self::PASSWORD,
  163. ])
  164. ->assertStatus(422);
  165. }
  166. /**
  167. * @test
  168. */
  169. public function test_register_succeeds_when_email_matchs_filtering_rule()
  170. {
  171. Settings::set('restrictRegistration', true);
  172. Settings::set('restrictList', '');
  173. Settings::set('restrictRule', self::EMAIL_FILTERING_RULE);
  174. $this->json('POST', '/user', [
  175. 'name' => self::USERNAME,
  176. 'email' => self::EMAIL,
  177. 'password' => self::PASSWORD,
  178. 'password_confirmation' => self::PASSWORD,
  179. ])
  180. ->assertStatus(201);
  181. }
  182. /**
  183. * @test
  184. */
  185. public function test_register_fails_when_email_does_not_match_filtering_rule()
  186. {
  187. Settings::set('restrictRegistration', true);
  188. Settings::set('restrictList', '');
  189. Settings::set('restrictRule', self::EMAIL_FILTERING_RULE);
  190. $this->json('POST', '/user', [
  191. 'name' => self::USERNAME,
  192. 'email' => self::EMAIL_EXCLUDED_BY_FILTERING_RULE,
  193. 'password' => self::PASSWORD,
  194. 'password_confirmation' => self::PASSWORD,
  195. ])
  196. ->assertStatus(422);
  197. }
  198. /**
  199. * @test
  200. */
  201. public function test_register_succeeds_when_email_is_allowed_by_list_over_regex()
  202. {
  203. Settings::set('restrictRegistration', true);
  204. Settings::set('restrictList', self::EMAIL_FILTERING_LIST);
  205. Settings::set('restrictRule', self::EMAIL_FILTERING_RULE);
  206. $this->json('POST', '/user', [
  207. 'name' => self::USERNAME,
  208. 'email' => self::EMAIL_EXCLUDED_BY_FILTERING_RULE,
  209. 'password' => self::PASSWORD,
  210. 'password_confirmation' => self::PASSWORD,
  211. ])
  212. ->assertStatus(201);
  213. }
  214. /**
  215. * @test
  216. */
  217. public function test_register_succeeds_when_email_is_allowed_by_regex_over_list()
  218. {
  219. Settings::set('restrictRegistration', true);
  220. Settings::set('restrictList', self::EMAIL_FILTERING_LIST);
  221. Settings::set('restrictRule', self::EMAIL_FILTERING_RULE);
  222. $this->json('POST', '/user', [
  223. 'name' => self::USERNAME,
  224. 'email' => self::EMAIL_NOT_IN_FILTERING_LIST,
  225. 'password' => self::PASSWORD,
  226. 'password_confirmation' => self::PASSWORD,
  227. ])
  228. ->assertStatus(201);
  229. }
  230. }