delete(); }); it('creates a reservation when area is free', function () { MasterImage::create(['path' => 'master.png', 'version' => 1]); $payload = ['x' => 10, 'y' => 10, 'w' => 20, 'h' => 20, 'offsetX' => 0, 'offsetY' => 0]; $response = $this->postJson('/api/grid/reserve', $payload); $response->assertSuccessful(); $data = $response->json(); expect($data['reservation_id'])->toBeInt(); expect(Reservation::count())->toBe(1); }); it('returns 409 when overlapping reservation exists', function () { MasterImage::create(['path' => 'master.png', 'version' => 1]); // Existing reservation occupies cells 1..3 x 1..3 Reservation::create(['x' => 1, 'y' => 1, 'w' => 3, 'h' => 3, 'status' => 'held', 'reserved_until' => now()->addMinutes(5)]); // Attempt overlapping reservation (pixel coords mapping to cell 2,2..) // cellSize default 20 -> cell 2 starts at pixel 40 $payload = ['x' => 40, 'y' => 40, 'w' => 40, 'h' => 40, 'offsetX' => 0, 'offsetY' => 0]; $response = $this->postJson('/api/grid/reserve', $payload); $response->assertStatus(409); });