From ade5510bd58f1c86b163cce5fd4842d7291d5752 Mon Sep 17 00:00:00 2001 From: tcpsyn Date: Sun, 5 Apr 2026 02:22:10 -0600 Subject: [PATCH] Add voice roster validator for caller_gen --- backend/services/caller_gen.py | 9 +++++++++ tests/test_caller_gen.py | 24 ++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/backend/services/caller_gen.py b/backend/services/caller_gen.py index be8c1e8..b51e044 100644 --- a/backend/services/caller_gen.py +++ b/backend/services/caller_gen.py @@ -36,3 +36,12 @@ def parse_batch_response(raw: str) -> list[CallerIdentity]: raise ValueError(f"CallerIdentity missing fields: {missing}") result.append(CallerIdentity(**{k: c[k] for k in REQUIRED_FIELDS})) return result + + +def resolve_voice(suggestion: str, roster: list[str]) -> str: + """Map sonnet's voice suggestion to a real voice in the roster. + Case-insensitive exact match; deterministic fallback to first roster entry.""" + if not suggestion or not roster: + return roster[0] if roster else "" + lower_map = {v.lower(): v for v in roster} + return lower_map.get(suggestion.lower(), roster[0]) diff --git a/tests/test_caller_gen.py b/tests/test_caller_gen.py index e49c94e..87a08ee 100644 --- a/tests/test_caller_gen.py +++ b/tests/test_caller_gen.py @@ -35,3 +35,27 @@ def test_parse_batch_response_rejects_missing_fields(): bad = '{"callers": [{"name": "Jim"}]}' with pytest.raises(ValueError, match="missing"): parse_batch_response(bad) + + +def test_resolve_voice_matches_exact(): + from backend.services.caller_gen import resolve_voice + roster = ["Marcus", "Dennis", "Priya", "Edward"] + assert resolve_voice("Marcus", roster) == "Marcus" + + +def test_resolve_voice_case_insensitive(): + from backend.services.caller_gen import resolve_voice + roster = ["Marcus", "Dennis"] + assert resolve_voice("marcus", roster) == "Marcus" + + +def test_resolve_voice_falls_back_when_no_match(): + from backend.services.caller_gen import resolve_voice + roster = ["Marcus", "Dennis"] + # Deterministic fallback: return first from roster + assert resolve_voice("Santiago", roster) == "Marcus" + + +def test_resolve_voice_empty_suggestion_falls_back(): + from backend.services.caller_gen import resolve_voice + assert resolve_voice("", ["Marcus"]) == "Marcus"