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