feat: manually create customer access link for offer and update status

addresses #869eea8d7
This commit is contained in:
Björn Fromme
2026-08-24 09:19:16 +02:00
parent 7c5f6dd5ef
commit 48db290625
6 changed files with 323 additions and 7 deletions
@@ -449,6 +449,71 @@ class AccommodationBookingServiceTest extends TestCase
yield 'discarded' => [AccommodationBookingStatus::Discarded];
}
public function testGenerateAccessLinkIssuesTheLinkAndMovesToOpenWithoutMailing(): void
{
$mailer = $this->createMock(Mailer::class);
$mailer->expects(self::never())->method('createAndSendEmail');
$booking = new AccommodationBooking();
$booking->setStatus(AccommodationBookingStatus::Requested);
$booking->setEmail('[email protected]');
$service = $this->createServiceWithAccommodation(mailer: $mailer);
$service->generateAccessLink($booking);
self::assertSame(AccommodationBookingStatus::Open, $booking->getStatus());
self::assertNotNull($booking->getAccessLinkIssuedAt());
}
public function testGenerateAccessLinkPublishesAnAdminAuthoredDraftTheSameWay(): void
{
$booking = new AccommodationBooking();
$booking->setStatus(AccommodationBookingStatus::Draft);
$booking->setEmail('[email protected]');
$service = $this->createServiceWithAccommodation();
$service->generateAccessLink($booking);
self::assertSame(AccommodationBookingStatus::Open, $booking->getStatus());
}
public function testGenerateAccessLinkKeepsAnAlreadyIssuedLinkSoEarlierLinksStayValid(): void
{
$issuedAt = new \DateTimeImmutable('2026-01-01');
$booking = new AccommodationBooking();
$booking->setStatus(AccommodationBookingStatus::Requested);
$booking->setEmail('[email protected]');
$booking->setAccessLinkIssuedAt($issuedAt);
$service = $this->createServiceWithAccommodation();
$service->generateAccessLink($booking);
self::assertSame($issuedAt, $booking->getAccessLinkIssuedAt());
}
/**
* @dataProvider statusesThatAreNotAwaitingAnOffer
*/
public function testGenerateAccessLinkNoOpsOnceTheOfferIsOut(AccommodationBookingStatus $status): void
{
$entityManager = $this->createMock(EntityManagerInterface::class);
$entityManager->expects(self::never())->method('flush');
$booking = new AccommodationBooking();
$booking->setStatus($status);
$booking->setEmail('[email protected]');
$service = $this->createServiceWithAccommodation(entityManager: $entityManager);
$service->generateAccessLink($booking);
self::assertSame($status, $booking->getStatus());
}
public function testDiscardBookingClosesTheBookingSilently(): void
{
$entityManager = $this->createMock(EntityManagerInterface::class);