fix: allow booking the free part of a partly booked day
This commit is contained in:
1 parent
a88ff7ff24
commit
78839838f0
15 files changed
+541
-60
No files matched your search
@@ -210,6 +210,56 @@ class BookingControllerTest extends WebTestCase
|
||||
self::assertCount(1, $crawler->filter(\sprintf('[hx-get="/bookings/%d/edit"]', $booking->getId())));
|
||||
}
|
||||
|
||||
/**
|
||||
* The reported bug, end to end: one person holds 09:00-13:00, a second opens the board on
|
||||
* its default all-day span, and must be able to take the rest of the day.
|
||||
*
|
||||
* The plan used to render that desk exactly like a fully booked one and give it no hx-get at
|
||||
* all, so the second person could not reach the modal unless they happened to narrow the
|
||||
* span by hand first.
|
||||
*/
|
||||
public function testASecondPersonCanBookTheRestOfADayFromTheDefaultBoard(): void
|
||||
{
|
||||
$desk = $this->resource('D1', svgElementId: 'desk-01');
|
||||
$this->em->persist(new Booking($this->user('[email protected]'), $desk, new \DateTimeImmutable('2026-10-01'), TimeRange::fromMinutes(540, 780)));
|
||||
$this->em->flush();
|
||||
|
||||
$this->client->loginUser($this->user('[email protected]'));
|
||||
|
||||
// 1. The shape is clickable on the all-day board.
|
||||
$crawler = $this->client->request('GET', '/book/desk?date=2026-10-01');
|
||||
$opener = $crawler->filter(\sprintf('g[hx-get*="/bookings/new/%d/"]', $desk->getId()));
|
||||
self::assertCount(1, $opener, 'a partly booked desk must still open the booking modal');
|
||||
|
||||
// 2. The modal it opens is prefilled with a window that is actually free.
|
||||
$modal = $this->client->request('GET', $opener->attr('hx-get'), server: ['HTTP_HX-Request' => 'true']);
|
||||
self::assertSame('13:00', $modal->filter('#booking_startTime')->attr('value'));
|
||||
// Blank, not 24:00 -- <input type="time"> cannot hold it, and blank already means
|
||||
// "to the end of the day" here just as it does on the board's span picker.
|
||||
self::assertNull($modal->filter('#booking_endTime')->attr('value'));
|
||||
|
||||
// 3. Submitting it works.
|
||||
$response = $this->submitBookingModal($desk, '2026-10-01', [
|
||||
'startTime' => '13:00',
|
||||
'endTime' => '17:00',
|
||||
]);
|
||||
|
||||
self::assertSame(Response::HTTP_OK, $response->getStatusCode());
|
||||
self::assertCount(2, $this->em->getRepository(Booking::class)->findBy(['resource' => $desk]));
|
||||
}
|
||||
|
||||
public function testAFullyBookedDeskIsNotClickable(): void
|
||||
{
|
||||
$desk = $this->resource('D1', svgElementId: 'desk-01');
|
||||
$this->em->persist(new Booking($this->user('[email protected]'), $desk, new \DateTimeImmutable('2026-10-01')));
|
||||
$this->em->flush();
|
||||
|
||||
$this->client->loginUser($this->user('[email protected]'));
|
||||
$crawler = $this->client->request('GET', '/book/desk?date=2026-10-01');
|
||||
|
||||
self::assertCount(0, $crawler->filter(\sprintf('g[hx-get*="/bookings/new/%d/"]', $desk->getId())));
|
||||
}
|
||||
|
||||
public function testBookingPartOfADay(): void
|
||||
{
|
||||
$this->client->loginUser($this->user('[email protected]'));
|
||||
|
||||
Reference in new issue
Block a user