AuthenticatesUsersTest.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. <?php
  2. namespace Laravel\Ui\Tests\AuthBackend;
  3. use Illuminate\Auth\Events\Attempting;
  4. use Illuminate\Auth\Events\Logout;
  5. use Illuminate\Foundation\Auth\AuthenticatesUsers;
  6. use Illuminate\Foundation\Testing\RefreshDatabase;
  7. use Illuminate\Http\Request;
  8. use Illuminate\Routing\Pipeline;
  9. use Illuminate\Support\Facades\Auth;
  10. use Illuminate\Support\Facades\Event;
  11. use Illuminate\Testing\TestResponse;
  12. use Illuminate\Validation\ValidationException;
  13. use Orchestra\Testbench\Attributes\WithMigration;
  14. use Orchestra\Testbench\Factories\UserFactory;
  15. use Orchestra\Testbench\TestCase;
  16. use PHPUnit\Framework\Attributes\Test;
  17. #[WithMigration]
  18. class AuthenticatesUsersTest extends TestCase
  19. {
  20. use AuthenticatesUsers, RefreshDatabase;
  21. protected function tearDown(): void
  22. {
  23. Auth::logout();
  24. parent::tearDown();
  25. }
  26. #[Test]
  27. public function it_can_authenticate_a_user()
  28. {
  29. Event::fake();
  30. $user = UserFactory::new()->create();
  31. $request = Request::create('/login', 'POST', [
  32. 'email' => $user->email,
  33. 'password' => 'password',
  34. ], [], [], [
  35. 'HTTP_ACCEPT' => 'application/json',
  36. ]);
  37. $response = $this->handleRequestUsing($request, function ($request) {
  38. return $this->login($request);
  39. })->assertStatus(204);
  40. Event::assertDispatched(function (Attempting $event) {
  41. return $event->remember === false;
  42. });
  43. }
  44. #[Test]
  45. public function it_can_deauthenticate_a_user()
  46. {
  47. Event::fake();
  48. $user = UserFactory::new()->create();
  49. $this->actingAs($user);
  50. $request = Request::create('/logout', 'POST', [], [], [], [
  51. 'HTTP_ACCEPT' => 'application/json',
  52. ]);
  53. $response = $this->handleRequestUsing(
  54. $request, fn ($request) => $this->logout($request)
  55. )->assertStatus(204);
  56. Event::assertDispatched(fn (Logout $event) => $user->is($event->user));
  57. }
  58. #[Test]
  59. public function it_can_authenticate_a_user_with_remember_as_false()
  60. {
  61. Event::fake();
  62. $user = UserFactory::new()->create();
  63. $request = Request::create('/login', 'POST', [
  64. 'email' => $user->email,
  65. 'password' => 'password',
  66. 'remember' => false,
  67. ], [], [], [
  68. 'HTTP_ACCEPT' => 'application/json',
  69. ]);
  70. $response = $this->handleRequestUsing($request, function ($request) {
  71. return $this->login($request);
  72. })->assertStatus(204);
  73. Event::assertDispatched(function (Attempting $event) {
  74. return $event->remember === false;
  75. });
  76. }
  77. #[Test]
  78. public function it_can_authenticate_a_user_with_remember_as_true()
  79. {
  80. Event::fake();
  81. $user = UserFactory::new()->create();
  82. $request = Request::create('/login', 'POST', [
  83. 'email' => $user->email,
  84. 'password' => 'password',
  85. 'remember' => true,
  86. ], [], [], [
  87. 'HTTP_ACCEPT' => 'application/json',
  88. ]);
  89. $response = $this->handleRequestUsing($request, function ($request) {
  90. return $this->login($request);
  91. })->assertStatus(204);
  92. Event::assertDispatched(function (Attempting $event) {
  93. return $event->remember === true;
  94. });
  95. }
  96. #[Test]
  97. public function it_cant_authenticate_a_user_with_invalid_password()
  98. {
  99. $user = UserFactory::new()->create();
  100. $request = Request::create('/login', 'POST', [
  101. 'email' => $user->email,
  102. 'password' => 'invalid-password',
  103. ], [], [], [
  104. 'HTTP_ACCEPT' => 'application/json',
  105. ]);
  106. $response = $this->handleRequestUsing($request, function ($request) {
  107. return $this->login($request);
  108. })->assertUnprocessable();
  109. $this->assertInstanceOf(ValidationException::class, $response->exception);
  110. $this->assertSame([
  111. 'email' => [
  112. 'These credentials do not match our records.',
  113. ],
  114. ], $response->exception->errors());
  115. }
  116. #[Test]
  117. public function it_cant_authenticate_unknown_credential()
  118. {
  119. $request = Request::create('/login', 'POST', [
  120. 'email' => 'taylor@laravel.com',
  121. 'password' => 'password',
  122. ], [], [], [
  123. 'HTTP_ACCEPT' => 'application/json',
  124. ]);
  125. $response = $this->handleRequestUsing($request, function ($request) {
  126. return $this->login($request);
  127. })->assertUnprocessable();
  128. $this->assertInstanceOf(ValidationException::class, $response->exception);
  129. $this->assertSame([
  130. 'email' => [
  131. 'These credentials do not match our records.',
  132. ],
  133. ], $response->exception->errors());
  134. }
  135. /**
  136. * Handle Request using the following pipeline.
  137. *
  138. * @param \Illuminate\Http\Request $request
  139. * @param callable $callback
  140. * @return \Illuminate\Testing\TestResponse
  141. */
  142. protected function handleRequestUsing(Request $request, callable $callback)
  143. {
  144. return new TestResponse(
  145. (new Pipeline($this->app))
  146. ->send($request)
  147. ->through([
  148. \Illuminate\Session\Middleware\StartSession::class,
  149. ])
  150. ->then($callback)
  151. );
  152. }
  153. }