"""Tests for briefing formatters."""
from datetime import date, datetime
from zoneinfo import ZoneInfo
import pytest
from daily_briefing.formatters import MarkdownFormatter, TextFormatter
from daily_briefing.models import (
ActionItem,
CalendarEvent,
Conflict,
ConflictType,
DailyBriefing,
EventType,
FreeSlot,
MeetingSummary,
Priority,
)
@pytest.fixture
def sample_briefing(tz):
"""Create a sample briefing for testing formatters."""
briefing_date = date(2025, 1, 15)
events = [
CalendarEvent(
id="1",
title="Team Standup",
start=datetime(2025, 1, 15, 9, 0, tzinfo=tz),
end=datetime(2025, 1, 15, 9, 30, tzinfo=tz),
source="Google Calendar",
event_type=EventType.MEETING,
),
CalendarEvent(
id="2",
title="Product Review",
start=datetime(2025, 1, 15, 14, 0, tzinfo=tz),
end=datetime(2025, 1, 15, 15, 0, tzinfo=tz),
source="Google Calendar",
event_type=EventType.MEETING,
location="Conference Room A",
),
]
conflicts = [
Conflict(
conflict_type=ConflictType.BACK_TO_BACK,
events=events,
description="Back-to-back meetings",
severity=Priority.LOW,
),
]
free_slots = [
FreeSlot(
start=datetime(2025, 1, 15, 10, 0, tzinfo=tz),
end=datetime(2025, 1, 15, 14, 0, tzinfo=tz),
duration_minutes=240,
),
]
meetings = [
MeetingSummary(
id="m1",
title="Sprint Planning",
date=datetime(2025, 1, 14, 10, 0, tzinfo=tz),
duration_minutes=60,
participants=["alice", "bob"],
overview="Discussed sprint goals and assigned tasks.",
action_items=["Review PR #123", "Update documentation"],
),
]
action_items = [
ActionItem(
id="a1",
text="Review PR #123",
source="Fireflies",
meeting_title="Sprint Planning",
priority=Priority.HIGH,
),
]
return DailyBriefing(
date=briefing_date,
generated_at=datetime(2025, 1, 15, 8, 0, tzinfo=tz),
events=events,
conflicts=conflicts,
free_slots=free_slots,
recent_meetings=meetings,
action_items=action_items,
total_meetings=2,
total_meeting_hours=1.5,
focus_time_hours=4.0,
)
class TestTextFormatter:
"""Tests for TextFormatter."""
def test_format_briefing(self, sample_briefing):
"""Test formatting a briefing as plain text."""
result = TextFormatter.format(sample_briefing)
assert "DAILY BRIEFING" in result
assert "January 15, 2025" in result
assert "Team Standup" in result
assert "Product Review" in result
assert "Conference Room A" in result
def test_format_includes_stats(self, sample_briefing):
"""Test that stats are included."""
result = TextFormatter.format(sample_briefing)
assert "Meetings: 2" in result
assert "1.5 hours" in result
def test_format_includes_action_items(self, sample_briefing):
"""Test that action items are included."""
result = TextFormatter.format(sample_briefing)
assert "Review PR #123" in result
assert "Sprint Planning" in result
class TestMarkdownFormatter:
"""Tests for MarkdownFormatter."""
def test_format_briefing(self, sample_briefing):
"""Test formatting a briefing as Markdown."""
result = MarkdownFormatter.format(sample_briefing)
assert "# Daily Briefing" in result
assert "## Today's Schedule" in result
assert "Team Standup" in result
def test_format_includes_tables(self, sample_briefing):
"""Test that Markdown includes tables."""
result = MarkdownFormatter.format(sample_briefing)
assert "| Metric | Value |" in result
assert "| Total Meetings |" in result
def test_format_includes_action_items(self, sample_briefing):
"""Test that action items use checkbox format."""
result = MarkdownFormatter.format(sample_briefing)
assert "- [ ] Review PR #123" in result