114 lines
4.8 KiB
PHP
114 lines
4.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Tests\Controller\Account;
|
|
|
|
use App\Entity\User;
|
|
use App\Exception\GuestAccountActivationExpiredException;
|
|
use App\Service\BookingGuestAccountManager;
|
|
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
|
|
use Symfony\Bundle\SecurityBundle\Security;
|
|
use Symfony\Component\HttpFoundation\Request;
|
|
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
|
|
|
class GuestAccountActivationControllerTest extends WebTestCase
|
|
{
|
|
public function testExpiredActivationLinkShowsResendPageInsteadOf404(): void
|
|
{
|
|
$client = self::createClient([], ['HTTPS' => 'on']);
|
|
$client->disableReboot();
|
|
|
|
$guestAccountManager = $this->createMock(BookingGuestAccountManager::class);
|
|
$guestAccountManager
|
|
->expects(self::once())
|
|
->method('validateActivationRequest')
|
|
->with(self::isInstanceOf(Request::class))
|
|
->willThrowException(new GuestAccountActivationExpiredException());
|
|
$guestAccountManager->expects(self::never())->method('consumeActivation');
|
|
$guestAccountManager->expects(self::never())->method('validateActivationUrlForResend');
|
|
$guestAccountManager->expects(self::never())->method('resendWelcomeEmail');
|
|
|
|
$security = $this->createMock(Security::class);
|
|
$security->expects(self::never())->method('login');
|
|
|
|
self::getContainer()->set(BookingGuestAccountManager::class, $guestAccountManager);
|
|
self::getContainer()->set(Security::class, $security);
|
|
|
|
$client->request('GET', '/welcome/[email protected]&nonce=current-nonce&expires=9999999999&_hash=signature');
|
|
|
|
self::assertResponseIsSuccessful();
|
|
self::assertStringContainsString('Link', $client->getResponse()->getContent());
|
|
self::assertStringContainsString('Willkommens-E-Mail erneut senden', $client->getResponse()->getContent());
|
|
}
|
|
|
|
public function testResendActionResendsWelcomeMailAndRedirectsToLogin(): void
|
|
{
|
|
$client = self::createClient([], ['HTTPS' => 'on']);
|
|
$client->disableReboot();
|
|
|
|
$user = new User('[email protected]');
|
|
$user->setWelcomeActivationNonce('current-nonce');
|
|
|
|
$guestAccountManager = $this->createMock(BookingGuestAccountManager::class);
|
|
$guestAccountManager
|
|
->expects(self::once())
|
|
->method('validateActivationRequest')
|
|
->with(self::isInstanceOf(Request::class))
|
|
->willThrowException(new GuestAccountActivationExpiredException());
|
|
$guestAccountManager
|
|
->expects(self::once())
|
|
->method('validateActivationUrlForResend')
|
|
->with(self::callback(static function (string $activationUrl): bool {
|
|
return str_contains($activationUrl, 'email=customer%40example.com')
|
|
|| str_contains($activationUrl, '[email protected]');
|
|
}))
|
|
->willReturn($user);
|
|
$guestAccountManager
|
|
->expects(self::once())
|
|
->method('resendWelcomeEmail')
|
|
->with($user);
|
|
|
|
$security = $this->createMock(Security::class);
|
|
$security->expects(self::never())->method('login');
|
|
|
|
self::getContainer()->set(BookingGuestAccountManager::class, $guestAccountManager);
|
|
self::getContainer()->set(Security::class, $security);
|
|
|
|
$crawler = $client->request('GET', '/welcome/[email protected]&nonce=current-nonce&expires=9999999999&_hash=signature');
|
|
self::assertResponseIsSuccessful();
|
|
|
|
$form = $crawler->selectButton('Willkommens-E-Mail erneut senden')->form();
|
|
$client->submit($form);
|
|
|
|
self::assertResponseRedirects('/');
|
|
$client->followRedirect();
|
|
|
|
self::assertStringContainsString('Wir haben dir die Willkommens-E-Mail erneut gesendet.', $client->getResponse()->getContent());
|
|
}
|
|
|
|
public function testTamperedActivationLinkStillReturns404(): void
|
|
{
|
|
$client = self::createClient([], ['HTTPS' => 'on']);
|
|
$client->disableReboot();
|
|
|
|
$guestAccountManager = $this->createMock(BookingGuestAccountManager::class);
|
|
$guestAccountManager
|
|
->expects(self::once())
|
|
->method('validateActivationRequest')
|
|
->with(self::isInstanceOf(Request::class))
|
|
->willThrowException(new NotFoundHttpException());
|
|
$guestAccountManager->expects(self::never())->method('consumeActivation');
|
|
|
|
$security = $this->createMock(Security::class);
|
|
$security->expects(self::never())->method('login');
|
|
|
|
self::getContainer()->set(BookingGuestAccountManager::class, $guestAccountManager);
|
|
self::getContainer()->set(Security::class, $security);
|
|
|
|
$client->request('GET', '/welcome/[email protected]&nonce=current-nonce&expires=9999999999&_hash=invalid');
|
|
|
|
self::assertResponseStatusCodeSame(404);
|
|
}
|
|
}
|