create(new CreateUserDto( email: new EmailAddress('user@example.com'), passwordHash: null, )); $token = app(CreateEmailConfirmationToken::class)->execute( new CreateEmailConfirmationTokenRequest( user: $user, minuteOffset: 10, ), ); $response = $this->postJson('/api/confirm-email', [ 'token' => $token->getToken(), 'password' => 'password123', ]); $response->assertOk(); $response->assertJsonPath('user.email', 'user@example.com'); $confirmedUser = $userRepository->find($user->getId()); $this->assertNotNull($confirmedUser); $passwordHash = $confirmedUser->getPasswordHash(); $this->assertNotNull($passwordHash); $this->assertTrue( app(PasswordHasher::class)->verify('password123', $passwordHash), ); $this->assertNull( app(EmailConfirmationTokenRepository::class) ->findByToken($token->getToken()), ); $cookie = $response->getCookie(AuthMiddleware::COOKIE_NAME, false); $this->assertNotNull($cookie); $this->assertNotNull( app(SessionRepository::class)->findByToken($cookie->getValue()), ); } public function test_confirmation_rejects_an_unknown_token(): void { $response = $this->postJson('/api/confirm-email', [ 'token' => 'unknown-token', 'password' => 'password123', ]); $response->assertConflict(); $response->assertJson(['error' => 'token not found']); } }