diff --git a/backend/services/caller_gen.py b/backend/services/caller_gen.py new file mode 100644 index 0000000..be8c1e8 --- /dev/null +++ b/backend/services/caller_gen.py @@ -0,0 +1,38 @@ +from dataclasses import dataclass +from typing import Optional +import json + +REQUIRED_FIELDS = { + "name", "age", "voice_suggestion", "location", "identity", + "situation", "reason_calling", "opening_line", "secret_want", + "specific_details", "emotional_register" +} + + +@dataclass +class CallerIdentity: + name: str + age: int + voice_suggestion: str + location: str + identity: str + situation: str + reason_calling: str + opening_line: str + secret_want: str + specific_details: list[str] + emotional_register: str + # set after voice validation + voice_resolved: Optional[str] = None + + +def parse_batch_response(raw: str) -> list[CallerIdentity]: + data = json.loads(raw) + callers = data.get("callers", []) + result = [] + for c in callers: + missing = REQUIRED_FIELDS - set(c.keys()) + if missing: + raise ValueError(f"CallerIdentity missing fields: {missing}") + result.append(CallerIdentity(**{k: c[k] for k in REQUIRED_FIELDS})) + return result diff --git a/tests/test_caller_gen.py b/tests/test_caller_gen.py new file mode 100644 index 0000000..e49c94e --- /dev/null +++ b/tests/test_caller_gen.py @@ -0,0 +1,37 @@ +import pytest +from backend.services.caller_gen import CallerIdentity, parse_batch_response + +SAMPLE_JSON = """ +{ + "callers": [ + { + "name": "Danny Ortega", + "age": 47, + "voice_suggestion": "Marcus", + "location": "Silver City, NM", + "identity": "A plumber who inherited his uncle's taxidermy shop...", + "situation": "He's been getting calls from people...", + "reason_calling": "Someone left a note in his mailbox tonight...", + "opening_line": "Luke, I need to ask you something weird.", + "secret_want": "Permission to just throw it all away", + "specific_details": ["the elk head in the basement", "the note said 'she forgot'", "his uncle's Rolodex"], + "emotional_register": "quietly unsettled, trying to sound casual" + } + ] +} +""" + + +def test_parse_batch_response_returns_caller_list(): + callers = parse_batch_response(SAMPLE_JSON) + assert len(callers) == 1 + assert callers[0].name == "Danny Ortega" + assert callers[0].age == 47 + assert "taxidermy" in callers[0].identity + assert len(callers[0].specific_details) == 3 + + +def test_parse_batch_response_rejects_missing_fields(): + bad = '{"callers": [{"name": "Jim"}]}' + with pytest.raises(ValueError, match="missing"): + parse_batch_response(bad)