test_session.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from django.contrib.messages import Message, constants
  2. from django.contrib.messages.storage.session import SessionStorage
  3. from django.core.exceptions import ImproperlyConfigured
  4. from django.http import HttpRequest
  5. from django.test import TestCase
  6. from django.utils.safestring import SafeData, mark_safe
  7. from .base import BaseTests
  8. def set_session_data(storage, messages):
  9. """
  10. Sets the messages into the backend request's session and remove the
  11. backend's loaded data cache.
  12. """
  13. storage.request.session[storage.session_key] = storage.serialize_messages(messages)
  14. if hasattr(storage, "_loaded_data"):
  15. del storage._loaded_data
  16. def stored_session_messages_count(storage):
  17. data = storage.deserialize_messages(
  18. storage.request.session.get(storage.session_key, [])
  19. )
  20. return len(data)
  21. class SessionTests(BaseTests, TestCase):
  22. storage_class = SessionStorage
  23. def get_request(self):
  24. self.session = {}
  25. request = super().get_request()
  26. request.session = self.session
  27. return request
  28. def stored_messages_count(self, storage, response):
  29. return stored_session_messages_count(storage)
  30. def test_no_session(self):
  31. msg = (
  32. "The session-based temporary message storage requires session "
  33. "middleware to be installed, and come before the message "
  34. "middleware in the MIDDLEWARE list."
  35. )
  36. with self.assertRaisesMessage(ImproperlyConfigured, msg):
  37. self.storage_class(HttpRequest())
  38. def test_get(self):
  39. storage = self.storage_class(self.get_request())
  40. example_messages = ["test", "me"]
  41. set_session_data(storage, example_messages)
  42. self.assertEqual(list(storage), example_messages)
  43. def test_safedata(self):
  44. """
  45. A message containing SafeData keeps its safe status when retrieved from
  46. the message storage.
  47. """
  48. storage = self.get_storage()
  49. message = Message(constants.DEBUG, mark_safe("<b>Hello Django!</b>"))
  50. set_session_data(storage, [message])
  51. self.assertIsInstance(list(storage)[0].message, SafeData)