fix: refuse implausible accommodation booking prices
This commit is contained in:
1 parent
773cd4f847
commit
56adf72d12
16 files changed
+628
-15
No files matched your search
@@ -109,6 +109,60 @@ class AccommodationBookingTypeTest extends TestCase
|
||||
self::assertCount(0, $this->validate($booking, ['Default']));
|
||||
}
|
||||
|
||||
/**
|
||||
* The overflow this guards against reached production as an out-of-range write on
|
||||
* total_price: every figure in the breakdown is multiplied by the pax count and the
|
||||
* nights, so an implausible input for either produces an implausible total.
|
||||
*/
|
||||
public function testADepartureBeforeTheArrivalIsRejected(): void
|
||||
{
|
||||
$booking = $this->bookingFor('2026-09-23', '2026-09-20', 30);
|
||||
|
||||
$violations = $this->validate($booking, ['Default']);
|
||||
|
||||
self::assertCount(1, $violations);
|
||||
self::assertSame('dateTo', $violations[0]->getPropertyPath());
|
||||
}
|
||||
|
||||
public function testAMistypedYearIsRejectedRatherThanPriced(): void
|
||||
{
|
||||
// 2226 instead of 2026 — one wrong digit, 200 years of running costs.
|
||||
$booking = $this->bookingFor('2026-09-23', '2226-09-25', 30);
|
||||
|
||||
$violations = $this->validate($booking, ['Default']);
|
||||
|
||||
self::assertCount(1, $violations);
|
||||
self::assertSame('dateTo', $violations[0]->getPropertyPath());
|
||||
}
|
||||
|
||||
public function testAnImplausiblePaxCountIsRejected(): void
|
||||
{
|
||||
$booking = $this->bookingFor('2026-09-23', '2026-09-25', AccommodationBooking::MAX_PAX + 1);
|
||||
|
||||
$violations = $this->validate($booking, ['Default']);
|
||||
|
||||
self::assertCount(1, $violations);
|
||||
self::assertSame('paxCount', $violations[0]->getPropertyPath());
|
||||
}
|
||||
|
||||
public function testTheLargestBookingOnRecordStillPasses(): void
|
||||
{
|
||||
// 150 people for 18 nights: the ceilings must not get in the way of real business.
|
||||
$booking = $this->bookingFor('2026-09-23', '2026-10-11', 150);
|
||||
|
||||
self::assertCount(0, $this->validate($booking, ['Default']));
|
||||
}
|
||||
|
||||
private function bookingFor(string $dateFrom, string $dateTo, int $paxCount): AccommodationBooking
|
||||
{
|
||||
$booking = new AccommodationBooking();
|
||||
$booking->setDateFrom(new \DateTimeImmutable($dateFrom));
|
||||
$booking->setDateTo(new \DateTimeImmutable($dateTo));
|
||||
$booking->setPaxCount($paxCount);
|
||||
|
||||
return $booking;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string[]
|
||||
*/
|
||||
|
||||
Reference in new issue
Block a user