from django.contrib import messages from django.test import RequestFactory, SimpleTestCase class DummyStorage: """ dummy message-store to test the api methods """ def __init__(self): self.store = [] def add(self, level, message, extra_tags=""): self.store.append(message) class ApiTests(SimpleTestCase): rf = RequestFactory() def setUp(self): self.request = self.rf.request() self.storage = DummyStorage() def test_ok(self): msg = "some message" self.request._messages = self.storage messages.add_message(self.request, messages.DEBUG, msg) self.assertIn(msg, self.storage.store) def test_request_is_none(self): msg = "add_message() argument must be an HttpRequest object, not 'NoneType'." self.request._messages = self.storage with self.assertRaisesMessage(TypeError, msg): messages.add_message(None, messages.DEBUG, "some message") self.assertEqual(self.storage.store, []) def test_middleware_missing(self): msg = ( "You cannot add messages without installing " "django.contrib.messages.middleware.MessageMiddleware" ) with self.assertRaisesMessage(messages.MessageFailure, msg): messages.add_message(self.request, messages.DEBUG, "some message") self.assertEqual(self.storage.store, []) def test_middleware_missing_silently(self): messages.add_message( self.request, messages.DEBUG, "some message", fail_silently=True ) self.assertEqual(self.storage.store, []) class CustomRequest: def __init__(self, request): self._request = request def __getattribute__(self, attr): try: return super().__getattribute__(attr) except AttributeError: return getattr(self._request, attr) class CustomRequestApiTests(ApiTests): """ add_message() should use ducktyping to allow request wrappers such as the one in Django REST framework. """ def setUp(self): super().setUp() self.request = CustomRequest(self.request)