From d750b22ed9636fc9fc8c31c7ad101e51153b44af Mon Sep 17 00:00:00 2001 From: Jacob Coffee Date: Wed, 8 Oct 2025 11:47:23 -0500 Subject: [PATCH] fix(sentry#6931306293): resolve 'NoneType' object has no attribute 'engine' for url context reslover --- pydotorg/context_processors.py | 2 +- pydotorg/tests/test_context_processors.py | 22 +++++++++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/pydotorg/context_processors.py b/pydotorg/context_processors.py index 461cbcb31..e7222e65a 100644 --- a/pydotorg/context_processors.py +++ b/pydotorg/context_processors.py @@ -10,7 +10,7 @@ def url_name(request): try: match = resolve(request.path) except Resolver404: - return {} + return {'URL_NAMESPACE': None, 'URL_NAME': None} else: namespace, url_name_ = match.namespace, match.url_name if namespace: diff --git a/pydotorg/tests/test_context_processors.py b/pydotorg/tests/test_context_processors.py index b1c8f3ed4..042e7be7b 100644 --- a/pydotorg/tests/test_context_processors.py +++ b/pydotorg/tests/test_context_processors.py @@ -19,13 +19,13 @@ def test_url_name(self): self.assertEqual({'URL_NAMESPACE': 'events', 'URL_NAME': 'events:calendar_list'}, context_processors.url_name(request)) request = self.factory.get('/getit-404/releases/3.3.3/not-an-actual-thing/') - self.assertEqual({}, context_processors.url_name(request)) + self.assertEqual({'URL_NAMESPACE': None, 'URL_NAME': None}, context_processors.url_name(request)) request = self.factory.get('/getit-404/releases/3.3.3/\r\n/') - self.assertEqual({}, context_processors.url_name(request)) + self.assertEqual({'URL_NAMESPACE': None, 'URL_NAME': None}, context_processors.url_name(request)) request = self.factory.get('/nothing/here/') - self.assertEqual({}, context_processors.url_name(request)) + self.assertEqual({'URL_NAMESPACE': None, 'URL_NAME': None}, context_processors.url_name(request)) def test_blog_url(self): request = self.factory.get('/about/') @@ -114,3 +114,19 @@ def test_user_nav_bar_links_for_anonymous_user(self): request.user = AnonymousUser() self.assertEqual({"USER_NAV_BAR": {}}, context_processors.user_nav_bar_links(request)) + + def test_url_name_always_returns_keys(self): + """Ensure URL_NAME and URL_NAMESPACE are always present in context, even for 404s. + Because it makes sentry unhappy: https://python-software-foundation.sentry.io/issues/6931306293/ + """ + # test with a 404 path + request = self.factory.get('/this-does-not-exist/') + result = context_processors.url_name(request) + + # kyes should always be present + self.assertIn('URL_NAME', result) + self.assertIn('URL_NAMESPACE', result) + + # values should be None for unresolved URLs + self.assertIsNone(result['URL_NAME']) + self.assertIsNone(result['URL_NAMESPACE'])