diff options
author | ttt | 2017-05-13 00:29:47 +0530 |
---|---|---|
committer | ttt | 2017-05-13 00:29:47 +0530 |
commit | abf599be33b383a6a5baf9493093b2126a622ac8 (patch) | |
tree | 4c5ab6e0d935d5e65fabcf0258e4a00dd20a5afa /lib/python2.7/site-packages/django/contrib/messages/tests | |
download | SBHS-2018-Rpi-abf599be33b383a6a5baf9493093b2126a622ac8.tar.gz SBHS-2018-Rpi-abf599be33b383a6a5baf9493093b2126a622ac8.tar.bz2 SBHS-2018-Rpi-abf599be33b383a6a5baf9493093b2126a622ac8.zip |
added all server files
Diffstat (limited to 'lib/python2.7/site-packages/django/contrib/messages/tests')
8 files changed, 856 insertions, 0 deletions
diff --git a/lib/python2.7/site-packages/django/contrib/messages/tests/__init__.py b/lib/python2.7/site-packages/django/contrib/messages/tests/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/lib/python2.7/site-packages/django/contrib/messages/tests/__init__.py diff --git a/lib/python2.7/site-packages/django/contrib/messages/tests/base.py b/lib/python2.7/site-packages/django/contrib/messages/tests/base.py new file mode 100644 index 0000000..f8a089c --- /dev/null +++ b/lib/python2.7/site-packages/django/contrib/messages/tests/base.py @@ -0,0 +1,368 @@ +from django import http +from django.conf import settings, global_settings +from django.contrib.messages import constants, utils, get_level, set_level +from django.contrib.messages.api import MessageFailure +from django.contrib.messages.storage import default_storage, base +from django.contrib.messages.storage.base import Message +from django.core.urlresolvers import reverse +from django.test.utils import override_settings +from django.utils.translation import ugettext_lazy +from django.utils.unittest import skipIf + + +def skipUnlessAuthIsInstalled(func): + return skipIf( + 'django.contrib.auth' not in settings.INSTALLED_APPS, + "django.contrib.auth isn't installed")(func) + + +def add_level_messages(storage): + """ + Adds 6 messages from different levels (including a custom one) to a storage + instance. + """ + storage.add(constants.INFO, 'A generic info message') + storage.add(29, 'Some custom level') + storage.add(constants.DEBUG, 'A debugging message', extra_tags='extra-tag') + storage.add(constants.WARNING, 'A warning') + storage.add(constants.ERROR, 'An error') + storage.add(constants.SUCCESS, 'This was a triumph.') + + +class override_settings_tags(override_settings): + def enable(self): + super(override_settings_tags, self).enable() + # LEVEL_TAGS is a constant defined in the + # django.contrib.messages.storage.base module, so after changing + # settings.MESSAGE_TAGS, we need to update that constant too. + self.old_level_tags = base.LEVEL_TAGS + base.LEVEL_TAGS = utils.get_level_tags() + def disable(self): + super(override_settings_tags, self).disable() + base.LEVEL_TAGS = self.old_level_tags + + +class BaseTests(object): + storage_class = default_storage + urls = 'django.contrib.messages.tests.urls' + levels = { + 'debug': constants.DEBUG, + 'info': constants.INFO, + 'success': constants.SUCCESS, + 'warning': constants.WARNING, + 'error': constants.ERROR, + } + + def setUp(self): + self.settings_override = override_settings_tags( + TEMPLATE_DIRS = (), + TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS, + MESSAGE_TAGS = '', + MESSAGE_STORAGE = '%s.%s' % (self.storage_class.__module__, + self.storage_class.__name__), + SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer', + ) + self.settings_override.enable() + + def tearDown(self): + self.settings_override.disable() + + def get_request(self): + return http.HttpRequest() + + def get_response(self): + return http.HttpResponse() + + def get_storage(self, data=None): + """ + Returns the storage backend, setting its loaded data to the ``data`` + argument. + + This method avoids the storage ``_get`` method from getting called so + that other parts of the storage backend can be tested independent of + the message retrieval logic. + """ + storage = self.storage_class(self.get_request()) + storage._loaded_data = data or [] + return storage + + def test_add(self): + storage = self.get_storage() + self.assertFalse(storage.added_new) + storage.add(constants.INFO, 'Test message 1') + self.assertTrue(storage.added_new) + storage.add(constants.INFO, 'Test message 2', extra_tags='tag') + self.assertEqual(len(storage), 2) + + def test_add_lazy_translation(self): + storage = self.get_storage() + response = self.get_response() + + storage.add(constants.INFO, ugettext_lazy('lazy message')) + storage.update(response) + + storing = self.stored_messages_count(storage, response) + self.assertEqual(storing, 1) + + def test_no_update(self): + storage = self.get_storage() + response = self.get_response() + storage.update(response) + storing = self.stored_messages_count(storage, response) + self.assertEqual(storing, 0) + + def test_add_update(self): + storage = self.get_storage() + response = self.get_response() + + storage.add(constants.INFO, 'Test message 1') + storage.add(constants.INFO, 'Test message 1', extra_tags='tag') + storage.update(response) + + storing = self.stored_messages_count(storage, response) + self.assertEqual(storing, 2) + + def test_existing_add_read_update(self): + storage = self.get_existing_storage() + response = self.get_response() + + storage.add(constants.INFO, 'Test message 3') + list(storage) # Simulates a read + storage.update(response) + + storing = self.stored_messages_count(storage, response) + self.assertEqual(storing, 0) + + def test_existing_read_add_update(self): + storage = self.get_existing_storage() + response = self.get_response() + + list(storage) # Simulates a read + storage.add(constants.INFO, 'Test message 3') + storage.update(response) + + storing = self.stored_messages_count(storage, response) + self.assertEqual(storing, 1) + + @override_settings(MESSAGE_LEVEL=constants.DEBUG) + def test_full_request_response_cycle(self): + """ + With the message middleware enabled, tests that messages are properly + stored and then retrieved across the full request/redirect/response + cycle. + """ + data = { + 'messages': ['Test message %d' % x for x in range(5)], + } + show_url = reverse('django.contrib.messages.tests.urls.show') + for level in ('debug', 'info', 'success', 'warning', 'error'): + add_url = reverse('django.contrib.messages.tests.urls.add', + args=(level,)) + response = self.client.post(add_url, data, follow=True) + self.assertRedirects(response, show_url) + self.assertTrue('messages' in response.context) + messages = [Message(self.levels[level], msg) for msg in + data['messages']] + self.assertEqual(list(response.context['messages']), messages) + for msg in data['messages']: + self.assertContains(response, msg) + + @override_settings(MESSAGE_LEVEL=constants.DEBUG) + def test_with_template_response(self): + data = { + 'messages': ['Test message %d' % x for x in range(5)], + } + show_url = reverse('django.contrib.messages.tests.urls.show_template_response') + for level in self.levels.keys(): + add_url = reverse('django.contrib.messages.tests.urls.add_template_response', + args=(level,)) + response = self.client.post(add_url, data, follow=True) + self.assertRedirects(response, show_url) + self.assertTrue('messages' in response.context) + for msg in data['messages']: + self.assertContains(response, msg) + + # there shouldn't be any messages on second GET request + response = self.client.get(show_url) + for msg in data['messages']: + self.assertNotContains(response, msg) + + @override_settings(MESSAGE_LEVEL=constants.DEBUG) + def test_multiple_posts(self): + """ + Tests that messages persist properly when multiple POSTs are made + before a GET. + """ + data = { + 'messages': ['Test message %d' % x for x in range(5)], + } + show_url = reverse('django.contrib.messages.tests.urls.show') + messages = [] + for level in ('debug', 'info', 'success', 'warning', 'error'): + messages.extend([Message(self.levels[level], msg) for msg in + data['messages']]) + add_url = reverse('django.contrib.messages.tests.urls.add', + args=(level,)) + self.client.post(add_url, data) + response = self.client.get(show_url) + self.assertTrue('messages' in response.context) + self.assertEqual(list(response.context['messages']), messages) + for msg in data['messages']: + self.assertContains(response, msg) + + @override_settings( + INSTALLED_APPS=filter( + lambda app:app!='django.contrib.messages', settings.INSTALLED_APPS), + MIDDLEWARE_CLASSES=filter( + lambda m:'MessageMiddleware' not in m, settings.MIDDLEWARE_CLASSES), + TEMPLATE_CONTEXT_PROCESSORS=filter( + lambda p:'context_processors.messages' not in p, + settings.TEMPLATE_CONTEXT_PROCESSORS), + MESSAGE_LEVEL=constants.DEBUG + ) + def test_middleware_disabled(self): + """ + Tests that, when the middleware is disabled, an exception is raised + when one attempts to store a message. + """ + data = { + 'messages': ['Test message %d' % x for x in range(5)], + } + show_url = reverse('django.contrib.messages.tests.urls.show') + for level in ('debug', 'info', 'success', 'warning', 'error'): + add_url = reverse('django.contrib.messages.tests.urls.add', + args=(level,)) + self.assertRaises(MessageFailure, self.client.post, add_url, + data, follow=True) + + @override_settings( + INSTALLED_APPS=filter( + lambda app:app!='django.contrib.messages', settings.INSTALLED_APPS), + MIDDLEWARE_CLASSES=filter( + lambda m:'MessageMiddleware' not in m, settings.MIDDLEWARE_CLASSES), + TEMPLATE_CONTEXT_PROCESSORS=filter( + lambda p:'context_processors.messages' not in p, + settings.TEMPLATE_CONTEXT_PROCESSORS), + MESSAGE_LEVEL=constants.DEBUG + ) + def test_middleware_disabled_fail_silently(self): + """ + Tests that, when the middleware is disabled, an exception is not + raised if 'fail_silently' = True + """ + data = { + 'messages': ['Test message %d' % x for x in range(5)], + 'fail_silently': True, + } + show_url = reverse('django.contrib.messages.tests.urls.show') + for level in ('debug', 'info', 'success', 'warning', 'error'): + add_url = reverse('django.contrib.messages.tests.urls.add', + args=(level,)) + response = self.client.post(add_url, data, follow=True) + self.assertRedirects(response, show_url) + self.assertFalse('messages' in response.context) + + def stored_messages_count(self, storage, response): + """ + Returns the number of messages being stored after a + ``storage.update()`` call. + """ + raise NotImplementedError('This method must be set by a subclass.') + + def test_get(self): + raise NotImplementedError('This method must be set by a subclass.') + + def get_existing_storage(self): + return self.get_storage([Message(constants.INFO, 'Test message 1'), + Message(constants.INFO, 'Test message 2', + extra_tags='tag')]) + + def test_existing_read(self): + """ + Tests that reading the existing storage doesn't cause the data to be + lost. + """ + storage = self.get_existing_storage() + self.assertFalse(storage.used) + # After iterating the storage engine directly, the used flag is set. + data = list(storage) + self.assertTrue(storage.used) + # The data does not disappear because it has been iterated. + self.assertEqual(data, list(storage)) + + def test_existing_add(self): + storage = self.get_existing_storage() + self.assertFalse(storage.added_new) + storage.add(constants.INFO, 'Test message 3') + self.assertTrue(storage.added_new) + + def test_default_level(self): + # get_level works even with no storage on the request. + request = self.get_request() + self.assertEqual(get_level(request), constants.INFO) + + # get_level returns the default level if it hasn't been set. + storage = self.get_storage() + request._messages = storage + self.assertEqual(get_level(request), constants.INFO) + + # Only messages of sufficient level get recorded. + add_level_messages(storage) + self.assertEqual(len(storage), 5) + + def test_low_level(self): + request = self.get_request() + storage = self.storage_class(request) + request._messages = storage + + self.assertTrue(set_level(request, 5)) + self.assertEqual(get_level(request), 5) + + add_level_messages(storage) + self.assertEqual(len(storage), 6) + + def test_high_level(self): + request = self.get_request() + storage = self.storage_class(request) + request._messages = storage + + self.assertTrue(set_level(request, 30)) + self.assertEqual(get_level(request), 30) + + add_level_messages(storage) + self.assertEqual(len(storage), 2) + + @override_settings(MESSAGE_LEVEL=29) + def test_settings_level(self): + request = self.get_request() + storage = self.storage_class(request) + + self.assertEqual(get_level(request), 29) + + add_level_messages(storage) + self.assertEqual(len(storage), 3) + + def test_tags(self): + storage = self.get_storage() + storage.level = 0 + add_level_messages(storage) + tags = [msg.tags for msg in storage] + self.assertEqual(tags, + ['info', '', 'extra-tag debug', 'warning', 'error', + 'success']) + + @override_settings_tags(MESSAGE_TAGS={ + constants.INFO: 'info', + constants.DEBUG: '', + constants.WARNING: '', + constants.ERROR: 'bad', + 29: 'custom', + } + ) + def test_custom_tags(self): + storage = self.get_storage() + storage.level = 0 + add_level_messages(storage) + tags = [msg.tags for msg in storage] + self.assertEqual(tags, + ['info', 'custom', 'extra-tag', '', 'bad', 'success']) diff --git a/lib/python2.7/site-packages/django/contrib/messages/tests/test_cookie.py b/lib/python2.7/site-packages/django/contrib/messages/tests/test_cookie.py new file mode 100644 index 0000000..5871ecc --- /dev/null +++ b/lib/python2.7/site-packages/django/contrib/messages/tests/test_cookie.py @@ -0,0 +1,154 @@ +import json + +from django.contrib.messages import constants +from django.contrib.messages.tests.base import BaseTests +from django.contrib.messages.storage.cookie import (CookieStorage, + MessageEncoder, MessageDecoder) +from django.contrib.messages.storage.base import Message +from django.test import TestCase +from django.test.utils import override_settings +from django.utils.safestring import SafeData, mark_safe + + +def set_cookie_data(storage, messages, invalid=False, encode_empty=False): + """ + Sets ``request.COOKIES`` with the encoded data and removes the storage + backend's loaded data cache. + """ + encoded_data = storage._encode(messages, encode_empty=encode_empty) + if invalid: + # Truncate the first character so that the hash is invalid. + encoded_data = encoded_data[1:] + storage.request.COOKIES = {CookieStorage.cookie_name: encoded_data} + if hasattr(storage, '_loaded_data'): + del storage._loaded_data + + +def stored_cookie_messages_count(storage, response): + """ + Returns an integer containing the number of messages stored. + """ + # Get a list of cookies, excluding ones with a max-age of 0 (because + # they have been marked for deletion). + cookie = response.cookies.get(storage.cookie_name) + if not cookie or cookie['max-age'] == 0: + return 0 + data = storage._decode(cookie.value) + if not data: + return 0 + if data[-1] == CookieStorage.not_finished: + data.pop() + return len(data) + + +@override_settings(SESSION_COOKIE_DOMAIN='.example.com') +class CookieTest(BaseTests, TestCase): + storage_class = CookieStorage + + def stored_messages_count(self, storage, response): + return stored_cookie_messages_count(storage, response) + + def test_get(self): + storage = self.storage_class(self.get_request()) + # Set initial data. + example_messages = ['test', 'me'] + set_cookie_data(storage, example_messages) + # Test that the message actually contains what we expect. + self.assertEqual(list(storage), example_messages) + + def test_domain(self): + """ + Ensure that CookieStorage honors SESSION_COOKIE_DOMAIN. + Refs #15618. + """ + # Test before the messages have been consumed + storage = self.get_storage() + response = self.get_response() + storage.add(constants.INFO, 'test') + storage.update(response) + self.assertTrue('test' in response.cookies['messages'].value) + self.assertEqual(response.cookies['messages']['domain'], '.example.com') + self.assertEqual(response.cookies['messages']['expires'], '') + + # Test after the messages have been consumed + storage = self.get_storage() + response = self.get_response() + storage.add(constants.INFO, 'test') + for m in storage: + pass # Iterate through the storage to simulate consumption of messages. + storage.update(response) + self.assertEqual(response.cookies['messages'].value, '') + self.assertEqual(response.cookies['messages']['domain'], '.example.com') + self.assertEqual(response.cookies['messages']['expires'], 'Thu, 01-Jan-1970 00:00:00 GMT') + + def test_get_bad_cookie(self): + request = self.get_request() + storage = self.storage_class(request) + # Set initial (invalid) data. + example_messages = ['test', 'me'] + set_cookie_data(storage, example_messages, invalid=True) + # Test that the message actually contains what we expect. + self.assertEqual(list(storage), []) + + def test_max_cookie_length(self): + """ + Tests that, if the data exceeds what is allowed in a cookie, older + messages are removed before saving (and returned by the ``update`` + method). + """ + storage = self.get_storage() + response = self.get_response() + + # When storing as a cookie, the cookie has constant overhead of approx + # 54 chars, and each message has a constant overhead of about 37 chars + # and a variable overhead of zero in the best case. We aim for a message + # size which will fit 4 messages into the cookie, but not 5. + # See also FallbackTest.test_session_fallback + msg_size = int((CookieStorage.max_cookie_size - 54) / 4.5 - 37) + for i in range(5): + storage.add(constants.INFO, str(i) * msg_size) + unstored_messages = storage.update(response) + + cookie_storing = self.stored_messages_count(storage, response) + self.assertEqual(cookie_storing, 4) + + self.assertEqual(len(unstored_messages), 1) + self.assertTrue(unstored_messages[0].message == '0' * msg_size) + + def test_json_encoder_decoder(self): + """ + Tests that a complex nested data structure containing Message + instances is properly encoded/decoded by the custom JSON + encoder/decoder classes. + """ + messages = [ + { + 'message': Message(constants.INFO, 'Test message'), + 'message_list': [Message(constants.INFO, 'message %s') \ + for x in range(5)] + [{'another-message': \ + Message(constants.ERROR, 'error')}], + }, + Message(constants.INFO, 'message %s'), + ] + encoder = MessageEncoder(separators=(',', ':')) + value = encoder.encode(messages) + decoded_messages = json.loads(value, cls=MessageDecoder) + self.assertEqual(messages, decoded_messages) + + def test_safedata(self): + """ + Tests that a message containing SafeData is keeping its safe status when + retrieved from the message storage. + """ + def encode_decode(data): + message = Message(constants.DEBUG, data) + encoded = storage._encode(message) + decoded = storage._decode(encoded) + return decoded.message + + storage = self.get_storage() + + self.assertIsInstance( + encode_decode(mark_safe("<b>Hello Django!</b>")), SafeData) + self.assertNotIsInstance( + encode_decode("<b>Hello Django!</b>"), SafeData) diff --git a/lib/python2.7/site-packages/django/contrib/messages/tests/test_fallback.py b/lib/python2.7/site-packages/django/contrib/messages/tests/test_fallback.py new file mode 100644 index 0000000..cd0b188 --- /dev/null +++ b/lib/python2.7/site-packages/django/contrib/messages/tests/test_fallback.py @@ -0,0 +1,176 @@ +from django.contrib.messages import constants +from django.contrib.messages.storage.fallback import (FallbackStorage, + CookieStorage) +from django.contrib.messages.tests.base import BaseTests +from django.contrib.messages.tests.test_cookie import (set_cookie_data, + stored_cookie_messages_count) +from django.contrib.messages.tests.test_session import (set_session_data, + stored_session_messages_count) +from django.test import TestCase + + +class FallbackTest(BaseTests, TestCase): + storage_class = FallbackStorage + + def get_request(self): + self.session = {} + request = super(FallbackTest, self).get_request() + request.session = self.session + return request + + def get_cookie_storage(self, storage): + return storage.storages[-2] + + def get_session_storage(self, storage): + return storage.storages[-1] + + def stored_cookie_messages_count(self, storage, response): + return stored_cookie_messages_count(self.get_cookie_storage(storage), + response) + + def stored_session_messages_count(self, storage, response): + return stored_session_messages_count(self.get_session_storage(storage)) + + def stored_messages_count(self, storage, response): + """ + Return the storage totals from both cookie and session backends. + """ + total = (self.stored_cookie_messages_count(storage, response) + + self.stored_session_messages_count(storage, response)) + return total + + def test_get(self): + request = self.get_request() + storage = self.storage_class(request) + cookie_storage = self.get_cookie_storage(storage) + + # Set initial cookie data. + example_messages = [str(i) for i in range(5)] + set_cookie_data(cookie_storage, example_messages) + + # Overwrite the _get method of the fallback storage to prove it is not + # used (it would cause a TypeError: 'NoneType' object is not callable). + self.get_session_storage(storage)._get = None + + # Test that the message actually contains what we expect. + self.assertEqual(list(storage), example_messages) + + def test_get_empty(self): + request = self.get_request() + storage = self.storage_class(request) + + # Overwrite the _get method of the fallback storage to prove it is not + # used (it would cause a TypeError: 'NoneType' object is not callable). + self.get_session_storage(storage)._get = None + + # Test that the message actually contains what we expect. + self.assertEqual(list(storage), []) + + def test_get_fallback(self): + request = self.get_request() + storage = self.storage_class(request) + cookie_storage = self.get_cookie_storage(storage) + session_storage = self.get_session_storage(storage) + + # Set initial cookie and session data. + example_messages = [str(i) for i in range(5)] + set_cookie_data(cookie_storage, example_messages[:4] + + [CookieStorage.not_finished]) + set_session_data(session_storage, example_messages[4:]) + + # Test that the message actually contains what we expect. + self.assertEqual(list(storage), example_messages) + + def test_get_fallback_only(self): + request = self.get_request() + storage = self.storage_class(request) + cookie_storage = self.get_cookie_storage(storage) + session_storage = self.get_session_storage(storage) + + # Set initial cookie and session data. + example_messages = [str(i) for i in range(5)] + set_cookie_data(cookie_storage, [CookieStorage.not_finished], + encode_empty=True) + set_session_data(session_storage, example_messages) + + # Test that the message actually contains what we expect. + self.assertEqual(list(storage), example_messages) + + def test_flush_used_backends(self): + request = self.get_request() + storage = self.storage_class(request) + cookie_storage = self.get_cookie_storage(storage) + session_storage = self.get_session_storage(storage) + + # Set initial cookie and session data. + set_cookie_data(cookie_storage, ['cookie', CookieStorage.not_finished]) + set_session_data(session_storage, ['session']) + + # When updating, previously used but no longer needed backends are + # flushed. + response = self.get_response() + list(storage) + storage.update(response) + session_storing = self.stored_session_messages_count(storage, response) + self.assertEqual(session_storing, 0) + + def test_no_fallback(self): + """ + Confirms that: + + (1) A short number of messages whose data size doesn't exceed what is + allowed in a cookie will all be stored in the CookieBackend. + + (2) If the CookieBackend can store all messages, the SessionBackend + won't be written to at all. + """ + storage = self.get_storage() + response = self.get_response() + + # Overwrite the _store method of the fallback storage to prove it isn't + # used (it would cause a TypeError: 'NoneType' object is not callable). + self.get_session_storage(storage)._store = None + + for i in range(5): + storage.add(constants.INFO, str(i) * 100) + storage.update(response) + + cookie_storing = self.stored_cookie_messages_count(storage, response) + self.assertEqual(cookie_storing, 5) + session_storing = self.stored_session_messages_count(storage, response) + self.assertEqual(session_storing, 0) + + def test_session_fallback(self): + """ + Confirms that, if the data exceeds what is allowed in a cookie, + messages which did not fit are stored in the SessionBackend. + """ + storage = self.get_storage() + response = self.get_response() + + # see comment in CookieText.test_cookie_max_length + msg_size = int((CookieStorage.max_cookie_size - 54) / 4.5 - 37) + for i in range(5): + storage.add(constants.INFO, str(i) * msg_size) + storage.update(response) + + cookie_storing = self.stored_cookie_messages_count(storage, response) + self.assertEqual(cookie_storing, 4) + session_storing = self.stored_session_messages_count(storage, response) + self.assertEqual(session_storing, 1) + + def test_session_fallback_only(self): + """ + Confirms that large messages, none of which fit in a cookie, are stored + in the SessionBackend (and nothing is stored in the CookieBackend). + """ + storage = self.get_storage() + response = self.get_response() + + storage.add(constants.INFO, 'x' * 5000) + storage.update(response) + + cookie_storing = self.stored_cookie_messages_count(storage, response) + self.assertEqual(cookie_storing, 0) + session_storing = self.stored_session_messages_count(storage, response) + self.assertEqual(session_storing, 1) diff --git a/lib/python2.7/site-packages/django/contrib/messages/tests/test_middleware.py b/lib/python2.7/site-packages/django/contrib/messages/tests/test_middleware.py new file mode 100644 index 0000000..5618c2d --- /dev/null +++ b/lib/python2.7/site-packages/django/contrib/messages/tests/test_middleware.py @@ -0,0 +1,18 @@ +from django import http +from django.contrib.messages.middleware import MessageMiddleware +from django.utils import unittest + + +class MiddlewareTest(unittest.TestCase): + + def setUp(self): + self.middleware = MessageMiddleware() + + def test_response_without_messages(self): + """ + Makes sure that the response middleware is tolerant of messages not + existing on request. + """ + request = http.HttpRequest() + response = http.HttpResponse() + self.middleware.process_response(request, response) diff --git a/lib/python2.7/site-packages/django/contrib/messages/tests/test_mixins.py b/lib/python2.7/site-packages/django/contrib/messages/tests/test_mixins.py new file mode 100644 index 0000000..8eef4cb --- /dev/null +++ b/lib/python2.7/site-packages/django/contrib/messages/tests/test_mixins.py @@ -0,0 +1,14 @@ +from django.test.testcases import TestCase +from django.contrib.messages.tests.urls import ContactFormViewWithMsg +from django.core.urlresolvers import reverse + +class SuccessMessageMixinTests(TestCase): + urls = 'django.contrib.messages.tests.urls' + + def test_set_messages_success(self): + author = {'name': 'John Doe', + 'slug': 'success-msg'} + add_url = reverse('add_success_msg') + req = self.client.post(add_url, author) + self.assertIn(ContactFormViewWithMsg.success_message % author, + req.cookies['messages'].value) diff --git a/lib/python2.7/site-packages/django/contrib/messages/tests/test_session.py b/lib/python2.7/site-packages/django/contrib/messages/tests/test_session.py new file mode 100644 index 0000000..940e1c0 --- /dev/null +++ b/lib/python2.7/site-packages/django/contrib/messages/tests/test_session.py @@ -0,0 +1,53 @@ +from django.contrib.messages import constants +from django.contrib.messages.tests.base import BaseTests +from django.contrib.messages.storage.base import Message +from django.contrib.messages.storage.session import SessionStorage +from django.utils.safestring import SafeData, mark_safe +from django.test import TestCase + + +def set_session_data(storage, messages): + """ + Sets the messages into the backend request's session and remove the + backend's loaded data cache. + """ + storage.request.session[storage.session_key] = storage.serialize_messages(messages) + if hasattr(storage, '_loaded_data'): + del storage._loaded_data + + +def stored_session_messages_count(storage): + data = storage.deserialize_messages(storage.request.session.get(storage.session_key, [])) + return len(data) + + +class SessionTest(BaseTests, TestCase): + storage_class = SessionStorage + + def get_request(self): + self.session = {} + request = super(SessionTest, self).get_request() + request.session = self.session + return request + + def stored_messages_count(self, storage, response): + return stored_session_messages_count(storage) + + def test_get(self): + storage = self.storage_class(self.get_request()) + # Set initial data. + example_messages = ['test', 'me'] + set_session_data(storage, example_messages) + # Test that the message actually contains what we expect. + self.assertEqual(list(storage), example_messages) + + def test_safedata(self): + """ + Tests that a message containing SafeData is keeping its safe status when + retrieved from the message storage. + """ + storage = self.get_storage() + + message = Message(constants.DEBUG, mark_safe("<b>Hello Django!</b>")) + set_session_data(storage, [message]) + self.assertIsInstance(list(storage)[0].message, SafeData) diff --git a/lib/python2.7/site-packages/django/contrib/messages/tests/urls.py b/lib/python2.7/site-packages/django/contrib/messages/tests/urls.py new file mode 100644 index 0000000..0541b5a --- /dev/null +++ b/lib/python2.7/site-packages/django/contrib/messages/tests/urls.py @@ -0,0 +1,73 @@ +from django.conf.urls import patterns, url +from django.contrib import messages +from django.core.urlresolvers import reverse +from django import forms +from django.http import HttpResponseRedirect, HttpResponse +from django.template import RequestContext, Template +from django.template.response import TemplateResponse +from django.views.decorators.cache import never_cache +from django.contrib.messages.views import SuccessMessageMixin +from django.views.generic.edit import FormView + +TEMPLATE = """{% if messages %} +<ul class="messages"> + {% for message in messages %} + <li{% if message.tags %} class="{{ message.tags }}"{% endif %}> + {{ message }} + </li> + {% endfor %} +</ul> +{% endif %} +""" + +@never_cache +def add(request, message_type): + # don't default to False here, because we want to test that it defaults + # to False if unspecified + fail_silently = request.POST.get('fail_silently', None) + for msg in request.POST.getlist('messages'): + if fail_silently is not None: + getattr(messages, message_type)(request, msg, + fail_silently=fail_silently) + else: + getattr(messages, message_type)(request, msg) + + show_url = reverse('django.contrib.messages.tests.urls.show') + return HttpResponseRedirect(show_url) + +@never_cache +def add_template_response(request, message_type): + for msg in request.POST.getlist('messages'): + getattr(messages, message_type)(request, msg) + + show_url = reverse('django.contrib.messages.tests.urls.show_template_response') + return HttpResponseRedirect(show_url) + +@never_cache +def show(request): + t = Template(TEMPLATE) + return HttpResponse(t.render(RequestContext(request))) + +@never_cache +def show_template_response(request): + return TemplateResponse(request, Template(TEMPLATE)) + + +class ContactForm(forms.Form): + name = forms.CharField(required=True) + slug = forms.SlugField(required=True) + + +class ContactFormViewWithMsg(SuccessMessageMixin, FormView): + form_class = ContactForm + success_url = show + success_message = "%(name)s was created successfully" + + +urlpatterns = patterns('', + ('^add/(debug|info|success|warning|error)/$', add), + url('^add/msg/$', ContactFormViewWithMsg.as_view(), name='add_success_msg'), + ('^show/$', show), + ('^template_response/add/(debug|info|success|warning|error)/$', add_template_response), + ('^template_response/show/$', show_template_response), +) |