test_api.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. from django.contrib import messages
  2. from django.test import RequestFactory, SimpleTestCase
  3. class DummyStorage:
  4. """
  5. dummy message-store to test the api methods
  6. """
  7. def __init__(self):
  8. self.store = []
  9. def add(self, level, message, extra_tags=''):
  10. self.store.append(message)
  11. class ApiTests(SimpleTestCase):
  12. def setUp(self):
  13. self.rf = RequestFactory()
  14. self.request = self.rf.request()
  15. self.storage = DummyStorage()
  16. def test_ok(self):
  17. msg = 'some message'
  18. self.request._messages = self.storage
  19. messages.add_message(self.request, messages.DEBUG, msg)
  20. self.assertIn(msg, self.storage.store)
  21. def test_request_is_none(self):
  22. msg = "add_message() argument must be an HttpRequest object, not 'NoneType'."
  23. self.request._messages = self.storage
  24. with self.assertRaisesMessage(TypeError, msg):
  25. messages.add_message(None, messages.DEBUG, 'some message')
  26. self.assertEqual(self.storage.store, [])
  27. def test_middleware_missing(self):
  28. msg = 'You cannot add messages without installing django.contrib.messages.middleware.MessageMiddleware'
  29. with self.assertRaisesMessage(messages.MessageFailure, msg):
  30. messages.add_message(self.request, messages.DEBUG, 'some message')
  31. self.assertEqual(self.storage.store, [])
  32. def test_middleware_missing_silently(self):
  33. messages.add_message(self.request, messages.DEBUG, 'some message', fail_silently=True)
  34. self.assertEqual(self.storage.store, [])
  35. class CustomRequest:
  36. def __init__(self, request):
  37. self._request = request
  38. def __getattribute__(self, attr):
  39. try:
  40. return super().__getattribute__(attr)
  41. except AttributeError:
  42. return getattr(self._request, attr)
  43. class CustomRequestApiTests(ApiTests):
  44. """
  45. add_message() should use ducktyping to allow request wrappers such as the
  46. one in Django REST framework.
  47. """
  48. def setUp(self):
  49. super().setUp()
  50. self.request = CustomRequest(self.request)