decomposer: generate files for Maintain only the latest check result for each monitored target in concurrency-safe memory and expose it through the specified FastAPI current-status endpoint.
This commit is contained in:
56
tests/test_api.py
Normal file
56
tests/test_api.py
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
from fastapi import FastAPI
|
||||||
|
from httpx import ASGITransport, AsyncClient
|
||||||
|
|
||||||
|
from current_status import CurrentStatusCoordinator, build_current_status_router
|
||||||
|
|
||||||
|
|
||||||
|
def app_for(coordinator: CurrentStatusCoordinator) -> FastAPI:
|
||||||
|
app = FastAPI()
|
||||||
|
app.include_router(build_current_status_router(coordinator))
|
||||||
|
return app
|
||||||
|
|
||||||
|
|
||||||
|
async def test_not_found_and_no_check_yet_are_distinct() -> None:
|
||||||
|
coordinator = CurrentStatusCoordinator()
|
||||||
|
async with AsyncClient(
|
||||||
|
transport=ASGITransport(app=app_for(coordinator)), base_url="http://test"
|
||||||
|
) as client:
|
||||||
|
missing = await client.get("/targets/missing/status")
|
||||||
|
assert missing.status_code == 404
|
||||||
|
assert missing.json() == {
|
||||||
|
"detail": {"code": "target_not_found", "target_id": "missing"}
|
||||||
|
}
|
||||||
|
|
||||||
|
await coordinator.register_target("new")
|
||||||
|
pending = await client.get("/targets/new/status")
|
||||||
|
assert pending.status_code == 200
|
||||||
|
assert pending.json() == {
|
||||||
|
"target_id": "new",
|
||||||
|
"state": "not_checked",
|
||||||
|
"result": None,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async def test_endpoint_returns_only_latest_result() -> None:
|
||||||
|
coordinator = CurrentStatusCoordinator()
|
||||||
|
await coordinator.register_target("web")
|
||||||
|
|
||||||
|
async def first(_target):
|
||||||
|
return {"up": False}
|
||||||
|
|
||||||
|
async def second(_target):
|
||||||
|
return {"up": True, "status_code": 204}
|
||||||
|
|
||||||
|
assert await coordinator.run_check("web", {}, first)
|
||||||
|
assert await coordinator.run_check("web", {}, second)
|
||||||
|
assert await coordinator.retained_status_count() == 1
|
||||||
|
|
||||||
|
async with AsyncClient(
|
||||||
|
transport=ASGITransport(app=app_for(coordinator)), base_url="http://test"
|
||||||
|
) as client:
|
||||||
|
response = await client.get("/targets/web/status")
|
||||||
|
assert response.status_code == 200
|
||||||
|
body = response.json()
|
||||||
|
assert body["state"] == "checked"
|
||||||
|
assert body["result"]["payload"] == {"up": True, "status_code": 204}
|
||||||
|
assert body["result"]["check_sequence"] == 2
|
||||||
Reference in New Issue
Block a user