def test_create_bike_requires_name(client): client.login() csrf = client.csrf(client.get("/bikes/new").text) resp = client.post("/bikes/new", data={"csrf": csrf, "name": ""}) assert resp.status_code == 200 assert "Name must be" in resp.text def test_create_and_list_bike(client): client.login() bike_id = client.create_bike("Roadie") assert bike_id >= 1 assert "Roadie" in client.get("/").text d = client.get(f"/bikes/{bike_id}") assert "Service status" in d.text def test_update_bike(client): client.login() bike_id = client.create_bike("Roadie") csrf = client.csrf(client.get(f"/bikes/{bike_id}/edit").text) resp = client.post( f"/bikes/{bike_id}/edit", data={"csrf": csrf, "name": "Roadie 2", "service_interval_miles": "3000"}, ) assert resp.status_code == 303 assert "Roadie 2" in client.get(f"/bikes/{bike_id}").text def test_create_event_and_list(client): client.login() bike_id = client.create_bike("Roadie") result = client.create_event( bike_id, type="service", event_date="2026-09-09", mileage="15000", cost="150" ) assert result["status"] == 200 assert "15,000" in result["text"] assert "service" in result["text"] def test_event_rejects_future_date(client): client.login() bike_id = client.create_bike("Roadie") result = client.create_event(bike_id, type="service", event_date="2999-01-01") assert "future" in result["text"].lower() def test_event_rejects_negative_mileage(client): client.login() bike_id = client.create_bike("Roadie") result = client.create_event(bike_id, type="other", event_date="2026-09-09", mileage="-5") assert "negative" in result["text"].lower() def test_event_requires_known_type(client): client.login() bike_id = client.create_bike("Roadie") result = client.create_event(bike_id, type="bogus", event_date="2026-09-09") assert "must be one of" in result["text"].lower() def test_delete_event(client): client.login() bike_id = client.create_bike("Roadie") client.create_event(bike_id, type="service", event_date="2026-09-09", mileage="15000") page = client.get(f"/bikes/{bike_id}").text import re m = re.search(r"/events/(\d+)/delete", page) assert m, "delete link not found" event_id = m.group(1) csrf = client.csrf(page) resp = client.post(f"/events/{event_id}/delete", data={"csrf": csrf}) assert resp.status_code == 303 assert "No events yet" in client.get(f"/bikes/{bike_id}").text def test_delete_bike_cascades(client): client.login() bike_id = client.create_bike("Roadie") client.create_event(bike_id, type="service", event_date="2026-09-09", mileage="15000") page = client.get(f"/bikes/{bike_id}/edit").text csrf = client.csrf(page) resp = client.post(f"/bikes/{bike_id}/delete", data={"csrf": csrf}) assert resp.status_code == 303 assert client.get(f"/bikes/{bike_id}").status_code == 303