from collections.abc import AsyncIterator import httpx import pytest from app.checker import EndpointChecker, Fetcher, HopResponse from app.config import Settings from app.main import create_app from app.security import ValidatedTarget class OkayFetcher(Fetcher): async def fetch(self, target: ValidatedTarget, settings: Settings, remaining: float) -> HopResponse: return HopResponse(204, None) async def public_resolver(host: str, port: int) -> list[tuple[object, ...]]: return [(2, 1, 6, "", ("93.184.216.34", port))] @pytest.fixture async def client() -> AsyncIterator[httpx.AsyncClient]: settings = Settings(total_timeout_seconds=2, connect_timeout_seconds=1, read_timeout_seconds=1) checker = EndpointChecker(settings, fetcher=OkayFetcher(), resolver=public_resolver) app = create_app(settings=settings, checker=checker) async with httpx.AsyncClient(transport=httpx.ASGITransport(app=app), base_url="http://test") as value: yield value @pytest.mark.asyncio async def test_crud_check_status_and_operations(client: httpx.AsyncClient) -> None: assert (await client.get("/health")).json() == {"status": "ok"} assert (await client.get("/ready")).json()["storage"] == "process-local-memory" created = await client.post("/monitors", json={"name": "site", "url": "https://example.com/x?secret=yes"}) assert created.status_code == 201 monitor_id = created.json()["id"] assert len((await client.get("/monitors")).json()) == 1 checked = await client.post(f"/monitors/{monitor_id}/check") assert checked.json()["status"]["state"] == "up" assert checked.json()["applied"] is True assert (await client.get(f"/monitors/{monitor_id}/status")).json()["http_status"] == 204 updated = await client.put(f"/monitors/{monitor_id}", json={"name": "new", "url": "https://example.com/new"}) assert updated.json()["current_status"] is None assert (await client.delete(f"/monitors/{monitor_id}")).status_code == 204 assert (await client.get(f"/monitors/{monitor_id}")).status_code == 404 @pytest.mark.asyncio async def test_validation_and_missing(client: httpx.AsyncClient) -> None: assert (await client.post("/monitors", json={"name": "", "url": "ftp://x"})).status_code == 422 assert (await client.get("/monitors/00000000-0000-0000-0000-000000000000")).status_code == 404