Просмотр исходного кода

#934: special handle the 404's in api exception handler

Rafał Pitoń 7 лет назад
Родитель
Сommit
3ce2b50039
2 измененных файлов с 18 добавлено и 5 удалено
  1. 5 0
      misago/api/exceptionhandler.py
  2. 13 5
      misago/api/tests/test_exceptionhandler.py

+ 5 - 0
misago/api/exceptionhandler.py

@@ -1,6 +1,7 @@
 from rest_framework.views import exception_handler as rest_exception_handler
 
 from django.core.exceptions import PermissionDenied
+from django.http import Http404
 from django.utils import six
 
 from misago.core.exceptions import Banned
@@ -15,6 +16,10 @@ def handle_api_exception(exception, context):
             response.data = {
                 'detail': six.text_type(exception),
             }
+        elif isinstance(exception, Http404):
+            response.data = {
+                'detail': six.text_type(exception) or "NOT FOUND",
+            }
         return response
     else:
         return None

+ 13 - 5
misago/api/tests/test_exceptionhandler.py

@@ -34,19 +34,27 @@ class HandleAPIExceptionTests(TestCase):
         self.assertEqual(response.status_code, 403)
         self.assertEqual(response.data['detail'], "Permission denied.")
 
-    def test_permission_message_denied(self):
+    def test_permission_denied_message(self):
         """permission denied with message is correctly handled"""
         exception = PermissionDenied("You shall not pass!")
         response = exceptionhandler.handle_api_exception(exception, None)
         self.assertEqual(response.status_code, 403)
         self.assertEqual(response.data['detail'], "You shall not pass!")
 
+    def test_not_found(self):
+        """exception handler sets NOT FOUND as default message for 404"""
+        response = exceptionhandler.handle_api_exception(Http404(), None)
+        self.assertEqual(response.status_code, 404)
+        self.assertEqual(response.data['detail'], "NOT FOUND")
+
+    def test_not_found_message(self):
+        """exception handler sets keeps as custom message for 404"""
+        response = exceptionhandler.handle_api_exception(Http404("Nada!"), None)
+        self.assertEqual(response.status_code, 404)
+        self.assertEqual(response.data['detail'], "Nada!")
+
     def test_unhandled_exception(self):
         """our exception handler is not interrupting other exceptions"""
         for exception in INVALID_EXCEPTIONS:
             response = exceptionhandler.handle_api_exception(exception(), None)
             self.assertIsNone(response)
-
-        response = exceptionhandler.handle_api_exception(Http404(), None)
-        self.assertEqual(response.status_code, 404)
-        self.assertEqual(response.data['detail'], "Not found.")