From 780162409257b8641dec9c0911f8d1014e849af7 Mon Sep 17 00:00:00 2001 From: Willard Nilges Date: Sat, 8 Feb 2025 01:10:39 -0500 Subject: [PATCH 1/4] Add guard for empty row in LinkNYC API --- src/meshapi/tests/test_map_endpoints.py | 18 ++++++++++++++++++ src/meshapi/views/map.py | 3 +++ 2 files changed, 21 insertions(+) diff --git a/src/meshapi/tests/test_map_endpoints.py b/src/meshapi/tests/test_map_endpoints.py index 99ea3f32..0eda5a72 100644 --- a/src/meshapi/tests/test_map_endpoints.py +++ b/src/meshapi/tests/test_map_endpoints.py @@ -4,6 +4,7 @@ import requests_mock from django.test import Client, TestCase +from unittest.mock import MagicMock, patch from meshapi.models import LOS, AccessPoint, Building, Device, Install, Link, Member, Node, Sector from meshapi.serializers import JavascriptDateField, JavascriptDatetimeField, MapDataLinkSerializer @@ -1726,6 +1727,23 @@ def test_kiosk_list_good_state(self, city_api_call_request_mocker): ) self.assertEqual(len(json.loads(response.content.decode("UTF8"))), 7) + @patch("logging.warning") + @requests_mock.Mocker() + def test_kiosk_list_empty_row(self, mock_warning, city_api_call_request_mocker): + # On 02-07-2025, City of New York LinkNYC API changed its data, and Row 19 + # was blank. This tests a guard I added to ensure that doesn't cause us to + # raise Exceptions + city_api_call_request_mocker.get(LINKNYC_KIOSK_DATA_URL, json=[{}]) + + response = self.c.get("/api/v1/mapdata/kiosks/") + self.assertEqual( + 200, + response.status_code, + f"status code incorrect, should be 200, but got {response.status_code}", + ) + mock_warning.assert_called() + self.assertEqual(len(json.loads(response.content.decode("UTF8"))), 0) + @requests_mock.Mocker() def test_kiosk_list_bad_fetch(self, city_api_call_request_mocker): city_api_call_request_mocker.get(LINKNYC_KIOSK_DATA_URL, status_code=500) diff --git a/src/meshapi/views/map.py b/src/meshapi/views/map.py index d6aba6be..3e6c33e0 100644 --- a/src/meshapi/views/map.py +++ b/src/meshapi/views/map.py @@ -452,6 +452,9 @@ def get(self, request: Request) -> Response: kiosks = [] for row in data: + if not row: + logging.warning("Got empty row from City of New York LinkNYC kiosk dataset. Skipping row and moving on.") + continue coordinates = [float(row["longitude"]), float(row["latitude"])] kiosk_status = LINKNYC_KIOSK_STATUS_TRANSLATION.get(row["link_installation_status"]) kiosks.append( From 215ce29d887c2a978d1ca4bfab95bd8208a1a866 Mon Sep 17 00:00:00 2001 From: James Otten Date: Sat, 8 Feb 2025 01:15:42 -0500 Subject: [PATCH 2/4] lint --- src/meshapi/tests/test_map_endpoints.py | 2 +- src/meshapi/views/map.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/meshapi/tests/test_map_endpoints.py b/src/meshapi/tests/test_map_endpoints.py index 0eda5a72..50af72b4 100644 --- a/src/meshapi/tests/test_map_endpoints.py +++ b/src/meshapi/tests/test_map_endpoints.py @@ -1,10 +1,10 @@ import datetime import json import uuid +from unittest.mock import MagicMock, patch import requests_mock from django.test import Client, TestCase -from unittest.mock import MagicMock, patch from meshapi.models import LOS, AccessPoint, Building, Device, Install, Link, Member, Node, Sector from meshapi.serializers import JavascriptDateField, JavascriptDatetimeField, MapDataLinkSerializer diff --git a/src/meshapi/views/map.py b/src/meshapi/views/map.py index 3e6c33e0..13bc8ea8 100644 --- a/src/meshapi/views/map.py +++ b/src/meshapi/views/map.py @@ -453,7 +453,9 @@ def get(self, request: Request) -> Response: kiosks = [] for row in data: if not row: - logging.warning("Got empty row from City of New York LinkNYC kiosk dataset. Skipping row and moving on.") + logging.warning( + "Got empty row from City of New York LinkNYC kiosk dataset. Skipping row and moving on." + ) continue coordinates = [float(row["longitude"]), float(row["latitude"])] kiosk_status = LINKNYC_KIOSK_STATUS_TRANSLATION.get(row["link_installation_status"]) From 02edc3972289b5fe4cfd546c06244d11c0f85263 Mon Sep 17 00:00:00 2001 From: James Otten Date: Sat, 8 Feb 2025 01:18:17 -0500 Subject: [PATCH 3/4] lint --- src/meshapi/tests/test_map_endpoints.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/meshapi/tests/test_map_endpoints.py b/src/meshapi/tests/test_map_endpoints.py index 50af72b4..db576454 100644 --- a/src/meshapi/tests/test_map_endpoints.py +++ b/src/meshapi/tests/test_map_endpoints.py @@ -1,7 +1,6 @@ import datetime import json import uuid -from unittest.mock import MagicMock, patch import requests_mock from django.test import Client, TestCase From 7a1cab33797775ce78039a8ee122bfb8905acb2a Mon Sep 17 00:00:00 2001 From: James Otten Date: Sat, 8 Feb 2025 01:21:20 -0500 Subject: [PATCH 4/4] ahhhhhhh --- src/meshapi/tests/test_map_endpoints.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/meshapi/tests/test_map_endpoints.py b/src/meshapi/tests/test_map_endpoints.py index db576454..9628ca67 100644 --- a/src/meshapi/tests/test_map_endpoints.py +++ b/src/meshapi/tests/test_map_endpoints.py @@ -1,6 +1,7 @@ import datetime import json import uuid +from unittest.mock import patch import requests_mock from django.test import Client, TestCase