AdditionalUsernamesTest.php 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. <?php
  2. namespace Tests\Feature\Api;
  3. use App\AdditionalUsername;
  4. use App\DeletedUsername;
  5. use App\Recipient;
  6. use App\User;
  7. use Illuminate\Foundation\Testing\RefreshDatabase;
  8. use Tests\TestCase;
  9. class AdditionalUsernamesTest extends TestCase
  10. {
  11. use RefreshDatabase;
  12. protected function setUp(): void
  13. {
  14. parent::setUp();
  15. parent::setUpPassport();
  16. }
  17. /** @test */
  18. public function user_can_get_all_additional_usernames()
  19. {
  20. // Arrange
  21. factory(AdditionalUsername::class, 3)->create([
  22. 'user_id' => $this->user->id
  23. ]);
  24. // Act
  25. $response = $this->get('/api/v1/usernames');
  26. // Assert
  27. $response->assertSuccessful();
  28. $this->assertCount(3, $response->json()['data']);
  29. }
  30. /** @test */
  31. public function user_can_get_individual_additional_username()
  32. {
  33. // Arrange
  34. $username = factory(AdditionalUsername::class)->create([
  35. 'user_id' => $this->user->id
  36. ]);
  37. // Act
  38. $response = $this->get('/api/v1/usernames/'.$username->id);
  39. // Assert
  40. $response->assertSuccessful();
  41. $this->assertCount(1, $response->json());
  42. $this->assertEquals($username->username, $response->json()['data']['username']);
  43. }
  44. /** @test */
  45. public function user_can_create_additional_username()
  46. {
  47. $response = $this->json('POST', '/api/v1/usernames', [
  48. 'username' => 'janedoe'
  49. ]);
  50. $response->assertStatus(201);
  51. $this->assertEquals('janedoe', $response->getData()->data->username);
  52. $this->assertEquals(1, $this->user->username_count);
  53. }
  54. /** @test */
  55. public function user_can_not_exceed_additional_username_limit()
  56. {
  57. $this->json('POST', '/api/v1/usernames', [
  58. 'username' => 'username1'
  59. ]);
  60. $this->json('POST', '/api/v1/usernames', [
  61. 'username' => 'username2'
  62. ]);
  63. $this->json('POST', '/api/v1/usernames', [
  64. 'username' => 'username3'
  65. ]);
  66. $response = $this->json('POST', '/api/v1/usernames', [
  67. 'username' => 'janedoe'
  68. ]);
  69. $response->assertStatus(403);
  70. $this->assertEquals(3, $this->user->username_count);
  71. $this->assertCount(3, $this->user->additionalUsernames);
  72. }
  73. /** @test */
  74. public function user_can_not_create_the_same_username()
  75. {
  76. factory(AdditionalUsername::class)->create([
  77. 'user_id' => $this->user->id,
  78. 'username' => 'janedoe'
  79. ]);
  80. $response = $this->json('POST', '/api/v1/usernames', [
  81. 'username' => 'janedoe'
  82. ]);
  83. $response
  84. ->assertStatus(422)
  85. ->assertJsonValidationErrors('username');
  86. }
  87. /** @test */
  88. public function user_can_not_create_additional_username_that_has_been_deleted()
  89. {
  90. factory(DeletedUsername::class)->create([
  91. 'username' => 'janedoe'
  92. ]);
  93. $response = $this->json('POST', '/api/v1/usernames', [
  94. 'username' => 'janedoe'
  95. ]);
  96. $response
  97. ->assertStatus(422)
  98. ->assertJsonValidationErrors('username');
  99. }
  100. /** @test */
  101. public function must_be_unique_across_users_and_additional_usernames_tables()
  102. {
  103. $user = factory(User::class)->create();
  104. $response = $this->json('POST', '/api/v1/usernames', [
  105. 'username' => $user->username
  106. ]);
  107. $response
  108. ->assertStatus(422)
  109. ->assertJsonValidationErrors('username');
  110. }
  111. /** @test */
  112. public function additional_username_must_be_alpha_numeric()
  113. {
  114. $response = $this->json('POST', '/api/v1/usernames', [
  115. 'username' => 'username01_'
  116. ]);
  117. $response
  118. ->assertStatus(422)
  119. ->assertJsonValidationErrors('username');
  120. }
  121. /** @test */
  122. public function additional_username_must_be_less_than_max_length()
  123. {
  124. $response = $this->json('POST', '/api/v1/usernames', [
  125. 'username' => 'abcdefghijklmnopqrstu'
  126. ]);
  127. $response
  128. ->assertStatus(422)
  129. ->assertJsonValidationErrors('username');
  130. }
  131. /** @test */
  132. public function user_can_activate_additional_username()
  133. {
  134. $username = factory(AdditionalUsername::class)->create([
  135. 'user_id' => $this->user->id,
  136. 'active' => false
  137. ]);
  138. $response = $this->json('POST', '/api/v1/active-usernames/', [
  139. 'id' => $username->id
  140. ]);
  141. $response->assertStatus(200);
  142. $this->assertEquals(true, $response->getData()->data->active);
  143. }
  144. /** @test */
  145. public function user_can_deactivate_additional_username()
  146. {
  147. $username = factory(AdditionalUsername::class)->create([
  148. 'user_id' => $this->user->id,
  149. 'active' => true
  150. ]);
  151. $response = $this->json('DELETE', '/api/v1/active-usernames/'.$username->id);
  152. $response->assertStatus(204);
  153. $this->assertFalse($this->user->additionalUsernames[0]->active);
  154. }
  155. /** @test */
  156. public function user_can_update_additional_usernames_description()
  157. {
  158. $username = factory(AdditionalUsername::class)->create([
  159. 'user_id' => $this->user->id
  160. ]);
  161. $response = $this->json('PATCH', '/api/v1/usernames/'.$username->id, [
  162. 'description' => 'The new description'
  163. ]);
  164. $response->assertStatus(200);
  165. $this->assertEquals('The new description', $response->getData()->data->description);
  166. }
  167. /** @test */
  168. public function user_can_delete_additional_username()
  169. {
  170. $username = factory(AdditionalUsername::class)->create([
  171. 'user_id' => $this->user->id
  172. ]);
  173. $response = $this->json('DELETE', '/api/v1/usernames/'.$username->id);
  174. $response->assertStatus(204);
  175. $this->assertEmpty($this->user->additionalUsernames);
  176. $this->assertEquals(DeletedUsername::first()->username, $username->username);
  177. }
  178. /** @test */
  179. public function user_can_update_additional_username_default_recipient()
  180. {
  181. $additionalUsername = factory(AdditionalUsername::class)->create([
  182. 'user_id' => $this->user->id
  183. ]);
  184. $newDefaultRecipient = factory(Recipient::class)->create([
  185. 'user_id' => $this->user->id
  186. ]);
  187. $response = $this->json('PATCH', '/api/v1/usernames/'.$additionalUsername->id.'/default-recipient', [
  188. 'default_recipient' => $newDefaultRecipient->id
  189. ]);
  190. $response->assertStatus(200);
  191. $this->assertDatabaseHas('additional_usernames', [
  192. 'id' => $additionalUsername->id,
  193. 'default_recipient_id' => $newDefaultRecipient->id
  194. ]);
  195. $this->assertEquals($newDefaultRecipient->email, $additionalUsername->refresh()->defaultRecipient->email);
  196. }
  197. /** @test */
  198. public function user_cannot_update_additional_username_default_recipient_with_unverified_recipient()
  199. {
  200. $additionalUsername = factory(AdditionalUsername::class)->create([
  201. 'user_id' => $this->user->id
  202. ]);
  203. $newDefaultRecipient = factory(Recipient::class)->create([
  204. 'user_id' => $this->user->id,
  205. 'email_verified_at' => null
  206. ]);
  207. $response = $this->json('PATCH', '/api/v1/usernames/'.$additionalUsername->id.'/default-recipient', [
  208. 'default_recipient' => $newDefaultRecipient->id
  209. ]);
  210. $response->assertStatus(404);
  211. $this->assertDatabaseMissing('additional_usernames', [
  212. 'id' => $additionalUsername->id,
  213. 'default_recipient_id' => $newDefaultRecipient->id
  214. ]);
  215. }
  216. /** @test */
  217. public function user_can_remove_additional_username_default_recipient()
  218. {
  219. $defaultRecipient = factory(Recipient::class)->create([
  220. 'user_id' => $this->user->id
  221. ]);
  222. $additionalUsername = factory(AdditionalUsername::class)->create([
  223. 'user_id' => $this->user->id,
  224. 'default_recipient_id' => $defaultRecipient->id
  225. ]);
  226. $response = $this->json('PATCH', '/api/v1/usernames/'.$additionalUsername->id.'/default-recipient', [
  227. 'default_recipient' => ''
  228. ]);
  229. $response->assertStatus(200);
  230. $this->assertDatabaseHas('additional_usernames', [
  231. 'id' => $additionalUsername->id,
  232. 'default_recipient_id' => null
  233. ]);
  234. $this->assertNull($additionalUsername->refresh()->defaultRecipient);
  235. }
  236. }