diff --git a/tests/test_api.py b/tests/test_api.py index b8bb3fb..ff3a531 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1,44 +1,46 @@ -from datetime import UTC, datetime +from unittest.mock import AsyncMock, patch -from endpoint_monitor.models import CheckResult, MonitorStatus +from app.models import CheckSnapshot, State, now -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 +def create(client, url="https://example.com/path?secret=value"): + response = client.post("/monitors", json={"name": "site", "url": url}) + assert response.status_code == 201 + return response.json() -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 +def test_operational_routes_document_ephemeral_storage(client): + assert client.get("/healthz").json() == {"status": "ok"} + assert client.get("/readyz").json() == { + "status": "ready", "storage": "process-local-memory" + } -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 +def test_crud_and_status_lifecycle(client): + item = create(client) + ident = item["id"] + assert item["status"]["state"] == "unknown" + assert client.get("/monitors").json()[0]["id"] == ident + assert client.get(f"/monitors/{ident}/status").json()["state"] == "unknown" + replaced = client.put(f"/monitors/{ident}", json={ + "name": "new", "url": "https://example.org" + }) + assert replaced.status_code == 200 + assert replaced.json()["revision"] == 2 + assert client.delete(f"/monitors/{ident}").status_code == 204 + assert client.get(f"/monitors/{ident}").status_code == 404 -async def test_operations(client): - assert (await client.get("/healthz")).json() == {"status": "ok"} - assert (await client.get("/readyz")).json() == {"status": "ready"} +def test_check_updates_status(client): + item = create(client) + result = CheckSnapshot(state=State.up, checked_at=now(), latency_ms=2, http_status=204) + with patch("app.main.check_url", new=AsyncMock(return_value=result)): + response = client.post(f"/monitors/{item['id']}/check") + assert response.status_code == 200 + assert response.json()["state"] == "up" + assert client.get(f"/monitors/{item['id']}/status").json()["http_status"] == 204 + + +def test_validation_and_not_found(client): + assert client.post("/monitors", json={"name": "", "url": "file:///tmp/x"}).status_code == 422 + assert client.get("/monitors/00000000-0000-0000-0000-000000000000").status_code == 404