Spaces:
Sleeping
Sleeping
| """Smoke tests for the FastAPI app.""" | |
| from __future__ import annotations | |
| import json | |
| from pathlib import Path | |
| import pytest | |
| from fastapi.testclient import TestClient | |
| from app.main import create_app | |
| SAMPLES_DIR = Path(__file__).resolve().parents[1] / "app" / "data_sources" / "samples" | |
| def client() -> TestClient: | |
| return TestClient(create_app()) | |
| def test_health(client: TestClient): | |
| r = client.get("/api/health") | |
| assert r.status_code == 200 | |
| body = r.json() | |
| assert body["status"] == "ok" | |
| assert body["service"] == "bayesscenparams-backend" | |
| def test_list_samples(client: TestClient): | |
| r = client.get("/api/data/samples") | |
| assert r.status_code == 200 | |
| body = r.json() | |
| ids = {s["id"] for s in body} | |
| assert ids == {"gdp", "climate", "population"} | |
| for s in body: | |
| assert s["n"] > 0 | |
| assert s["icon"] | |
| def test_get_sample(client: TestClient): | |
| r = client.get("/api/data/samples/gdp") | |
| assert r.status_code == 200 | |
| body = r.json() | |
| assert body["id"] == "gdp" | |
| assert len(body["values"]) > 100 | |
| assert isinstance(body["values"][0], float) | |
| def test_bayesian_compute(client: TestClient): | |
| gdp = json.loads((SAMPLES_DIR / "sample-gdp.json").read_text()) | |
| payload = { | |
| "data": gdp["values"], | |
| "judgments": [0, 1, 2, 3, 4], | |
| "R": 10.0, | |
| } | |
| r = client.post("/api/bayesian/compute", json=payload) | |
| assert r.status_code == 200 | |
| body = r.json() | |
| assert "prior" in body and "likelihood" in body and "posterior" in body | |
| assert len(body["posterior"]["weights"]) == 5 | |
| assert abs(sum(body["posterior"]["weights"]) - 1.0) < 1e-9 | |
| # likelihood for level 4 is R^2 = 100 | |
| assert body["likelihood"]["weights"][4] == pytest.approx(100.0) | |
| def test_bayesian_compute_validates_R(): | |
| client = TestClient(create_app()) | |
| gdp = json.loads((SAMPLES_DIR / "sample-gdp.json").read_text()) | |
| r = client.post( | |
| "/api/bayesian/compute", | |
| json={"data": gdp["values"], "judgments": [0, 1, 2, 3, 4], "R": 0.5}, | |
| ) | |
| assert r.status_code == 422 | |
| def test_sensitivity(client: TestClient): | |
| gdp = json.loads((SAMPLES_DIR / "sample-gdp.json").read_text()) | |
| r = client.post( | |
| "/api/bayesian/sensitivity", | |
| json={"data": gdp["values"], "judgments": [0, 1, 2, 3, 4]}, | |
| ) | |
| assert r.status_code == 200 | |
| body = r.json() | |
| assert len(body["points"]) == 5 | |
| # Each point's posterior sums to 1 | |
| for p in body["points"]: | |
| s = sum(p["result"]["posterior"]["weights"]) | |
| assert abs(s - 1.0) < 1e-9 | |