Weryfikacja adresu email podanego podczas rejestracji – test i implementacja

W poprzednim wpisie dodałem możliwość rejestracji użytkowników. W tym pokażę jak zaimplementować funkcjonalność weryfikacji adresu email. Zacznę od stworzenia odpowiedniego testu:

php artisan make:test Auth/VerificationTest
<?php

namespace Tests\Feature\Auth;

use App\User;
use Illuminate\Support\Facades\URL;
use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;

class VerificationTest extends TestCase
{
  use WithFaker, RefreshDatabase;

  /** @test */
  public function user_can_verify_email_address_by_signed_url()
  {
    $this->withoutExceptionHandling();

    $user = factory(User::class)->create([
      'email' => 'email@example.com',
      'email_verified_at' => null
    ]);

    $signedUrl = URL::signedRoute(
      'email.verify', ['id' => $user->id]
    );

    $this->json('GET', $signedUrl)
      ->assertJsonFragment([
        'message' => 'Email verified'
      ]);

    $this->assertDatabaseHas('users', [
      'email' => $user->email,
      'email_verified_at' => now()
    ]);
  }
}

Przy okazji wysyłki maila z prośbą o weryfikację adresu utworzyłem odpowiedni route:

Route::get('/email/verify/{id}', 'Api\Auth\VerificationController@verify')
  ->name('email.verify')
  ->middleware('signed');

lecz nie stworzyłem kontrolera obsługującego żądanie więc test oczywiście nie przechodzi:

vendor/bin/phpunit --filter=user_can_verify_email_address_by_signed_url
ReflectionException: Class App\Http\Controllers\Api\Auth\VerificationController does not exist

Czas go utworzyć:

php artisan make:controller Api/Auth/VerificationController

Kolejną czynnością będzie utworzenie metody verify w nowo utworzonym kontrolerze.

/**
 * Mark the authenticated user's email address as verified.
 *
 * @param  \Illuminate\Http\Request $request
 * @return \Illuminate\Http\Response
 */
public function verify(Request $request)
{
  $user = User::findOrFail($request->route('id'));

  if ($user->markEmailAsVerified()) {
    return response()->json([
      'message' => 'Email verified'
    ]);
  }
}

Po tych zmianach test weryfikacji adresu email przechodzi.

vendor/bin/phpunit --filter=user_can_verify_email_address_by_signed_url
OK (1 test, 2 assertions)

W następnym wpisie napiszę testy i funkcjonalność resetowania hasła.

You may also like...