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.