Docuask / backend /tests /test_stats.py
Claude
Add data-collection & feedback layer (Session 4)
44215ae unverified
Raw
History Blame Contribute Delete
2.38 kB
"""Tests for the data-collection & feedback layer (Session 4)."""
from fastapi.testclient import TestClient
from app.main import app
client = TestClient(app)
TEXT = (
"The mitochondria is the powerhouse of the cell. "
"The Eiffel Tower is located in Paris, France."
)
def _ask() -> dict:
doc_id = client.post("/documents", data={"text": TEXT}).json()["document_id"]
response = client.post(
"/ask", json={"document_id": doc_id, "question": "Where is the Eiffel Tower?"}
)
assert response.status_code == 200
return response.json()
def test_ask_persists_interaction_with_latency():
result = _ask()
assert "interaction_id" in result
assert isinstance(result["latency_ms"], int)
assert result["latency_ms"] >= 0
stats = client.get("/stats").json()
assert stats["total_questions"] == 1
assert stats["median_latency_ms"] is not None
def test_feedback_updates_stats():
result = _ask()
response = client.post(
"/feedback",
json={"interaction_id": result["interaction_id"], "feedback": "up"},
)
assert response.status_code == 200
stats = client.get("/stats").json()
assert stats["thumbs_up"] == 1
assert stats["thumbs_down"] == 0
assert stats["thumbs_up_rate"] == 1.0
def test_thumbs_up_rate_reflects_mix():
up = _ask()
down = _ask()
client.post("/feedback", json={"interaction_id": up["interaction_id"], "feedback": "up"})
client.post("/feedback", json={"interaction_id": down["interaction_id"], "feedback": "down"})
stats = client.get("/stats").json()
assert stats["total_questions"] == 2
assert stats["thumbs_up_rate"] == 0.5
def test_invalid_feedback_value_is_rejected():
result = _ask()
response = client.post(
"/feedback",
json={"interaction_id": result["interaction_id"], "feedback": "meh"},
)
assert response.status_code == 422
def test_feedback_unknown_interaction_returns_404():
response = client.post(
"/feedback", json={"interaction_id": "does-not-exist", "feedback": "up"}
)
assert response.status_code == 404
def test_stats_empty_by_default():
stats = client.get("/stats").json()
assert stats["total_questions"] == 0
assert stats["median_latency_ms"] is None
assert stats["thumbs_up_rate"] is None
assert stats["questions_over_time"] == []