| """Tests for the FastAPI server endpoints.""" |
|
|
| import sys, os |
| sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) |
|
|
| import pytest |
| from fastapi.testclient import TestClient |
|
|
|
|
| |
| |
| pytestmark = pytest.mark.skipif( |
| os.getenv("SKIP_SERVER_TESTS", "1") == "1", |
| reason="Set SKIP_SERVER_TESTS=0 to run server tests (requires dataset access)" |
| ) |
|
|
|
|
| class TestHealthEndpoint: |
| def test_health_returns_200(self): |
| from server.app import app |
| client = TestClient(app) |
| resp = client.get("/health") |
| assert resp.status_code == 200 |
| data = resp.json() |
| assert data["status"] == "healthy" |
| assert "version" in data |
|
|
|
|
| class TestTasksEndpoint: |
| def test_tasks_returns_three_tasks(self): |
| from server.app import app |
| client = TestClient(app) |
| resp = client.get("/tasks") |
| assert resp.status_code == 200 |
| data = resp.json() |
| assert len(data["tasks"]) == 3 |
| task_ids = [t["task_id"] for t in data["tasks"]] |
| assert "task_1_factual_grounding" in task_ids |
| assert "task_2_multi_hop_synthesis" in task_ids |
| assert "task_3_adversarial_resistance" in task_ids |
|
|
| def test_tasks_has_action_schema(self): |
| from server.app import app |
| client = TestClient(app) |
| resp = client.get("/tasks") |
| data = resp.json() |
| assert "action_schema" in data |
| assert "answer" in data["action_schema"]["properties"] |
|
|
|
|
| class TestGraderEndpoint: |
| def test_grader_requires_task_id(self): |
| from server.app import app |
| client = TestClient(app) |
| resp = client.post("/grader", json={"step_rewards": [0.5], "step_infos": [{}]}) |
| assert resp.status_code == 422 |
|
|
| def test_grader_invalid_task_id(self): |
| from server.app import app |
| client = TestClient(app) |
| resp = client.post("/grader", json={ |
| "task_id": "nonexistent", |
| "step_rewards": [0.5], |
| "step_infos": [{}], |
| }) |
| assert resp.status_code == 404 |
|
|
| def test_grader_returns_score(self): |
| from server.app import app |
| client = TestClient(app) |
| resp = client.post("/grader", json={ |
| "task_id": "task_1_factual_grounding", |
| "step_rewards": [0.7, 0.5, 0.3], |
| "step_infos": [ |
| {"correctness": 0.7, "grounding": 0.6, "calibration": 0.8, |
| "hallucination_score": 0.1, "is_hallucination": False}, |
| {"correctness": 0.5, "grounding": 0.4, "calibration": 0.7, |
| "hallucination_score": 0.2, "is_hallucination": False}, |
| {"correctness": 0.3, "grounding": 0.3, "calibration": 0.6, |
| "hallucination_score": 0.5, "is_hallucination": True}, |
| ], |
| }) |
| assert resp.status_code == 200 |
| data = resp.json() |
| assert 0.0 <= data["score"] <= 1.0 |
| assert "breakdown" in data |
|
|
|
|
| class TestMetadataEndpoint: |
| def test_metadata(self): |
| from server.app import app |
| client = TestClient(app) |
| resp = client.get("/metadata") |
| assert resp.status_code == 200 |
| data = resp.json() |
| assert data["name"] == "hallucination-guard-env" |
| assert "version" in data |