feat: complete production hardening implementation, specialty canonicalization, google-genai migration, voice reliability, sqlite concurrency, and test suite consolidation
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
import pytest
|
||||
from app.ai.orchestrator import classify_specialty_from_symptoms, SPECIALTY_RULES
|
||||
from app.specialties.registry import SPECIALTIES, CANONICAL_ALIASES, get_specialty_config, validate_specialty_registry
|
||||
|
||||
|
||||
def test_diabetology_detection():
|
||||
"""Verify diabetes keywords resolve to canonical code 'diabetology'."""
|
||||
phrases = [
|
||||
"My sugar level is very high",
|
||||
"I have type 2 diabetes",
|
||||
"Taking Glycomet 500mg daily",
|
||||
"HbA1c report shows 8.1%",
|
||||
"High blood sugar after meals",
|
||||
"Taking insulin injections",
|
||||
]
|
||||
for text in phrases:
|
||||
res = classify_specialty_from_symptoms(text)
|
||||
assert res["code"] == "diabetology", f"Failed for '{text}': got {res['code']}"
|
||||
|
||||
|
||||
def test_mental_health_canonical_code():
|
||||
"""Verify mental health symptoms resolve to canonical 'mental_health', not 'psychiatry'."""
|
||||
phrases = [
|
||||
"Feeling depressed and anxious",
|
||||
"Having severe panic attacks and insomnia",
|
||||
"மன அழுத்தம் அதிகமாக இருக்கு",
|
||||
]
|
||||
for text in phrases:
|
||||
res = classify_specialty_from_symptoms(text)
|
||||
assert res["code"] == "mental_health", f"Failed for '{text}': got {res['code']}"
|
||||
|
||||
|
||||
def test_general_canonical_code():
|
||||
"""Verify general symptoms resolve to canonical 'general', not 'general_medicine'."""
|
||||
phrases = [
|
||||
"I have mild fever and body pain",
|
||||
"Feeling weak for 2 days",
|
||||
]
|
||||
for text in phrases:
|
||||
res = classify_specialty_from_symptoms(text)
|
||||
assert res["code"] == "general", f"Failed for '{text}': got {res['code']}"
|
||||
|
||||
|
||||
def test_all_specialties_have_configs():
|
||||
"""Verify all 9 canonical specialties have dedicated, non-fallback configuration files."""
|
||||
canonical_codes = [
|
||||
"general",
|
||||
"mental_health",
|
||||
"diabetology",
|
||||
"cardiology",
|
||||
"dermatology",
|
||||
"neurology",
|
||||
"orthopedics",
|
||||
"gastroenterology",
|
||||
"pulmonology",
|
||||
]
|
||||
for code in canonical_codes:
|
||||
assert code in SPECIALTIES, f"Missing specialty config in registry for {code}"
|
||||
config = get_specialty_config(code)
|
||||
assert config["code"] == code, f"Specialty {code} resolved to fallback code {config['code']}"
|
||||
assert len(config.get("focus_areas", [])) > 0
|
||||
|
||||
|
||||
def test_no_supported_specialty_falls_back_to_general():
|
||||
"""Verify that every classifier output is registered and does not fall back to general."""
|
||||
validation = validate_specialty_registry()
|
||||
assert validation["valid"] is True
|
||||
assert validation["registered_count"] >= 9
|
||||
assert len(validation["missing_configs"]) == 0
|
||||
|
||||
|
||||
def test_registry_classifier_consistency():
|
||||
"""Verify all classifier rule codes match registered specialty codes."""
|
||||
registered = set(SPECIALTIES.keys())
|
||||
for rule in SPECIALTY_RULES:
|
||||
code = rule["code"]
|
||||
assert code in registered, f"Classifier rule code '{code}' is not in registered SPECIALTIES"
|
||||
|
||||
|
||||
def test_alias_compatibility():
|
||||
"""Verify legacy aliases convert to canonical configs cleanly."""
|
||||
assert get_specialty_config("general_medicine")["code"] == "general"
|
||||
assert get_specialty_config("psychiatry")["code"] == "mental_health"
|
||||
Reference in New Issue
Block a user