test_exceptionhandlers.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. from django.core import exceptions as django_exceptions
  2. from django.core.exceptions import PermissionDenied
  3. from django.http import Http404
  4. from django.test import TestCase
  5. from misago.core import exceptionhandler
  6. from misago.core.exceptions import Banned
  7. from misago.users.models import Ban
  8. INVALID_EXCEPTIONS = [
  9. django_exceptions.ObjectDoesNotExist,
  10. django_exceptions.ViewDoesNotExist,
  11. TypeError,
  12. ValueError,
  13. KeyError,
  14. ]
  15. class IsMisagoExceptionTests(TestCase):
  16. def test_is_misago_exception_true_for_handled_exceptions(self):
  17. """exceptionhandler.is_misago_exception recognizes handled exceptions"""
  18. for exception in exceptionhandler.HANDLED_EXCEPTIONS:
  19. self.assertTrue(exceptionhandler.is_misago_exception(exception()))
  20. def test_is_misago_exception_false_for_not_handled_exceptions(self):
  21. """exceptionhandler.is_misago_exception fails to recognize other exceptions"""
  22. for exception in INVALID_EXCEPTIONS:
  23. self.assertFalse(exceptionhandler.is_misago_exception(exception()))
  24. class GetExceptionHandlerTests(TestCase):
  25. def test_exception_handlers_list(self):
  26. """HANDLED_EXCEPTIONS length matches that of EXCEPTION_HANDLERS"""
  27. self.assertEqual(
  28. len(exceptionhandler.HANDLED_EXCEPTIONS),
  29. len(exceptionhandler.EXCEPTION_HANDLERS),
  30. )
  31. def test_get_exception_handler_for_handled_exceptions(self):
  32. """Exception handler has correct handler for every Misago exception"""
  33. for exception in exceptionhandler.HANDLED_EXCEPTIONS:
  34. exceptionhandler.get_exception_handler(exception())
  35. def test_get_exception_handler_for_non_handled_exceptio(self):
  36. """Exception handler has no handler for non-supported exception"""
  37. for exception in INVALID_EXCEPTIONS:
  38. with self.assertRaises(ValueError):
  39. exceptionhandler.get_exception_handler(exception())
  40. class HandleAPIExceptionTests(TestCase):
  41. def test_banned(self):
  42. """banned exception is correctly handled"""
  43. ban = Ban(user_message="This is test ban!")
  44. response = exceptionhandler.handle_api_exception(Banned(ban), None)
  45. self.assertEqual(response.status_code, 403)
  46. self.assertEqual(
  47. response.data["ban"]["message"]["html"], "<p>This is test ban!</p>"
  48. )
  49. def test_permission_denied(self):
  50. """permission denied exception is correctly handled"""
  51. response = exceptionhandler.handle_api_exception(PermissionDenied(), None)
  52. self.assertEqual(response.status_code, 403)
  53. self.assertEqual(response.data["detail"], "Permission denied.")
  54. def test_permission_message_denied(self):
  55. """permission denied with message is correctly handled"""
  56. exception = PermissionDenied("You shall not pass!")
  57. response = exceptionhandler.handle_api_exception(exception, None)
  58. self.assertEqual(response.status_code, 403)
  59. self.assertEqual(response.data["detail"], "You shall not pass!")
  60. def test_unhandled_exception(self):
  61. """our exception handler is not interrupting other exceptions"""
  62. for exception in INVALID_EXCEPTIONS:
  63. response = exceptionhandler.handle_api_exception(exception(), None)
  64. self.assertIsNone(response)
  65. response = exceptionhandler.handle_api_exception(Http404(), None)
  66. self.assertEqual(response.status_code, 404)
  67. self.assertEqual(response.data["detail"], "Not found.")