52 lines
2.3 KiB
Python
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
|