AuthenticatesUsersTest.php 4.8 KB

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