- Fix test_autoresearch_perplexity: patch target was dashboard.routes.experiments.get_experiment_history but the function is imported locally inside the route handler, so patch the source module timmy.autoresearch.get_experiment_history instead. - Add tests for src/timmy/interview.py (previously 0% coverage): question structure, run_interview flow, error handling, formatting. - Produce interview transcript document from structured Timmy interview. https://claude.ai/code/session_01EXDzXqgsC2ohS8qreF1fBo Co-authored-by: Claude <noreply@anthropic.com>
78 lines
2.7 KiB
Python
78 lines
2.7 KiB
Python
"""Tests for the interview module."""
|
|
|
|
from timmy.interview import (
|
|
INTERVIEW_QUESTIONS,
|
|
InterviewEntry,
|
|
format_transcript,
|
|
run_interview,
|
|
)
|
|
|
|
|
|
class TestInterviewQuestions:
|
|
def test_questions_not_empty(self):
|
|
assert len(INTERVIEW_QUESTIONS) > 0
|
|
|
|
def test_each_question_has_category_and_question(self):
|
|
for item in INTERVIEW_QUESTIONS:
|
|
assert "category" in item
|
|
assert "question" in item
|
|
|
|
def test_covers_expected_categories(self):
|
|
categories = {q["category"] for q in INTERVIEW_QUESTIONS}
|
|
assert categories == {"Identity", "Capabilities", "Values", "Operational"}
|
|
|
|
|
|
class TestRunInterview:
|
|
def test_collects_all_answers(self):
|
|
transcript = run_interview(chat_fn=lambda q: f"answer to: {q}")
|
|
assert len(transcript) == len(INTERVIEW_QUESTIONS)
|
|
for entry in transcript:
|
|
assert isinstance(entry, InterviewEntry)
|
|
assert entry.answer.startswith("answer to:")
|
|
|
|
def test_on_answer_callback_called(self):
|
|
received = []
|
|
run_interview(chat_fn=lambda q: "ok", on_answer=lambda e: received.append(e))
|
|
assert len(received) == len(INTERVIEW_QUESTIONS)
|
|
|
|
def test_custom_questions(self):
|
|
custom = [{"category": "Test", "question": "Hello?"}]
|
|
transcript = run_interview(chat_fn=lambda q: "hi", questions=custom)
|
|
assert len(transcript) == 1
|
|
assert transcript[0].category == "Test"
|
|
assert transcript[0].question == "Hello?"
|
|
|
|
def test_chat_fn_error_captured(self):
|
|
def failing_chat(q):
|
|
raise RuntimeError("boom")
|
|
|
|
transcript = run_interview(chat_fn=failing_chat)
|
|
assert len(transcript) == len(INTERVIEW_QUESTIONS)
|
|
for entry in transcript:
|
|
assert "(Error: boom)" in entry.answer
|
|
|
|
|
|
class TestFormatTranscript:
|
|
def test_empty_transcript(self):
|
|
assert format_transcript([]) == "(No interview data)"
|
|
|
|
def test_contains_header(self):
|
|
entries = [InterviewEntry(category="Identity", question="Who?", answer="Timmy")]
|
|
result = format_transcript(entries)
|
|
assert "TIMMY INTERVIEW TRANSCRIPT" in result
|
|
|
|
def test_contains_qa(self):
|
|
entries = [InterviewEntry(category="Identity", question="Who?", answer="Timmy")]
|
|
result = format_transcript(entries)
|
|
assert "Q: Who?" in result
|
|
assert "A: Timmy" in result
|
|
|
|
def test_groups_by_category(self):
|
|
entries = [
|
|
InterviewEntry(category="Identity", question="Q1", answer="A1"),
|
|
InterviewEntry(category="Values", question="Q2", answer="A2"),
|
|
]
|
|
result = format_transcript(entries)
|
|
assert "--- Identity ---" in result
|
|
assert "--- Values ---" in result
|