def test_list_bookings_filters_by_vehicle(ops_client): response = ops_client.get("/api/v1/bookings", params={"vehicle_ref": "MO-024"}) assert response.status_code == 200 bookings = response.json() assert len(bookings) >= 1 assert all(b["vehicle_ref"] == "MO-024" for b in bookings) def test_list_bookings_supports_bounded_search_pages(ops_client): response = ops_client.get( "/api/v1/bookings", params={"query": "BK-", "page": 1, "page_size": 25}, ) assert response.status_code == 200 body = response.json() assert body["page"] == 1 assert body["page_size"] == 25 assert body["total"] > 25 assert body["total_pages"] > 1 assert len(body["items"]) == 25 def test_create_booking_rejects_overlap_and_audits_valid_booking(ops_client): existing = ops_client.get("/api/v1/bookings/BK-DEMO-RETURN").json() conflict = ops_client.post( "/api/v1/bookings", json={ "customer_ref": "CUS-0001", "vehicle_ref": existing["vehicle_ref"], "starts_at": existing["starts_at"], "ends_at": existing["ends_at"], }, ) assert conflict.status_code == 409 available_vehicle = ops_client.get( "/api/v1/vehicles", params={"status": "available"} ).json()[0]["public_ref"] created = ops_client.post( "/api/v1/bookings", json={ "customer_ref": "CUS-0001", "vehicle_ref": available_vehicle, "starts_at": "2030-09-01T10:00:00Z", "ends_at": "2030-09-02T12:00:00Z", }, ) assert created.status_code == 201 body = created.json() assert body["status"] == "reserved" assert body["vehicle_ref"] == available_vehicle def test_get_booking_detail(ops_client): response = ops_client.get("/api/v1/bookings/BK-DEMO-RETURN") assert response.status_code == 200 body = response.json() assert body["status"] == "active" assert body["vehicle_ref"] == "MO-024" def test_get_booking_404_for_unknown_ref(ops_client): response = ops_client.get("/api/v1/bookings/BK-UNKNOWN") assert response.status_code == 404