EmailVerificationTest.php 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. <?php
  2. use App\Models\User;
  3. use Illuminate\Auth\Events\Verified;
  4. use Illuminate\Support\Facades\Event;
  5. use Illuminate\Support\Facades\URL;
  6. test('email verification screen can be rendered', function () {
  7. $user = User::factory()->unverified()->create();
  8. $response = $this->actingAs($user)->get(route('verification.notice'));
  9. $response->assertStatus(200);
  10. });
  11. test('email can be verified', function () {
  12. $user = User::factory()->unverified()->create();
  13. Event::fake();
  14. $verificationUrl = URL::temporarySignedRoute(
  15. 'verification.verify',
  16. now()->addMinutes(60),
  17. ['id' => $user->id, 'hash' => sha1($user->email)]
  18. );
  19. $response = $this->actingAs($user)->get($verificationUrl);
  20. Event::assertDispatched(Verified::class);
  21. expect($user->fresh()->hasVerifiedEmail())->toBeTrue();
  22. $response->assertRedirect(route('dashboard', absolute: false).'?verified=1');
  23. });
  24. test('email is not verified with invalid hash', function () {
  25. $user = User::factory()->unverified()->create();
  26. $verificationUrl = URL::temporarySignedRoute(
  27. 'verification.verify',
  28. now()->addMinutes(60),
  29. ['id' => $user->id, 'hash' => sha1('wrong-email')]
  30. );
  31. $this->actingAs($user)->get($verificationUrl);
  32. expect($user->fresh()->hasVerifiedEmail())->toBeFalse();
  33. });
  34. test('email is not verified with invalid user id', function () {
  35. $user = User::factory()->create([
  36. 'email_verified_at' => null,
  37. ]);
  38. $verificationUrl = URL::temporarySignedRoute(
  39. 'verification.verify',
  40. now()->addMinutes(60),
  41. ['id' => 123, 'hash' => sha1($user->email)]
  42. );
  43. $this->actingAs($user)->get($verificationUrl);
  44. expect($user->fresh()->hasVerifiedEmail())->toBeFalse();
  45. });
  46. test('verified user is redirected to dashboard from verification prompt', function () {
  47. $user = User::factory()->create([
  48. 'email_verified_at' => now(),
  49. ]);
  50. $response = $this->actingAs($user)->get(route('verification.notice'));
  51. $response->assertRedirect(route('dashboard', absolute: false));
  52. });
  53. test('already verified user visiting verification link is redirected without firing event again', function () {
  54. $user = User::factory()->create([
  55. 'email_verified_at' => now(),
  56. ]);
  57. Event::fake();
  58. $verificationUrl = URL::temporarySignedRoute(
  59. 'verification.verify',
  60. now()->addMinutes(60),
  61. ['id' => $user->id, 'hash' => sha1($user->email)]
  62. );
  63. $this->actingAs($user)->get($verificationUrl)
  64. ->assertRedirect(route('dashboard', absolute: false).'?verified=1');
  65. expect($user->fresh()->hasVerifiedEmail())->toBeTrue();
  66. Event::assertNotDispatched(Verified::class);
  67. });