from datetime import UTC, datetime from endpoint_monitor.models import CheckResult, MonitorStatus async def test_crud_and_status(client): created = await client.post("/v1/monitors", json={"name": "site", "url": "https://example.com/a?secret=x"}) assert created.status_code == 201 monitor_id = created.json()["id"] assert (await client.get("/v1/monitors")).json()[0]["name"] == "site" updated = await client.patch(f"/v1/monitors/{monitor_id}", json={"name": "renamed"}) assert updated.status_code == 200 assert updated.json()["revision"] == 2 status = await client.get(f"/v1/monitors/{monitor_id}/status") assert status.json()["status"] == "unknown" assert (await client.delete(f"/v1/monitors/{monitor_id}")).status_code == 204 assert (await client.get(f"/v1/monitors/{monitor_id}")).status_code == 404 async def test_duplicate_and_validation(client): body = {"name": "same", "url": "https://example.com"} assert (await client.post("/v1/monitors", json=body)).status_code == 201 assert (await client.post("/v1/monitors", json=body)).status_code == 409 assert (await client.post("/v1/monitors", json={"name": "x", "url": "file:///etc/passwd"})).status_code == 422 async def test_check_updates_status(client, app): class FakeChecker: async def check(self, url, monitor_id): return CheckResult(status=MonitorStatus.UP, checked_at=datetime.now(UTC), latency_ms=1.2, http_status=204, final_url="https://example.com/") app.state.checker = FakeChecker() monitor_id = (await client.post("/v1/monitors", json={"name": "site", "url": "https://example.com"})).json()["id"] result = await client.post(f"/v1/monitors/{monitor_id}/check") assert result.status_code == 200 assert result.json()["status"] == "up" saved = (await client.get(f"/v1/monitors/{monitor_id}/status")).json() assert saved["status"] == "up" assert saved["last_check"]["http_status"] == 204 async def test_operations(client): assert (await client.get("/healthz")).json() == {"status": "ok"} assert (await client.get("/readyz")).json() == {"status": "ready"}