import gradio as gr
import pytest
from app.domain import TranscriptAnalysis
from app.errors import AnalysisNotFoundError, ConfigurationError, InvalidTranscriptError
from app.frontend import (
analyze_transcript,
analyze_transcript_for_ui,
format_action_items,
format_status_html,
hide_lookup_loading,
lookup_analysis,
lookup_analysis_for_ui,
show_analyze_failure,
show_analyze_loading,
)
class FakeService:
def __init__(self) -> None:
self.analysis = TranscriptAnalysis(
id="analysis-1",
summary="The team aligned on next steps.",
action_items=("Confirm owner", "Set deadline"),
)
def analyze(self, transcript: str) -> TranscriptAnalysis:
if not transcript.strip():
raise InvalidTranscriptError("Transcript cannot be empty.")
return self.analysis
def get(self, analysis_id: str) -> TranscriptAnalysis:
if analysis_id != self.analysis.id:
raise AnalysisNotFoundError(f"Transcript analysis '{analysis_id}' was not found.")
return self.analysis
class MisconfiguredService:
def analyze(self, transcript: str) -> TranscriptAnalysis:
raise ConfigurationError("OPENAI_API_KEY is not configured.")
def get(self, analysis_id: str) -> TranscriptAnalysis:
raise ConfigurationError("OPENAI_API_KEY is not configured.")
def test_analyze_transcript_returns_formatted_result() -> None:
result = analyze_transcript("Discuss roadmap.", FakeService)
assert result == (
"analysis-1",
"The team aligned on next steps.",
"1. Confirm owner\n2. Set deadline",
)
def test_analyze_transcript_for_ui_reveals_result_group() -> None:
result_visibility, result_markdown = analyze_transcript_for_ui(
"Discuss roadmap.",
FakeService,
)
assert result_visibility["visible"] is True
assert "### Analysis ID\n`analysis-1`" in result_markdown
assert "### Summary\nThe team aligned on next steps." in result_markdown
assert "### Suggested Next Steps\n1. Confirm owner\n2. Set deadline" in result_markdown
def test_lookup_analysis_returns_formatted_result() -> None:
result = lookup_analysis(" analysis-1 ", FakeService)
assert result == (
"analysis-1",
"The team aligned on next steps.",
"1. Confirm owner\n2. Set deadline",
)
def test_show_analyze_loading_sets_status_and_hides_results() -> None:
status_visibility, result_visibility, result_markdown, button_state = show_analyze_loading()
assert status_visibility["visible"] is True
assert "Analyzing transcript..." in status_visibility["value"]
assert result_visibility["visible"] is False
assert result_markdown == ""
assert button_state["value"] == "Analyzing..."
assert button_state["interactive"] is False
def test_lookup_analysis_for_ui_reveals_result_group() -> None:
result_visibility, result_markdown = lookup_analysis_for_ui(" analysis-1 ", FakeService)
assert result_visibility["visible"] is True
assert "### Analysis ID\n`analysis-1`" in result_markdown
assert "### Summary\nThe team aligned on next steps." in result_markdown
assert "### Suggested Next Steps\n1. Confirm owner\n2. Set deadline" in result_markdown
def test_hide_lookup_loading_clears_status_and_restores_button() -> None:
status_visibility, button_state = hide_lookup_loading()
assert status_visibility["visible"] is False
assert status_visibility["value"] == ""
assert button_state["value"] == "Lookup"
assert button_state["interactive"] is True
def test_show_analyze_failure_sets_error_status_and_restores_button() -> None:
status_visibility, result_visibility, result_markdown, button_state = show_analyze_failure()
assert status_visibility["visible"] is True
assert "Could not complete the request." in status_visibility["value"]
assert result_visibility["visible"] is False
assert result_markdown == ""
assert button_state["value"] == "Analyze"
assert button_state["interactive"] is True
def test_format_status_html_escapes_message() -> None:
status_html = format_status_html("")
assert "<script>alert('x')</script>" in status_html
assert "