from pathlib import Path import pytest from audita.config import AuditaConfig from audita.errors import AuditaValidationError from audita.pipeline import process_transcript from audita.schemas import CorrectionCandidate, CorrectionSet, parse_glossary_yaml, parse_transcript_json class FakeLLMClient: def __init__(self, responses): self.responses = list(responses) self.calls = 0 def create_corrections(self, messages, config): self.calls += 1 return self.responses.pop(0) def _config(tmp_path): return AuditaConfig( api_key="key", max_section_tokens=16000, confidence_threshold=0.8, max_retries=3, work_dir=tmp_path / "work", ) def _glossary(): return parse_glossary_yaml( """ glossary: - name: "Chauntea" category: deity summary: "Chauntea is a deity." """ ) def _transcript(): return parse_transcript_json( """ [ {"speaker": "Eric", "start": 0.0, "end": 1.0, "text": "I ask Chontia."} ] """ ) def test_pipeline_processes_with_fake_llm_and_cleans_work_dir(tmp_path): correction = CorrectionCandidate( segment_index=0, speaker="Eric", start=0.0, end=1.0, original_text="I ask Chontia.", corrected_text="I ask Chauntea.", confidence=0.95, ) fake_client = FakeLLMClient([CorrectionSet(corrections=[correction])]) revised = process_transcript( _transcript(), _glossary(), _config(tmp_path), llm_client=fake_client, ) assert revised[0].text == "I ask Chauntea." assert fake_client.calls == 1 assert list((tmp_path / "work").iterdir()) == [] def test_pipeline_preserves_work_dir_on_failure(tmp_path): correction = CorrectionCandidate( segment_index=0, speaker="Eric", start=0.0, end=1.0, original_text="Different text.", corrected_text="I ask Chauntea.", confidence=0.95, ) fake_client = FakeLLMClient([CorrectionSet(corrections=[correction])]) with pytest.raises(AuditaValidationError): process_transcript( _transcript(), _glossary(), _config(tmp_path), llm_client=fake_client, ) preserved = list((tmp_path / "work").iterdir()) assert len(preserved) == 1 assert (Path(preserved[0]) / "section-0000.json").exists()