From 853cf1299baea6ce45e5f3d436bd3ab687dda652 Mon Sep 17 00:00:00 2001 From: David Slusser Date: Sun, 5 Jul 2026 20:17:37 -0700 Subject: [PATCH 1/2] updating eventbrite ingestion task --- .../tests/unit/web/test_tasks.py | 51 +++++++++++++++++++ src/django_project/web/tasks.py | 17 +++---- 2 files changed, 57 insertions(+), 11 deletions(-) create mode 100644 src/django_project/tests/unit/web/test_tasks.py diff --git a/src/django_project/tests/unit/web/test_tasks.py b/src/django_project/tests/unit/web/test_tasks.py new file mode 100644 index 0000000..eefad99 --- /dev/null +++ b/src/django_project/tests/unit/web/test_tasks.py @@ -0,0 +1,51 @@ +import os +from pathlib import Path +from unittest.mock import patch + +import django +from django.test import TestCase + +BASE_DIR = Path(__file__).parents[4] +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "core.settings") +os.environ.setdefault("ENV_PATH", f"{BASE_DIR}/envs/.env.test") + +django.setup() +from model_bakery import baker +from web.models import Event +from web.tasks import ingest_future_eventbrite_events + + +class TestIngestFutureEventbriteEvents(TestCase): + def setUp(self): + self.platform = baker.make("web.SocialPlatform", name="Eventbrite") + self.group = baker.make("web.TechGroup", name="Test Eventbrite Group", platform=self.platform) + self.link = baker.make( + "web.Link", + name=f"{self.group.name} {self.group.platform.name} page", + url="https://www.eventbrite.com/o/test-eventbrite-group-12345", + ) + self.group.links.add(self.link) + + @patch("web.tasks.get_event_details") + @patch("web.tasks.get_events_for_organization") + def test_ingests_event_without_primary_venue(self, mock_get_events_for_organization, mock_get_event_details): + mock_get_events_for_organization.return_value = [ + { + "id": "evt_123", + "name": {"text": "Venue-less Event"}, + "description": {"text": "Online only."}, + "url": "https://example.com/events/evt_123", + "start": {"utc": "2026-07-10T18:00:00Z"}, + "end": {"utc": "2026-07-10T19:00:00Z"}, + } + ] + mock_get_event_details.return_value = {"tags": [{"display_name": "Python"}]} + + result = ingest_future_eventbrite_events(self.group.pk) + + self.assertEqual(result, f"added 1 new events for {self.group.name}") + event = Event.objects.get(social_platform_id="evt_123") + self.assertEqual(event.location_name, "") + self.assertEqual(event.location_address, "") + self.assertEqual(event.map_link, "") + self.assertEqual(list(event.tags.values_list("value", flat=True)), ["Python"]) diff --git a/src/django_project/web/tasks.py b/src/django_project/web/tasks.py index 801c338..95c37ed 100644 --- a/src/django_project/web/tasks.py +++ b/src/django_project/web/tasks.py @@ -131,8 +131,9 @@ def ingest_future_eventbrite_events(group_pk) -> str: for item in event_list: event_details: dict = get_event_details(item["id"]) if event_details: - location_data: dict = event_details["primary_venue"] - tag_data: list[dict[str, Any]] = event_details["tags"] + location_data: dict[str, Any] = event_details.get("primary_venue") or {} + tag_data: list[dict[str, Any]] = event_details.get("tags") or [] + location_address: str = location_data.get("address", {}).get("localized_address_display", "") event_data: dict[str, Any] = { "group": group, @@ -142,15 +143,9 @@ def ingest_future_eventbrite_events(group_pk) -> str: "social_platform_id": item.get("id", ""), "start_datetime": item["start"].get("utc", "") if item.get("start") else "", "end_datetime": item["end"].get("utc", "") if item.get("end") else "", - "location_name": location_data.get("name", "") if location_data else "", - "location_address": ( - location_data.get("address", {}).get("localized_address_display", "") if location_data else "" - ), - "map_link": ( - create_google_map_link(location_data.get("address", {}).get("localized_address_display", "")) - if location_data - else "" - ), + "location_name": location_data.get("name", ""), + "location_address": location_address, + "map_link": create_google_map_link(location_address) if location_address else "", } event, is_new = Event.objects.update_or_create( From 6250ea833ae31265efe4c3c88c325a729c9f309d Mon Sep 17 00:00:00 2001 From: David Slusser Date: Sun, 5 Jul 2026 20:27:43 -0700 Subject: [PATCH 2/2] updates following PR comments --- .../tests/unit/web/test_tasks.py | 26 +++++++++++++++++++ src/django_project/web/tasks.py | 3 ++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/django_project/tests/unit/web/test_tasks.py b/src/django_project/tests/unit/web/test_tasks.py index eefad99..39d6c5b 100644 --- a/src/django_project/tests/unit/web/test_tasks.py +++ b/src/django_project/tests/unit/web/test_tasks.py @@ -49,3 +49,29 @@ def test_ingests_event_without_primary_venue(self, mock_get_events_for_organizat self.assertEqual(event.location_address, "") self.assertEqual(event.map_link, "") self.assertEqual(list(event.tags.values_list("value", flat=True)), ["Python"]) + + @patch("web.tasks.get_event_details") + @patch("web.tasks.get_events_for_organization") + def test_ingests_event_with_null_primary_venue_address(self, mock_get_events_for_organization, mock_get_event_details): + mock_get_events_for_organization.return_value = [ + { + "id": "evt_456", + "name": {"text": "Null Address Event"}, + "description": {"text": "Venue present, address missing."}, + "url": "https://example.com/events/evt_456", + "start": {"utc": "2026-07-11T18:00:00Z"}, + "end": {"utc": "2026-07-11T19:00:00Z"}, + } + ] + mock_get_event_details.return_value = { + "primary_venue": {"name": "Online", "address": None}, + "tags": [], + } + + result = ingest_future_eventbrite_events(self.group.pk) + + self.assertEqual(result, f"added 1 new events for {self.group.name}") + event = Event.objects.get(social_platform_id="evt_456") + self.assertEqual(event.location_name, "Online") + self.assertEqual(event.location_address, "") + self.assertEqual(event.map_link, "") diff --git a/src/django_project/web/tasks.py b/src/django_project/web/tasks.py index 95c37ed..2fb43d7 100644 --- a/src/django_project/web/tasks.py +++ b/src/django_project/web/tasks.py @@ -133,7 +133,8 @@ def ingest_future_eventbrite_events(group_pk) -> str: if event_details: location_data: dict[str, Any] = event_details.get("primary_venue") or {} tag_data: list[dict[str, Any]] = event_details.get("tags") or [] - location_address: str = location_data.get("address", {}).get("localized_address_display", "") + address_data: dict[str, Any] = location_data.get("address") or {} + location_address: str = address_data.get("localized_address_display", "") event_data: dict[str, Any] = { "group": group,