'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/activate?email=customer@example.com&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('customer@example.com'); $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=customer@example.com'); })) ->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/activate?email=customer@example.com&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/activate?email=customer@example.com&nonce=current-nonce&expires=9999999999&_hash=invalid'); self::assertResponseStatusCodeSame(404); } }