123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- # -*- coding:utf-8 -*-
- import gettext
- import os
- from os import path
- import unittest
- from django.conf import settings
- from django.core.apps import app_cache
- from django.core.urlresolvers import reverse
- from django.test import LiveServerTestCase, TestCase
- from django.test.utils import override_settings
- from django.utils import six
- from django.utils._os import upath
- from django.utils.translation import override
- from django.utils.text import javascript_quote
- try:
- from selenium.webdriver.firefox import webdriver as firefox
- except ImportError:
- firefox = None
- from ..urls import locale_dir
- class I18NTests(TestCase):
- """ Tests django views in django/views/i18n.py """
- def test_setlang(self):
- """
- The set_language view can be used to change the session language.
- The user is redirected to the 'next' argument if provided.
- """
- for lang_code, lang_name in settings.LANGUAGES:
- post_data = dict(language=lang_code, next='/views/')
- response = self.client.post('/views/i18n/setlang/', data=post_data)
- self.assertRedirects(response, 'http://testserver/views/')
- self.assertEqual(self.client.session['_language'], lang_code)
- def test_setlang_unsafe_next(self):
- """
- The set_language view only redirects to the 'next' argument if it is
- "safe".
- """
- lang_code, lang_name = settings.LANGUAGES[0]
- post_data = dict(language=lang_code, next='//unsafe/redirection/')
- response = self.client.post('/views/i18n/setlang/', data=post_data)
- self.assertEqual(response.url, 'http://testserver/')
- self.assertEqual(self.client.session['_language'], lang_code)
- def test_setlang_reversal(self):
- self.assertEqual(reverse('set_language'), '/views/i18n/setlang/')
- def test_jsi18n(self):
- """The javascript_catalog can be deployed with language settings"""
- for lang_code in ['es', 'fr', 'ru']:
- with override(lang_code):
- catalog = gettext.translation('djangojs', locale_dir, [lang_code])
- if six.PY3:
- trans_txt = catalog.gettext('this is to be translated')
- else:
- trans_txt = catalog.ugettext('this is to be translated')
- response = self.client.get('/views/jsi18n/')
- # response content must include a line like:
- # "this is to be translated": <value of trans_txt Python variable>
- # javascript_quote is used to be able to check unicode strings
- self.assertContains(response, javascript_quote(trans_txt), 1)
- if lang_code == 'fr':
- # Message with context (msgctxt)
- self.assertContains(response, r'"month name\u0004May": "mai"', 1)
- class JsI18NTests(TestCase):
- """
- Tests django views in django/views/i18n.py that need to change
- settings.LANGUAGE_CODE.
- """
- def test_jsi18n_with_missing_en_files(self):
- """
- The javascript_catalog shouldn't load the fallback language in the
- case that the current selected language is actually the one translated
- from, and hence missing translation files completely.
- This happens easily when you're translating from English to other
- languages and you've set settings.LANGUAGE_CODE to some other language
- than English.
- """
- with self.settings(LANGUAGE_CODE='es'), override('en-us'):
- response = self.client.get('/views/jsi18n/')
- self.assertNotContains(response, 'esto tiene que ser traducido')
- def test_jsi18n_fallback_language(self):
- """
- Let's make sure that the fallback language is still working properly
- in cases where the selected language cannot be found.
- """
- with self.settings(LANGUAGE_CODE='fr'), override('fi'):
- response = self.client.get('/views/jsi18n/')
- self.assertContains(response, 'il faut le traduire')
- def testI18NLanguageNonEnglishDefault(self):
- """
- Check if the Javascript i18n view returns an empty language catalog
- if the default language is non-English, the selected language
- is English and there is not 'en' translation available. See #13388,
- #3594 and #13726 for more details.
- """
- with self.settings(LANGUAGE_CODE='fr'), override('en-us'):
- response = self.client.get('/views/jsi18n/')
- self.assertNotContains(response, 'Choisir une heure')
- def test_nonenglish_default_english_userpref(self):
- """
- Same as above with the difference that there IS an 'en' translation
- available. The Javascript i18n view must return a NON empty language catalog
- with the proper English translations. See #13726 for more details.
- """
- with app_cache._with_app('view_tests.app0'):
- with self.settings(LANGUAGE_CODE='fr'), override('en-us'):
- response = self.client.get('/views/jsi18n_english_translation/')
- self.assertContains(response, javascript_quote('this app0 string is to be translated'))
- def testI18NLanguageNonEnglishFallback(self):
- """
- Makes sure that the fallback language is still working properly
- in cases where the selected language cannot be found.
- """
- with self.settings(LANGUAGE_CODE='fr'), override('none'):
- response = self.client.get('/views/jsi18n/')
- self.assertContains(response, 'Choisir une heure')
- class JsI18NTestsMultiPackage(TestCase):
- """
- Tests for django views in django/views/i18n.py that need to change
- settings.LANGUAGE_CODE and merge JS translation from several packages.
- """
- def testI18NLanguageEnglishDefault(self):
- """
- Check if the JavaScript i18n view returns a complete language catalog
- if the default language is en-us, the selected language has a
- translation available and a catalog composed by djangojs domain
- translations of multiple Python packages is requested. See #13388,
- #3594 and #13514 for more details.
- """
- with app_cache._with_app('view_tests.app1'), app_cache._with_app('view_tests.app2'):
- with self.settings(LANGUAGE_CODE='en-us'), override('fr'):
- response = self.client.get('/views/jsi18n_multi_packages1/')
- self.assertContains(response, javascript_quote('il faut traduire cette chaîne de caractères de app1'))
- def testI18NDifferentNonEnLangs(self):
- """
- Similar to above but with neither default or requested language being
- English.
- """
- with app_cache._with_app('view_tests.app3'), app_cache._with_app('view_tests.app4'):
- with self.settings(LANGUAGE_CODE='fr'), override('es-ar'):
- response = self.client.get('/views/jsi18n_multi_packages2/')
- self.assertContains(response, javascript_quote('este texto de app3 debe ser traducido'))
- def testI18NWithLocalePaths(self):
- extended_locale_paths = settings.LOCALE_PATHS + (
- path.join(path.dirname(
- path.dirname(path.abspath(upath(__file__)))), 'app3', 'locale'),)
- with self.settings(LANGUAGE_CODE='es-ar', LOCALE_PATHS=extended_locale_paths):
- with override('es-ar'):
- response = self.client.get('/views/jsi18n/')
- self.assertContains(response,
- javascript_quote('este texto de app3 debe ser traducido'))
- skip_selenium = not os.environ.get('DJANGO_SELENIUM_TESTS', False)
- @unittest.skipIf(skip_selenium, 'Selenium tests not requested')
- @unittest.skipUnless(firefox, 'Selenium not installed')
- class JavascriptI18nTests(LiveServerTestCase):
- available_apps = []
- urls = 'view_tests.urls'
- @classmethod
- def setUpClass(cls):
- cls.selenium = firefox.WebDriver()
- super(JavascriptI18nTests, cls).setUpClass()
- @classmethod
- def tearDownClass(cls):
- cls.selenium.refresh() # see ticket #21227
- cls.selenium.quit()
- super(JavascriptI18nTests, cls).tearDownClass()
- @override_settings(LANGUAGE_CODE='de')
- def test_javascript_gettext(self):
- self.selenium.get('%s%s' % (self.live_server_url, '/jsi18n_template/'))
- elem = self.selenium.find_element_by_id("gettext")
- self.assertEqual(elem.text, "Entfernen")
- elem = self.selenium.find_element_by_id("ngettext_sing")
- self.assertEqual(elem.text, "1 Element")
- elem = self.selenium.find_element_by_id("ngettext_plur")
- self.assertEqual(elem.text, "455 Elemente")
- elem = self.selenium.find_element_by_id("pgettext")
- self.assertEqual(elem.text, "Kann")
- elem = self.selenium.find_element_by_id("npgettext_sing")
- self.assertEqual(elem.text, "1 Resultat")
- elem = self.selenium.find_element_by_id("npgettext_plur")
- self.assertEqual(elem.text, "455 Resultate")
- def test_escaping(self):
- # Force a language via GET otherwise the gettext functions are a noop!
- response = self.client.get('/jsi18n_admin/?language=de')
- self.assertContains(response, '\\x04')
|