summaryrefslogtreecommitdiff
path: root/oslo_i18n
diff options
context:
space:
mode:
authorJames Carey <jecarey@us.ibm.com>2015-01-14 17:36:39 +0000
committerJames Carey <jecarey@us.ibm.com>2015-01-28 15:13:46 +0000
commit9a2cde208a46ea9cc46014ec0d276f382a2f9170 (patch)
treeb57c6bcef02b165c826baa27bf4a7cbb8a98c80f /oslo_i18n
parentd9b3ca60a7fc3a61c27d0acc54b8222c7bddf9f5 (diff)
downloadoslo-i18n-9a2cde208a46ea9cc46014ec0d276f382a2f9170.tar.gz
Add test fixture to prefix lazily translated messages1.4.0
This fixture enables testing of lazy translation by faking out translations by providing a translation that is the message id prefixed with the domain and language used in the translation. It supports the definition of new fake languages so that a different language can be specified without having to create the associated message catalogs. For example, this will be used to test that a fake language requested using the Accept-Language header is used to translate the message instead of the default language. That is, that the message was enabled for lazy translation and was not translated until just before it was returned to the user. Change-Id: If6dd28815d11c07ce9430ed07e61bfbc23695707 Partially-Implements: blueprint i18n-enablement-juno
Diffstat (limited to 'oslo_i18n')
-rw-r--r--oslo_i18n/fixture.py76
-rw-r--r--oslo_i18n/tests/test_fixture.py50
2 files changed, 126 insertions, 0 deletions
diff --git a/oslo_i18n/fixture.py b/oslo_i18n/fixture.py
index e62fc8c..6dd2ee0 100644
--- a/oslo_i18n/fixture.py
+++ b/oslo_i18n/fixture.py
@@ -13,6 +13,8 @@
"""
+import gettext
+
import fixtures
import six
@@ -87,3 +89,77 @@ class ToggleLazy(fixtures.Fixture):
def _restore_original(self):
_lazy.enable_lazy(self._original_value)
+
+
+class _PrefixTranslator(gettext.NullTranslations):
+ """Translator that adds prefix to message ids
+
+ NOTE: gettext.NullTranslations is an old style class
+
+ :parm prefix: prefix to add to message id. If not specified (None)
+ then 'noprefix' is used.
+ :type prefix: string
+
+ """
+
+ def __init__(self, fp=None, prefix='noprefix'):
+ gettext.NullTranslations.__init__(self, fp)
+ self.prefix = prefix
+
+ def gettext(self, message):
+ msg = gettext.NullTranslations.gettext(self, message)
+ return self.prefix + msg
+
+ def ugettext(self, message):
+ msg = gettext.NullTranslations.ugettext(self, message)
+ return self.prefix + msg
+
+
+def _prefix_translations(*x, **y):
+ """Use message id prefixed with domain and language as translation
+
+ """
+ return _PrefixTranslator(prefix=x[0] + '/' + y['languages'][0] + ': ')
+
+
+class PrefixLazyTranslation(fixtures.Fixture):
+ """Fixture to prefix lazy translation enabled messages
+
+ Use of this fixture will cause messages supporting lazy translation to
+ be replaced with the message id prefixed with 'domain/language:'.
+ For example, 'oslo/en_US: message about something'. It will also
+ override the available languages returned from
+ oslo_18n.get_available_languages to the specified languages.
+
+ This will enable tests to ensure that messages were translated lazily
+ with the specified language and not immediately with the default language.
+
+ NOTE that this does not work unless lazy translation is enabled, so it
+ uses the ToggleLazy fixture to enable lazy translation.
+
+ :param languages: list of languages to support. If not specified (None)
+ then ['en_US'] is used.
+ :type languages: list of strings
+
+ """
+
+ _DEFAULT_LANG = 'en_US'
+
+ def __init__(self, languages=None):
+ super(PrefixLazyTranslation, self).__init__()
+ self.languages = languages or [PrefixLazyTranslation._DEFAULT_LANG]
+
+ def setUp(self):
+ super(PrefixLazyTranslation, self).setUp()
+ self.useFixture(ToggleLazy(True))
+ self.useFixture(fixtures.MonkeyPatch(
+ 'oslo_i18n._gettextutils.get_available_languages',
+ lambda *x, **y: self.languages))
+ self.useFixture(fixtures.MonkeyPatch(
+ 'oslo.i18n.get_available_languages',
+ lambda *x, **y: self.languages))
+ self.useFixture(fixtures.MonkeyPatch(
+ 'oslo_i18n.get_available_languages',
+ lambda *x, **y: self.languages))
+ self.useFixture(fixtures.MonkeyPatch('gettext.translation',
+ _prefix_translations))
diff --git a/oslo_i18n/tests/test_fixture.py b/oslo_i18n/tests/test_fixture.py
index b5e7f53..7bc29d1 100644
--- a/oslo_i18n/tests/test_fixture.py
+++ b/oslo_i18n/tests/test_fixture.py
@@ -15,8 +15,13 @@
from oslotest import base as test_base
import six
+from oslo import i18n as old_i18n
+import oslo_i18n as new_i18n
+from oslo_i18n import _gettextutils
+from oslo_i18n._i18n import _
from oslo_i18n import _lazy
from oslo_i18n import _message
+from oslo_i18n import _translate
from oslo_i18n import fixture
@@ -72,3 +77,48 @@ class ToggleLazyFixtureText(test_base.BaseTestCase):
self.assertFalse(_lazy.USE_LAZY)
f._restore_original()
self.assertFalse(_lazy.USE_LAZY)
+
+
+_FAKE_LANG = 'en_ZZ'
+
+
+class PrefixLazyTranslationTest(test_base.BaseTestCase):
+
+ def test_default(self):
+
+ # Turn lazy off to check that fixture turns it on
+ self.useFixture(fixture.ToggleLazy(False))
+ self.useFixture(fixture.PrefixLazyTranslation())
+ self.assertTrue(_lazy.USE_LAZY)
+ default_lang = fixture.PrefixLazyTranslation._DEFAULT_LANG
+ raw_id1 = 'fake msg1'
+ expected_msg = 'oslo.i18n/' + default_lang + ': ' + raw_id1
+ msg1 = _(raw_id1) # noqa
+ self.assertEqual([default_lang],
+ _gettextutils.get_available_languages('oslo'))
+ self.assertEqual([default_lang],
+ old_i18n.get_available_languages('oslo'))
+ self.assertEqual([default_lang],
+ new_i18n.get_available_languages('oslo'))
+ self.assertEqual(expected_msg, _translate.translate(msg1))
+
+ def test_extra_lang(self):
+ languages = _gettextutils.get_available_languages('oslo')
+ languages.append(_FAKE_LANG)
+ self.useFixture(fixture.PrefixLazyTranslation(languages=languages))
+ raw_id1 = 'fake msg1'
+ expected_msg_en_US = ('oslo.i18n/' +
+ fixture.PrefixLazyTranslation._DEFAULT_LANG +
+ ': ' + raw_id1)
+ expected_msg_en_ZZ = 'oslo.i18n/' + _FAKE_LANG + ': ' + raw_id1
+ msg1 = _(raw_id1) # noqa
+ self.assertEqual(languages,
+ _gettextutils.get_available_languages('oslo'))
+ self.assertEqual(languages,
+ old_i18n.get_available_languages('oslo'))
+ self.assertEqual(languages,
+ new_i18n.get_available_languages('oslo'))
+ self.assertEqual(expected_msg_en_US, _translate.translate(msg1))
+ self.assertEqual(expected_msg_en_ZZ,
+ _translate.translate(msg1,
+ desired_locale=_FAKE_LANG))