|
| 1 | +from datetime import datetime, timezone |
| 2 | + |
1 | 3 | import pytest |
2 | 4 | from rest_framework import status |
3 | 5 | from rest_framework.test import APIClient |
|
6 | 8 | from django.urls import reverse |
7 | 9 |
|
8 | 10 | # pylint: disable=duplicate-code |
9 | | -from events.factories import EventFactory, PlaylistFactory, TagFactory, UserFactory, VideoAssetFactory |
| 11 | +from events.factories import ( |
| 12 | + EventFactory, |
| 13 | + EventPresenterFactory, |
| 14 | + PlaylistFactory, |
| 15 | + TagFactory, |
| 16 | + UserFactory, |
| 17 | + VideoAssetFactory, |
| 18 | +) |
10 | 19 |
|
11 | 20 | User = get_user_model() |
12 | 21 |
|
@@ -49,20 +58,6 @@ def test_events_search_filter_by_description(self, api_client): |
49 | 58 | assert len(response.data["results"]) == 1 |
50 | 59 | assert response.data["results"][0]["title"] == "Tech Event 1" |
51 | 60 |
|
52 | | - def test_events_search_filter_by_creator_name(self, api_client): |
53 | | - """ Test filtering events by creator's first or last name """ |
54 | | - creator1 = UserFactory(first_name="John", last_name="Doe") |
55 | | - creator2 = UserFactory(first_name="Jane", last_name="Smith") |
56 | | - |
57 | | - self._create_event_with_video(title="Event 1", creator=creator1) |
58 | | - self._create_event_with_video(title="Event 2", creator=creator2) |
59 | | - |
60 | | - response = api_client.get(reverse("events-list"), {'search': 'John'}) |
61 | | - |
62 | | - assert response.status_code == status.HTTP_200_OK |
63 | | - assert len(response.data["results"]) == 1 |
64 | | - assert response.data["results"][0]["title"] == "Event 1" |
65 | | - |
66 | 61 | def test_events_tag_filter(self, api_client): |
67 | 62 | """ Test filtering events by tag """ |
68 | 63 | python_tag = TagFactory(name="Python") |
@@ -136,3 +131,164 @@ def test_events_ordering_by_featured(self, api_client): |
136 | 131 | assert response.status_code == status.HTTP_200_OK |
137 | 132 | assert len(response.data["results"]) == 3 |
138 | 133 | assert response.data["results"][0]["title"] != "Non-Featured Event" |
| 134 | + |
| 135 | + def test_events_search_filter_fuzzy_matching_title(self, api_client): |
| 136 | + """ Test fuzzy matching in title search """ |
| 137 | + self._create_event_with_video(title="All-Hands Meeting 2024") |
| 138 | + self._create_event_with_video(title="Machine Learning Summit") |
| 139 | + |
| 140 | + response = api_client.get(reverse("events-list"), {'search': 'All Hands'}) |
| 141 | + |
| 142 | + assert response.status_code == status.HTTP_200_OK |
| 143 | + assert len(response.data["results"]) == 1 |
| 144 | + assert response.data["results"][0]["title"] == "All-Hands Meeting 2024" |
| 145 | + |
| 146 | + def test_events_search_filter_fuzzy_matching_description(self, api_client): |
| 147 | + """ Test fuzzy matching in description search """ |
| 148 | + self._create_event_with_video(title="Tech Event", description="Learn about Python programming") |
| 149 | + self._create_event_with_video(title="Other Event", description="Data science basics") |
| 150 | + |
| 151 | + response = api_client.get(reverse("events-list"), {'search': 'Python'}) |
| 152 | + |
| 153 | + assert response.status_code == status.HTTP_200_OK |
| 154 | + assert len(response.data["results"]) == 1 |
| 155 | + assert response.data["results"][0]["title"] == "Tech Event" |
| 156 | + |
| 157 | + def test_events_search_filter_by_playlist_name(self, api_client): |
| 158 | + """ Test filtering events by search term matching playlist name """ |
| 159 | + demo_playlist = PlaylistFactory(name="Demo Hour") |
| 160 | + tech_playlist = PlaylistFactory(name="Tech Talks") |
| 161 | + |
| 162 | + event1 = self._create_event_with_video(title="Weekly Demo Session", description="Demo of new features") |
| 163 | + event1.playlists.add(demo_playlist) |
| 164 | + |
| 165 | + event2 = self._create_event_with_video(title="Architecture Discussion", description="Tech stack overview") |
| 166 | + event2.playlists.add(tech_playlist) |
| 167 | + |
| 168 | + response = api_client.get(reverse("events-list"), {'search': 'Demo'}) |
| 169 | + |
| 170 | + assert response.status_code == status.HTTP_200_OK |
| 171 | + assert len(response.data["results"]) == 1 |
| 172 | + assert response.data["results"][0]["title"] == "Weekly Demo Session" |
| 173 | + |
| 174 | + def test_events_search_filter_by_presenter_name(self, api_client): |
| 175 | + """ Test filtering events by presenter name """ |
| 176 | + presenter_user = UserFactory(first_name="Alice", last_name="Johnson") |
| 177 | + other_user = UserFactory(first_name="Bob", last_name="Wilson") |
| 178 | + |
| 179 | + event1 = self._create_event_with_video(title="Python Workshop") |
| 180 | + event2 = self._create_event_with_video(title="Data Science Talk") |
| 181 | + |
| 182 | + EventPresenterFactory(event=event1, user=presenter_user) |
| 183 | + EventPresenterFactory(event=event2, user=other_user) |
| 184 | + |
| 185 | + response = api_client.get(reverse("events-list"), {'search': 'Alice'}) |
| 186 | + |
| 187 | + assert response.status_code == status.HTTP_200_OK |
| 188 | + assert len(response.data["results"]) == 1 |
| 189 | + assert response.data["results"][0]["title"] == "Python Workshop" |
| 190 | + |
| 191 | + response = api_client.get(reverse("events-list"), {'search': 'Johnson'}) |
| 192 | + |
| 193 | + assert response.status_code == status.HTTP_200_OK |
| 194 | + assert len(response.data["results"]) == 1 |
| 195 | + assert response.data["results"][0]["title"] == "Python Workshop" |
| 196 | + |
| 197 | + def test_events_search_multiple_presenters(self, api_client): |
| 198 | + """ Test event with multiple presenters """ |
| 199 | + presenter1 = UserFactory(first_name="Alice", last_name="Johnson") |
| 200 | + presenter2 = UserFactory(first_name="Bob", last_name="Smith") |
| 201 | + other_presenter = UserFactory(first_name="Carol", last_name="Davis") |
| 202 | + |
| 203 | + event1 = self._create_event_with_video(title="Team Presentation") |
| 204 | + event2 = self._create_event_with_video(title="Solo Talk") |
| 205 | + |
| 206 | + EventPresenterFactory(event=event1, user=presenter1) |
| 207 | + EventPresenterFactory(event=event1, user=presenter2) |
| 208 | + |
| 209 | + EventPresenterFactory(event=event2, user=other_presenter) |
| 210 | + |
| 211 | + response = api_client.get(reverse("events-list"), {'search': 'Alice'}) |
| 212 | + assert response.status_code == status.HTTP_200_OK |
| 213 | + assert len(response.data["results"]) == 1 |
| 214 | + assert response.data["results"][0]["title"] == "Team Presentation" |
| 215 | + |
| 216 | + response = api_client.get(reverse("events-list"), {'search': 'Bob'}) |
| 217 | + assert response.status_code == status.HTTP_200_OK |
| 218 | + assert len(response.data["results"]) == 1 |
| 219 | + assert response.data["results"][0]["title"] == "Team Presentation" |
| 220 | + |
| 221 | + response = api_client.get(reverse("events-list"), {'search': 'Carol'}) |
| 222 | + assert response.status_code == status.HTTP_200_OK |
| 223 | + assert len(response.data["results"]) == 1 |
| 224 | + assert response.data["results"][0]["title"] == "Solo Talk" |
| 225 | + |
| 226 | + def test_events_search_filter_by_tag_name(self, api_client): |
| 227 | + """ Test filtering events by search term matching tag name """ |
| 228 | + python_tag = TagFactory(name="Python") |
| 229 | + javascript_tag = TagFactory(name="JavaScript") |
| 230 | + |
| 231 | + event1 = self._create_event_with_video(title="Backend Development") |
| 232 | + event1.tags.add(python_tag) |
| 233 | + |
| 234 | + event2 = self._create_event_with_video(title="Frontend Development") |
| 235 | + event2.tags.add(javascript_tag) |
| 236 | + |
| 237 | + response = api_client.get(reverse("events-list"), {'search': 'Python'}) |
| 238 | + |
| 239 | + assert response.status_code == status.HTTP_200_OK |
| 240 | + assert len(response.data["results"]) == 1 |
| 241 | + assert response.data["results"][0]["title"] == "Backend Development" |
| 242 | + |
| 243 | + def test_events_search_no_results(self, api_client): |
| 244 | + """ Test search with no matching results """ |
| 245 | + self._create_event_with_video(title="Python Conference") |
| 246 | + self._create_event_with_video(title="Machine Learning Summit") |
| 247 | + |
| 248 | + response = api_client.get(reverse("events-list"), {'search': 'NonExistentTerm'}) |
| 249 | + |
| 250 | + assert response.status_code == status.HTTP_200_OK |
| 251 | + assert len(response.data["results"]) == 0 |
| 252 | + |
| 253 | + def test_events_search_ordering_by_event_time(self, api_client): |
| 254 | + """ Test that search results are ordered by event_time (newest first) """ |
| 255 | + # pylint: disable=unused-variable |
| 256 | + old_event = self._create_event_with_video( |
| 257 | + title="Python Old Event", |
| 258 | + event_time=datetime(2024, 1, 1, tzinfo=timezone.utc) |
| 259 | + ) |
| 260 | + new_event = self._create_event_with_video( |
| 261 | + title="Python New Event", |
| 262 | + event_time=datetime(2024, 12, 1, tzinfo=timezone.utc) |
| 263 | + ) |
| 264 | + middle_event = self._create_event_with_video( |
| 265 | + title="Python Middle Event", |
| 266 | + event_time=datetime(2024, 6, 1, tzinfo=timezone.utc) |
| 267 | + ) |
| 268 | + |
| 269 | + response = api_client.get(reverse("events-list"), {'search': 'Python'}) |
| 270 | + |
| 271 | + assert response.status_code == status.HTTP_200_OK |
| 272 | + assert len(response.data["results"]) == 3 |
| 273 | + |
| 274 | + assert response.data["results"][0]["title"] == "Python New Event" |
| 275 | + assert response.data["results"][1]["title"] == "Python Middle Event" |
| 276 | + assert response.data["results"][2]["title"] == "Python Old Event" |
| 277 | + |
| 278 | + def test_events_search_multiple_criteria_match(self, api_client): |
| 279 | + """ Test event matching multiple search criteria """ |
| 280 | + python_tag = TagFactory(name="Python") |
| 281 | + demo_playlist = PlaylistFactory(name="Demo Hour") |
| 282 | + |
| 283 | + event = self._create_event_with_video( |
| 284 | + title="Python Programming Demo", |
| 285 | + description="Advanced Python techniques" |
| 286 | + ) |
| 287 | + event.tags.add(python_tag) |
| 288 | + event.playlists.add(demo_playlist) |
| 289 | + |
| 290 | + response = api_client.get(reverse("events-list"), {'search': 'Python'}) |
| 291 | + |
| 292 | + assert response.status_code == status.HTTP_200_OK |
| 293 | + assert len(response.data["results"]) == 1 |
| 294 | + assert response.data["results"][0]["title"] == "Python Programming Demo" |
0 commit comments