diff options
Diffstat (limited to 'tests/i18n/patterns/tests.py')
-rw-r--r-- | tests/i18n/patterns/tests.py | 307 |
1 files changed, 307 insertions, 0 deletions
diff --git a/tests/i18n/patterns/tests.py b/tests/i18n/patterns/tests.py new file mode 100644 index 0000000000..3f77136efb --- /dev/null +++ b/tests/i18n/patterns/tests.py @@ -0,0 +1,307 @@ +from __future__ import unicode_literals + +import os + +from django.core.exceptions import ImproperlyConfigured +from django.core.urlresolvers import reverse, clear_url_caches +from django.test import TestCase +from django.test.utils import override_settings +from django.template import Template, Context +from django.utils._os import upath +from django.utils import translation + + +@override_settings( + USE_I18N=True, + LOCALE_PATHS=( + os.path.join(os.path.dirname(upath(__file__)), 'locale'), + ), + TEMPLATE_DIRS=( + os.path.join(os.path.dirname(upath(__file__)), 'templates'), + ), + LANGUAGE_CODE='en-us', + LANGUAGES=( + ('nl', 'Dutch'), + ('en', 'English'), + ('pt-br', 'Brazilian Portuguese'), + ), + MIDDLEWARE_CLASSES=( + 'django.middleware.locale.LocaleMiddleware', + 'django.middleware.common.CommonMiddleware', + ), +) +class URLTestCaseBase(TestCase): + """ + TestCase base-class for the URL tests. + """ + urls = 'regressiontests.i18n.patterns.urls.default' + + def setUp(self): + # Make sure the cache is empty before we are doing our tests. + clear_url_caches() + + def tearDown(self): + # Make sure we will leave an empty cache for other testcases. + clear_url_caches() + + +class URLPrefixTests(URLTestCaseBase): + """ + Tests if the `i18n_patterns` is adding the prefix correctly. + """ + def test_not_prefixed(self): + with translation.override('en'): + self.assertEqual(reverse('not-prefixed'), '/not-prefixed/') + with translation.override('nl'): + self.assertEqual(reverse('not-prefixed'), '/not-prefixed/') + + def test_prefixed(self): + with translation.override('en'): + self.assertEqual(reverse('prefixed'), '/en/prefixed/') + with translation.override('nl'): + self.assertEqual(reverse('prefixed'), '/nl/prefixed/') + + @override_settings(ROOT_URLCONF='regressiontests.i18n.patterns.urls.wrong') + def test_invalid_prefix_use(self): + self.assertRaises(ImproperlyConfigured, lambda: reverse('account:register')) + + +class URLDisabledTests(URLTestCaseBase): + urls = 'regressiontests.i18n.patterns.urls.disabled' + + @override_settings(USE_I18N=False) + def test_prefixed_i18n_disabled(self): + with translation.override('en'): + self.assertEqual(reverse('prefixed'), '/prefixed/') + with translation.override('nl'): + self.assertEqual(reverse('prefixed'), '/prefixed/') + + +class PathUnusedTests(URLTestCaseBase): + """ + Check that if no i18n_patterns is used in root urlconfs, then no + language activation happens based on url prefix. + """ + urls = 'regressiontests.i18n.patterns.urls.path_unused' + + def test_no_lang_activate(self): + response = self.client.get('/nl/foo/') + self.assertEqual(response.status_code, 200) + self.assertEqual(response['content-language'], 'en') + self.assertEqual(response.context['LANGUAGE_CODE'], 'en') + + +class URLTranslationTests(URLTestCaseBase): + """ + Tests if the pattern-strings are translated correctly (within the + `i18n_patterns` and the normal `patterns` function). + """ + def test_no_prefix_translated(self): + with translation.override('en'): + self.assertEqual(reverse('no-prefix-translated'), '/translated/') + self.assertEqual(reverse('no-prefix-translated-slug', kwargs={'slug': 'yeah'}), '/translated/yeah/') + + with translation.override('nl'): + self.assertEqual(reverse('no-prefix-translated'), '/vertaald/') + self.assertEqual(reverse('no-prefix-translated-slug', kwargs={'slug': 'yeah'}), '/vertaald/yeah/') + + with translation.override('pt-br'): + self.assertEqual(reverse('no-prefix-translated'), '/traduzidos/') + self.assertEqual(reverse('no-prefix-translated-slug', kwargs={'slug': 'yeah'}), '/traduzidos/yeah/') + + def test_users_url(self): + with translation.override('en'): + self.assertEqual(reverse('users'), '/en/users/') + + with translation.override('nl'): + self.assertEqual(reverse('users'), '/nl/gebruikers/') + self.assertEqual(reverse('prefixed_xml'), '/nl/prefixed.xml') + + with translation.override('pt-br'): + self.assertEqual(reverse('users'), '/pt-br/usuarios/') + + +class URLNamespaceTests(URLTestCaseBase): + """ + Tests if the translations are still working within namespaces. + """ + def test_account_register(self): + with translation.override('en'): + self.assertEqual(reverse('account:register'), '/en/account/register/') + + with translation.override('nl'): + self.assertEqual(reverse('account:register'), '/nl/profiel/registeren/') + + +class URLRedirectTests(URLTestCaseBase): + """ + Tests if the user gets redirected to the right URL when there is no + language-prefix in the request URL. + """ + def test_no_prefix_response(self): + response = self.client.get('/not-prefixed/') + self.assertEqual(response.status_code, 200) + + def test_en_redirect(self): + response = self.client.get('/account/register/', HTTP_ACCEPT_LANGUAGE='en') + self.assertRedirects(response, '/en/account/register/') + + response = self.client.get(response['location']) + self.assertEqual(response.status_code, 200) + + def test_en_redirect_wrong_url(self): + response = self.client.get('/profiel/registeren/', HTTP_ACCEPT_LANGUAGE='en') + self.assertEqual(response.status_code, 404) + + def test_nl_redirect(self): + response = self.client.get('/profiel/registeren/', HTTP_ACCEPT_LANGUAGE='nl') + self.assertRedirects(response, '/nl/profiel/registeren/') + + response = self.client.get(response['location']) + self.assertEqual(response.status_code, 200) + + def test_nl_redirect_wrong_url(self): + response = self.client.get('/account/register/', HTTP_ACCEPT_LANGUAGE='nl') + self.assertEqual(response.status_code, 404) + + def test_pt_br_redirect(self): + response = self.client.get('/conta/registre-se/', HTTP_ACCEPT_LANGUAGE='pt-br') + self.assertRedirects(response, '/pt-br/conta/registre-se/') + + response = self.client.get(response['location']) + self.assertEqual(response.status_code, 200) + + def test_pl_pl_redirect(self): + # language from outside of the supported LANGUAGES list + response = self.client.get('/account/register/', HTTP_ACCEPT_LANGUAGE='pl-pl') + self.assertRedirects(response, '/en/account/register/') + + response = self.client.get(response['location']) + self.assertEqual(response.status_code, 200) + + +class URLVaryAcceptLanguageTests(URLTestCaseBase): + """ + Tests that 'Accept-Language' is not added to the Vary header when using + prefixed URLs. + """ + def test_no_prefix_response(self): + response = self.client.get('/not-prefixed/') + self.assertEqual(response.status_code, 200) + self.assertEqual(response.get('Vary'), 'Accept-Language') + + def test_en_redirect(self): + response = self.client.get('/account/register/', HTTP_ACCEPT_LANGUAGE='en') + self.assertRedirects(response, '/en/account/register/') + self.assertFalse(response.get('Vary')) + + response = self.client.get(response['location']) + self.assertEqual(response.status_code, 200) + self.assertFalse(response.get('Vary')) + + +class URLRedirectWithoutTrailingSlashTests(URLTestCaseBase): + """ + Tests the redirect when the requested URL doesn't end with a slash + (`settings.APPEND_SLASH=True`). + """ + def test_not_prefixed_redirect(self): + response = self.client.get('/not-prefixed', HTTP_ACCEPT_LANGUAGE='en') + self.assertRedirects(response, '/not-prefixed/', 301) + + def test_en_redirect(self): + response = self.client.get('/account/register', HTTP_ACCEPT_LANGUAGE='en', follow=True) + # target status code of 301 because of CommonMiddleware redirecting + self.assertIn(('http://testserver/en/account/register/', 301), response.redirect_chain) + self.assertRedirects(response, '/en/account/register/', 302) + + response = self.client.get('/prefixed.xml', HTTP_ACCEPT_LANGUAGE='en', follow=True) + self.assertRedirects(response, '/en/prefixed.xml', 302) + + +class URLRedirectWithoutTrailingSlashSettingTests(URLTestCaseBase): + """ + Tests the redirect when the requested URL doesn't end with a slash + (`settings.APPEND_SLASH=False`). + """ + @override_settings(APPEND_SLASH=False) + def test_not_prefixed_redirect(self): + response = self.client.get('/not-prefixed', HTTP_ACCEPT_LANGUAGE='en') + self.assertEqual(response.status_code, 404) + + @override_settings(APPEND_SLASH=False) + def test_en_redirect(self): + response = self.client.get('/account/register-without-slash', HTTP_ACCEPT_LANGUAGE='en') + self.assertRedirects(response, '/en/account/register-without-slash', 302) + + response = self.client.get(response['location']) + self.assertEqual(response.status_code, 200) + + +class URLResponseTests(URLTestCaseBase): + """ + Tests if the response has the right language-code. + """ + def test_not_prefixed_with_prefix(self): + response = self.client.get('/en/not-prefixed/') + self.assertEqual(response.status_code, 404) + + def test_en_url(self): + response = self.client.get('/en/account/register/') + self.assertEqual(response.status_code, 200) + self.assertEqual(response['content-language'], 'en') + self.assertEqual(response.context['LANGUAGE_CODE'], 'en') + + def test_nl_url(self): + response = self.client.get('/nl/profiel/registeren/') + self.assertEqual(response.status_code, 200) + self.assertEqual(response['content-language'], 'nl') + self.assertEqual(response.context['LANGUAGE_CODE'], 'nl') + + def test_wrong_en_prefix(self): + response = self.client.get('/en/profiel/registeren/') + self.assertEqual(response.status_code, 404) + + def test_wrong_nl_prefix(self): + response = self.client.get('/nl/account/register/') + self.assertEqual(response.status_code, 404) + + def test_pt_br_url(self): + response = self.client.get('/pt-br/conta/registre-se/') + self.assertEqual(response.status_code, 200) + self.assertEqual(response['content-language'], 'pt-br') + self.assertEqual(response.context['LANGUAGE_CODE'], 'pt-br') + + +class URLTagTests(URLTestCaseBase): + """ + Test if the language tag works. + """ + def test_strings_only(self): + t = Template("""{% load i18n %} + {% language 'nl' %}{% url 'no-prefix-translated' %}{% endlanguage %} + {% language 'pt-br' %}{% url 'no-prefix-translated' %}{% endlanguage %}""") + self.assertEqual(t.render(Context({})).strip().split(), + ['/vertaald/', '/traduzidos/']) + + def test_context(self): + ctx = Context({'lang1':'nl', 'lang2':'pt-br'}) + tpl = Template("""{% load i18n %} + {% language lang1 %}{% url 'no-prefix-translated' %}{% endlanguage %} + {% language lang2 %}{% url 'no-prefix-translated' %}{% endlanguage %}""") + self.assertEqual(tpl.render(ctx).strip().split(), + ['/vertaald/', '/traduzidos/']) + + def test_args(self): + tpl = Template("""{% load i18n %} + {% language 'nl' %}{% url 'no-prefix-translated-slug' 'apo' %}{% endlanguage %} + {% language 'pt-br' %}{% url 'no-prefix-translated-slug' 'apo' %}{% endlanguage %}""") + self.assertEqual(tpl.render(Context({})).strip().split(), + ['/vertaald/apo/', '/traduzidos/apo/']) + + def test_kwargs(self): + tpl = Template("""{% load i18n %} + {% language 'nl' %}{% url 'no-prefix-translated-slug' slug='apo' %}{% endlanguage %} + {% language 'pt-br' %}{% url 'no-prefix-translated-slug' slug='apo' %}{% endlanguage %}""") + self.assertEqual(tpl.render(Context({})).strip().split(), + ['/vertaald/apo/', '/traduzidos/apo/']) |