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}")
|
raise ValueError(f"CallerIdentity missing fields: {missing}")
|
||||||
result.append(CallerIdentity(**{k: c[k] for k in REQUIRED_FIELDS}))
|
result.append(CallerIdentity(**{k: c[k] for k in REQUIRED_FIELDS}))
|
||||||
return result
|
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"}]}'
|
bad = '{"callers": [{"name": "Jim"}]}'
|
||||||
with pytest.raises(ValueError, match="missing"):
|
with pytest.raises(ValueError, match="missing"):
|
||||||
parse_batch_response(bad)
|
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