A somewhat usable and tested version.
[django-ssify.git] / tests / tests / test_locale.py
1 # -*- coding: utf-8 -*-
2 # This file is part of django-ssify, licensed under GNU Affero GPLv3 or later.
3 # Copyright © Fundacja Nowoczesna Polska. See README.md for more information.
4 #
5 from __future__ import unicode_literals
6
7 from django.conf import settings
8 from django.test import Client, TestCase
9 from django.test.utils import override_settings
10 from django.utils import translation
11 from ssify import exceptions
12 from ssify.middleware import SsiMiddleware
13
14
15 class LocaleTestCase(TestCase):
16     def setUp(self):
17         self.ssi_process_response = SsiMiddleware.process_response
18         SsiMiddleware.process_response = lambda self, req, res: res
19
20     def tearDown(self):
21         SsiMiddleware.process_response = self.ssi_process_response
22
23     def test_locale_middleware(self):
24         index = settings.MIDDLEWARE_CLASSES.index(
25             'ssify.middleware.LocaleMiddleware')
26         stock_middleware = settings.MIDDLEWARE_CLASSES[:index] + \
27             ['django.middleware.locale.LocaleMiddleware'] + \
28             settings.MIDDLEWARE_CLASSES[index + 1:]
29
30         for use_stock_middleware in False, True:
31             for with_lang in False, True:
32                 for with_i18n in False, True:
33                     override = {'USE_I18N': with_i18n}
34
35                     if use_stock_middleware:
36                         override['MIDDLEWARE_CLASSES'] = stock_middleware
37
38                     if use_stock_middleware and with_i18n:
39                         expected_vary =  'Accept-Language, Cookie'
40                     else:
41                         expected_vary =  'Accept-Language'
42
43                     if with_lang:
44                         url = '/include_language_with_lang'
45                     else:
46                         url = '/include_language_without_lang'
47
48                     with self.settings(**override):
49                         # Changed USE_I18N, must reload translation mechanism.
50                         translation._trans.__dict__.clear()
51                         response = Client().get(url)
52                         self.assertEqual(
53                             response['Vary'],
54                             expected_vary,
55                             'Wrong Vary with: use_stock_middleware=%s, '
56                             'with_lang=%s, with_i18n=%s; '
57                             'expected: %s, got: %s' % (
58                                 use_stock_middleware, with_lang, with_i18n,
59                                 expected_vary, response['Vary'])
60                             )
61
62     def test_lang_arg(self):
63         self.assertEqual(
64             self.client.get('/language/uk').content.strip(), b'uk')
65         self.assertEqual(
66             self.client.get('/language').content.strip(), b'pl')
67
68     def test_lang_arg_missing(self):
69         self.assertRaises(
70             exceptions.NoLangFieldError,
71             lambda: self.client.get('/bad_language'))
72
73     def test_locale_middleware_without_session(self):
74         index = settings.MIDDLEWARE_CLASSES.index(
75             'django.contrib.sessions.middleware.SessionMiddleware')
76         middleware = settings.MIDDLEWARE_CLASSES[:index] + \
77             settings.MIDDLEWARE_CLASSES[index + 1:]
78         with self.settings(MIDDLEWARE_CLASSES=middleware):
79             self.assertEqual(
80                 self.client.get('/include_language_with_lang')['Vary'],
81                 'Accept-Language')
82