|
9 | 9 | from pathlib import Path |
10 | 10 | import pytest |
11 | 11 | from unittest.mock import patch, MagicMock, AsyncMock |
12 | | - |
| 12 | +from typing import List |
13 | 13 | import sys |
| 14 | +from datetime import datetime |
14 | 15 |
|
15 | 16 | sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) |
16 | 17 |
|
@@ -99,33 +100,39 @@ async def test_parse_meetings(sample_html): |
99 | 100 |
|
100 | 101 | assert len(meetings) == 2 |
101 | 102 |
|
102 | | - assert meetings[0]["meeting"] == "Regular Council Meeting" |
103 | | - assert meetings[0]["date"] == "April 2, 2025" |
104 | | - assert meetings[0]["duration"] == "1:29" |
105 | | - assert "AgendaViewer.php?view_id=4&clip_id=6515" in meetings[0]["agenda"] |
106 | | - assert "MediaPlayer.php?view_id=4&clip_id=6515" in meetings[0]["video"] |
| 103 | + mtg_one = meetings[0] |
| 104 | + |
| 105 | + assert mtg_one.meeting == "Regular Council Meeting" |
| 106 | + assert mtg_one.date == datetime(2025, 4, 2, 17, 3) |
| 107 | + assert mtg_one.duration == "1:29" |
| 108 | + assert "AgendaViewer.php?view_id=4&clip_id=6515" in mtg_one.agenda.encoded_string() |
| 109 | + assert "MediaPlayer.php?view_id=4&clip_id=6515" in mtg_one.video.encoded_string() |
| 110 | + |
| 111 | + mtg_two = meetings[1] |
107 | 112 |
|
108 | | - assert meetings[1]["meeting"] == "Animal Welfare Commission" |
109 | | - assert meetings[1]["date"] == "March 10, 2025" |
110 | | - assert meetings[1]["duration"] == "0:38" |
111 | | - assert meetings[1]["agenda"] is None |
112 | | - assert "MediaPlayer.php?view_id=4&clip_id=6474" in meetings[1]["video"] |
| 113 | + assert mtg_two.meeting == "Animal Welfare Commission" |
| 114 | + assert mtg_two.date == datetime(2025, 3, 10, 18, 0) |
| 115 | + assert mtg_two.duration == "0:38" |
| 116 | + assert mtg_two.agenda is None |
| 117 | + assert "MediaPlayer.php?view_id=4&clip_id=6474" in mtg_two.video.encoded_string() |
113 | 118 |
|
114 | 119 |
|
115 | 120 | @pytest.mark.asyncio |
116 | 121 | async def test_parse_real_html(real_html): |
117 | 122 | """Test that meetings are correctly parsed from real HTML""" |
118 | | - meetings = await parse_meetings(real_html) |
| 123 | + meetings: List[Meeting] = await parse_meetings(real_html) |
119 | 124 |
|
120 | 125 | # Basic validation |
121 | 126 | assert isinstance(meetings, list) |
122 | 127 | assert len(meetings) > 0 |
123 | 128 |
|
124 | 129 | # Check that each meeting has the expected fields |
| 130 | + # this is now overkill since pydantic handles this |
125 | 131 | for meeting in meetings: |
126 | | - assert "meeting" in meeting |
127 | | - assert "date" in meeting |
128 | | - assert "duration" in meeting |
| 132 | + assert isinstance(meeting, Meeting) |
| 133 | + assert hasattr(meeting, "meeting") |
| 134 | + assert hasattr(meeting, "date") |
| 135 | + assert hasattr(meeting, "duration") |
129 | 136 | # Agenda and video may be None for some meetings |
130 | 137 |
|
131 | 138 |
|
|
0 commit comments