Add voice roster validator for caller_gen
This commit is contained in:
@@ -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])
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user