Files
crucible-agent-build-fastap…/tests/test_api.py

52 lines
2.3 KiB
Python

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