Spiritual_Health_Project / tests /test_conversation_verification_export.py
DocUA's picture
Implement Or_4.txt feedback: Provider Summary as final exchange, simplified interface improvements
e8c7fad
import csv
import json
from datetime import datetime
def test_conversation_verification_export_serializes_without_record_id(tmp_path, monkeypatch):
"""Regression test: conversation verification records use exchange_id, not record_id."""
# Minimal stand-in objects (match the attributes used by open_verification_window export code)
class _Record:
def __init__(self):
self.exchange_id = "sess_1"
self.exchange_number = 1
self.timestamp = datetime(2025, 12, 12, 0, 0, 0)
self.user_message = "hi"
self.assistant_response = "hello"
self.original_classification = "YELLOW"
self.original_confidence = 0.9
self.original_indicators = ["stress"]
self.original_reasoning = "reason"
self.is_correct = None
self.correct_classification = None
self.correction_reason = None
self.verifier_notes = None
class _Session:
def __init__(self):
self.session_id = "verification_test"
self.patient_name = "Test"
self.verifier_name = "Verifier"
self.start_time = datetime(2025, 12, 12, 0, 0, 0)
self.verification_records = [_Record()]
vs = _Session()
# This mirrors the payload schema in gradio_app.open_verification_window
payload = {
"session_id": vs.session_id,
"patient_name": vs.patient_name,
"verifier_name": vs.verifier_name,
"start_time": vs.start_time.isoformat(),
"verification_records": [
{
"exchange_id": getattr(r, "exchange_id", None),
"record_id": getattr(r, "exchange_id", None),
"timestamp": r.timestamp.isoformat(),
"user_message": r.user_message,
"assistant_response": r.assistant_response,
"original_classification": r.original_classification,
"original_confidence": r.original_confidence,
"original_indicators": r.original_indicators,
"original_reasoning": r.original_reasoning,
"is_correct": r.is_correct,
"correct_classification": r.correct_classification,
"correction_reason": r.correction_reason,
"verifier_notes": r.verifier_notes,
}
for r in vs.verification_records
],
}
out = tmp_path / "export.json"
out.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8")
loaded = json.loads(out.read_text(encoding="utf-8"))
assert loaded["verification_records"][0]["exchange_id"] == "sess_1"
assert loaded["verification_records"][0]["record_id"] == "sess_1"
def test_conversation_verification_csv_contains_expected_columns(tmp_path):
meta = {
"session_id": "verification_test",
"patient_name": "Test",
"verifier_name": "Verifier",
"start_time": "2025-12-12T00:00:00",
}
records = [
{
"exchange_id": "sess_1",
"exchange_number": 1,
"original_classification": "YELLOW",
"original_confidence": 0.9,
"is_correct": False,
"verifier_notes": "Needs follow-up",
"user_message": "hi",
"assistant_response": "hello",
}
]
out = tmp_path / "export.csv"
fieldnames = [
"session_id",
"patient_name",
"verifier_name",
"start_time",
"exchange_number",
"exchange_id",
"original_classification",
"original_confidence",
"is_correct",
"verifier_notes",
"user_message",
"assistant_response",
]
with out.open("w", encoding="utf-8", newline="") as f:
w = csv.DictWriter(f, fieldnames=fieldnames)
w.writeheader()
for r in records:
w.writerow(
{
"session_id": meta["session_id"],
"patient_name": meta["patient_name"],
"verifier_name": meta["verifier_name"],
"start_time": meta["start_time"],
"exchange_number": r.get("exchange_number"),
"exchange_id": r.get("exchange_id"),
"original_classification": r.get("original_classification"),
"original_confidence": r.get("original_confidence"),
"is_correct": r.get("is_correct"),
"verifier_notes": r.get("verifier_notes"),
"user_message": r.get("user_message"),
"assistant_response": r.get("assistant_response"),
}
)
rows = list(csv.DictReader(out.open("r", encoding="utf-8")))
assert rows and rows[0]["verifier_notes"] == "Needs follow-up"