From 7534bae0c5eeb34a0146e76a81a9312797f6ba5c Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Sun, 25 Apr 2010 00:02:12 +0000 Subject: Merge i18n branch via svn merge --ignore-ancestry -r9030:9150 $REPOZE_SVN/repoze.bfg/branches/i18n No foreigners were harmed in the coding of this feature. --- repoze/bfg/tests/fixtures/__init__.py | 1 + repoze/bfg/tests/fixtures/locale/GARBAGE | 1 + repoze/bfg/tests/fixtures/locale/be/LC_MESSAGES | 1 + .../fixtures/locale/de/LC_MESSAGES/deformsite.mo | Bin 0 -> 543 bytes .../fixtures/locale/de/LC_MESSAGES/deformsite.po | 31 ++ .../fixtures/locale/en/LC_MESSAGES/deformsite.mo | Bin 0 -> 543 bytes .../fixtures/locale/en/LC_MESSAGES/deformsite.po | 31 ++ repoze/bfg/tests/test_chameleon_text.py | 20 ++ repoze/bfg/tests/test_chameleon_zpt.py | 20 ++ repoze/bfg/tests/test_configuration.py | 57 +++ repoze/bfg/tests/test_i18n.py | 382 +++++++++++++++++++++ repoze/bfg/tests/test_zcml.py | 50 +++ 12 files changed, 594 insertions(+) create mode 100644 repoze/bfg/tests/fixtures/__init__.py create mode 100644 repoze/bfg/tests/fixtures/locale/GARBAGE create mode 100644 repoze/bfg/tests/fixtures/locale/be/LC_MESSAGES create mode 100644 repoze/bfg/tests/fixtures/locale/de/LC_MESSAGES/deformsite.mo create mode 100644 repoze/bfg/tests/fixtures/locale/de/LC_MESSAGES/deformsite.po create mode 100644 repoze/bfg/tests/fixtures/locale/en/LC_MESSAGES/deformsite.mo create mode 100644 repoze/bfg/tests/fixtures/locale/en/LC_MESSAGES/deformsite.po create mode 100644 repoze/bfg/tests/test_i18n.py (limited to 'repoze/bfg/tests') diff --git a/repoze/bfg/tests/fixtures/__init__.py b/repoze/bfg/tests/fixtures/__init__.py new file mode 100644 index 000000000..1a35cdb4a --- /dev/null +++ b/repoze/bfg/tests/fixtures/__init__.py @@ -0,0 +1 @@ +# a file diff --git a/repoze/bfg/tests/fixtures/locale/GARBAGE b/repoze/bfg/tests/fixtures/locale/GARBAGE new file mode 100644 index 000000000..032c55584 --- /dev/null +++ b/repoze/bfg/tests/fixtures/locale/GARBAGE @@ -0,0 +1 @@ +Garbage file. diff --git a/repoze/bfg/tests/fixtures/locale/be/LC_MESSAGES b/repoze/bfg/tests/fixtures/locale/be/LC_MESSAGES new file mode 100644 index 000000000..909cf6a3b --- /dev/null +++ b/repoze/bfg/tests/fixtures/locale/be/LC_MESSAGES @@ -0,0 +1 @@ +busted. diff --git a/repoze/bfg/tests/fixtures/locale/de/LC_MESSAGES/deformsite.mo b/repoze/bfg/tests/fixtures/locale/de/LC_MESSAGES/deformsite.mo new file mode 100644 index 000000000..2924a5eb5 Binary files /dev/null and b/repoze/bfg/tests/fixtures/locale/de/LC_MESSAGES/deformsite.mo differ diff --git a/repoze/bfg/tests/fixtures/locale/de/LC_MESSAGES/deformsite.po b/repoze/bfg/tests/fixtures/locale/de/LC_MESSAGES/deformsite.po new file mode 100644 index 000000000..17f87bc19 --- /dev/null +++ b/repoze/bfg/tests/fixtures/locale/de/LC_MESSAGES/deformsite.po @@ -0,0 +1,31 @@ +# German translations for deformsite. +# Copyright (C) 2010 ORGANIZATION +# This file is distributed under the same license as the deformsite project. +# FIRST AUTHOR , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: deformsite 0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2010-04-22 14:17+0400\n" +"PO-Revision-Date: 2010-04-22 14:17-0400\n" +"Last-Translator: FULL NAME \n" +"Language-Team: de \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.5\n" + +#: deformsite/__init__.py:458 +msgid "Approve" +msgstr "Genehmigen" + +#: deformsite/__init__.py:459 +msgid "Show approval" +msgstr "Zeigen Genehmigung" + +#: deformsite/__init__.py:466 +msgid "Submit" +msgstr "Beugen" + diff --git a/repoze/bfg/tests/fixtures/locale/en/LC_MESSAGES/deformsite.mo b/repoze/bfg/tests/fixtures/locale/en/LC_MESSAGES/deformsite.mo new file mode 100644 index 000000000..2924a5eb5 Binary files /dev/null and b/repoze/bfg/tests/fixtures/locale/en/LC_MESSAGES/deformsite.mo differ diff --git a/repoze/bfg/tests/fixtures/locale/en/LC_MESSAGES/deformsite.po b/repoze/bfg/tests/fixtures/locale/en/LC_MESSAGES/deformsite.po new file mode 100644 index 000000000..17f87bc19 --- /dev/null +++ b/repoze/bfg/tests/fixtures/locale/en/LC_MESSAGES/deformsite.po @@ -0,0 +1,31 @@ +# German translations for deformsite. +# Copyright (C) 2010 ORGANIZATION +# This file is distributed under the same license as the deformsite project. +# FIRST AUTHOR , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: deformsite 0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2010-04-22 14:17+0400\n" +"PO-Revision-Date: 2010-04-22 14:17-0400\n" +"Last-Translator: FULL NAME \n" +"Language-Team: de \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.5\n" + +#: deformsite/__init__.py:458 +msgid "Approve" +msgstr "Genehmigen" + +#: deformsite/__init__.py:459 +msgid "Show approval" +msgstr "Zeigen Genehmigung" + +#: deformsite/__init__.py:466 +msgid "Submit" +msgstr "Beugen" + diff --git a/repoze/bfg/tests/test_chameleon_text.py b/repoze/bfg/tests/test_chameleon_text.py index 007c102e3..204805adb 100644 --- a/repoze/bfg/tests/test_chameleon_text.py +++ b/repoze/bfg/tests/test_chameleon_text.py @@ -28,6 +28,16 @@ class Base: class TextTemplateRendererTests(Base, unittest.TestCase): + def setUp(self): + from repoze.bfg.configuration import Configurator + from repoze.bfg.registry import Registry + registry = Registry() + self.config = Configurator(registry=registry) + self.config.begin() + + def tearDown(self): + self.config.end() + def _getTargetClass(self): from repoze.bfg.chameleon_text import TextTemplateRenderer return TextTemplateRenderer @@ -54,6 +64,16 @@ class TextTemplateRendererTests(Base, unittest.TestCase): template = instance.template self.assertEqual(template, instance.__dict__['template']) + def test_template_with_ichameleon_translate(self): + from repoze.bfg.interfaces import IChameleonTranslate + def ct(): pass + self.config.registry.registerUtility(ct, IChameleonTranslate) + minimal = self._getTemplatePath('minimal.txt') + instance = self._makeOne(minimal) + self.failIf('template' in instance.__dict__) + template = instance.template + self.assertEqual(template.translate, ct) + def test_call(self): minimal = self._getTemplatePath('minimal.txt') instance = self._makeOne(minimal) diff --git a/repoze/bfg/tests/test_chameleon_zpt.py b/repoze/bfg/tests/test_chameleon_zpt.py index e4bf8f766..cbf9dd10b 100644 --- a/repoze/bfg/tests/test_chameleon_zpt.py +++ b/repoze/bfg/tests/test_chameleon_zpt.py @@ -21,6 +21,16 @@ class Base(object): return reg class ZPTTemplateRendererTests(Base, unittest.TestCase): + def setUp(self): + from repoze.bfg.configuration import Configurator + from repoze.bfg.registry import Registry + registry = Registry() + self.config = Configurator(registry=registry) + self.config.begin() + + def tearDown(self): + self.config.end() + def _getTargetClass(self): from repoze.bfg.chameleon_zpt import ZPTTemplateRenderer return ZPTTemplateRenderer @@ -55,6 +65,16 @@ class ZPTTemplateRendererTests(Base, unittest.TestCase): template = instance.template self.assertEqual(template, instance.__dict__['template']) + def test_template_with_ichameleon_translate(self): + from repoze.bfg.interfaces import IChameleonTranslate + def ct(): pass + self.config.registry.registerUtility(ct, IChameleonTranslate) + minimal = self._getTemplatePath('minimal.pt') + instance = self._makeOne(minimal) + self.failIf('template' in instance.__dict__) + template = instance.template + self.assertEqual(template.translate, ct) + def test_call_with_nondict_value(self): minimal = self._getTemplatePath('minimal.pt') instance = self._makeOne(minimal) diff --git a/repoze/bfg/tests/test_configuration.py b/repoze/bfg/tests/test_configuration.py index 99d564b91..a1e753179 100644 --- a/repoze/bfg/tests/test_configuration.py +++ b/repoze/bfg/tests/test_configuration.py @@ -255,6 +255,15 @@ class ConfiguratorTests(unittest.TestCase): config.setup_registry() self.failUnless(reg.getUtility(IRootFactory)) + def test_setup_registry_locale_negotiator(self): + from repoze.bfg.registry import Registry + from repoze.bfg.interfaces import ILocaleNegotiator + reg = Registry() + config = self._makeOne(reg) + config.setup_registry(locale_negotiator='abc') + utility = reg.getUtility(ILocaleNegotiator) + self.assertEqual(utility, 'abc') + def test_setup_registry_alternate_renderers(self): from repoze.bfg.registry import Registry from repoze.bfg.interfaces import IRendererFactory @@ -1797,6 +1806,54 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual( config.registry.getUtility(IAuthorizationPolicy), policy) + def test_set_locale_negotiator(self): + from repoze.bfg.interfaces import ILocaleNegotiator + config = self._makeOne() + def negotiator(request): pass + config.set_locale_negotiator(negotiator) + self.assertEqual(config.registry.getUtility(ILocaleNegotiator), + negotiator) + + def test_add_translation_dirs_missing_dir(self): + from repoze.bfg.exceptions import ConfigurationError + config = self._makeOne() + self.assertRaises(ConfigurationError, + config.add_translation_dirs, + '/wont/exist/on/my/system') + + def test_add_translation_dirs_resource_spec(self): + import os + from repoze.bfg.interfaces import ITranslationDirectories + config = self._makeOne() + config.add_translation_dirs('repoze.bfg.tests.fixtures:locale') + here = os.path.dirname(__file__) + locale = os.path.join(here, 'fixtures', 'locale') + self.assertEqual(config.registry.getUtility(ITranslationDirectories), + [locale]) + + def test_add_translation_dirs_registers_chameleon_translate(self): + from repoze.bfg.interfaces import IChameleonTranslate + from repoze.bfg.threadlocal import manager + request = DummyRequest() + config = self._makeOne() + manager.push({'request':request, 'registry':config.registry}) + try: + config.add_translation_dirs('repoze.bfg.tests.fixtures:locale') + translate = config.registry.getUtility(IChameleonTranslate) + self.assertEqual(translate('Approve'), u'Approve') + finally: + manager.pop() + + def test_add_translation_dirs_abspath(self): + import os + from repoze.bfg.interfaces import ITranslationDirectories + config = self._makeOne() + here = os.path.dirname(__file__) + locale = os.path.join(here, 'fixtures', 'locale') + config.add_translation_dirs(locale) + self.assertEqual(config.registry.getUtility(ITranslationDirectories), + [locale]) + def test__renderer_from_name_default_renderer(self): from repoze.bfg.interfaces import IRendererFactory config = self._makeOne() diff --git a/repoze/bfg/tests/test_i18n.py b/repoze/bfg/tests/test_i18n.py new file mode 100644 index 000000000..9c4b226e4 --- /dev/null +++ b/repoze/bfg/tests/test_i18n.py @@ -0,0 +1,382 @@ +# -*- coding: utf-8 -*- +# + +import unittest +from repoze.bfg.testing import cleanUp + +class TestTranslationString(unittest.TestCase): + def _makeOne(self, *arg, **kw): + from repoze.bfg.i18n import TranslationString + return TranslationString(*arg, **kw) + + def test_it(self): + # this is part of the API, we don't actually need to test much more + # than that it's importable + ts = self._makeOne('a') + self.assertEqual(ts, 'a') + +class TestTranslationStringFactory(unittest.TestCase): + def _makeOne(self, *arg, **kw): + from repoze.bfg.i18n import TranslationStringFactory + return TranslationStringFactory(*arg, **kw) + + def test_it(self): + # this is part of the API, we don't actually need to test much more + # than that it's importable + factory = self._makeOne('a') + self.assertEqual(factory('').domain, 'a') + +class TestLocalizer(unittest.TestCase): + def _makeOne(self, *arg, **kw): + from repoze.bfg.i18n import Localizer + return Localizer(*arg, **kw) + + def test_ctor(self): + localizer = self._makeOne('en_US', None) + self.assertEqual(localizer.locale_name, 'en_US') + self.assertEqual(localizer.translations, None) + + def test_translate(self): + translations = DummyTranslations() + localizer = self._makeOne(None, translations) + self.assertEqual(localizer.translate('123', domain='1', + mapping={}), '123') + self.failUnless(localizer.translator) + + def test_pluralize(self): + translations = DummyTranslations() + localizer = self._makeOne(None, translations) + self.assertEqual(localizer.pluralize('singular', 'plural', 1, + domain='1', mapping={}), + 'singular') + self.failUnless(localizer.pluralizer) + +class Test_negotiate_locale_name(unittest.TestCase): + def setUp(self): + cleanUp() + + def tearDown(self): + cleanUp() + + def _callFUT(self, request): + from repoze.bfg.i18n import negotiate_locale_name + return negotiate_locale_name(request) + + def _registerImpl(self, impl): + from repoze.bfg.threadlocal import get_current_registry + registry = get_current_registry() + from repoze.bfg.interfaces import ILocaleNegotiator + registry.registerUtility(impl, ILocaleNegotiator) + + def test_no_registry_on_request(self): + self._registerImpl(dummy_negotiator) + request = DummyRequest() + result = self._callFUT(request) + self.assertEqual(result, 'bogus') + + def test_with_registry_on_request(self): + from repoze.bfg.threadlocal import get_current_registry + registry = get_current_registry() + self._registerImpl(dummy_negotiator) + request = DummyRequest() + request.registry = registry + result = self._callFUT(request) + self.assertEqual(result, 'bogus') + + def test_default_from_settings(self): + from repoze.bfg.threadlocal import get_current_registry + registry = get_current_registry() + settings = {'default_locale_name':'settings'} + from repoze.bfg.interfaces import ISettings + registry.registerUtility(settings, ISettings) + request = DummyRequest() + request.registry = registry + result = self._callFUT(request) + self.assertEqual(result, 'settings') + + def test_default_default(self): + request = DummyRequest() + result = self._callFUT(request) + self.assertEqual(result, 'en') + +class Test_get_locale_name(unittest.TestCase): + def setUp(self): + cleanUp() + + def tearDown(self): + cleanUp() + + def _callFUT(self, request): + from repoze.bfg.i18n import get_locale_name + return get_locale_name(request) + + def _registerImpl(self, impl): + from repoze.bfg.threadlocal import get_current_registry + registry = get_current_registry() + from repoze.bfg.interfaces import ILocaleNegotiator + registry.registerUtility(impl, ILocaleNegotiator) + + def test_name_on_request(self): + request = DummyRequest() + request.bfg_locale_name = 'ie' + result = self._callFUT(request) + self.assertEqual(result, 'ie') + + def test_name_not_on_request(self): + self._registerImpl(dummy_negotiator) + request = DummyRequest() + result = self._callFUT(request) + self.assertEqual(result, 'bogus') + self.assertEqual(request.bfg_locale_name, 'bogus') + +class Test_get_localizer(unittest.TestCase): + def setUp(self): + cleanUp() + + def tearDown(self): + cleanUp() + + def _callFUT(self, request): + from repoze.bfg.i18n import get_localizer + return get_localizer(request) + + def test_no_registry_on_request(self): + request = DummyRequest() + request.bfg_localizer = '123' + result = self._callFUT(request) + self.assertEqual(result, '123') + + def test_with_registry_on_request(self): + from repoze.bfg.threadlocal import get_current_registry + registry = get_current_registry() + request = DummyRequest() + request.bfg_localizer = '123' + request.registry = registry + result = self._callFUT(request) + self.assertEqual(result, '123') + + def test_locale_on_request(self): + request = DummyRequest() + request.bfg_localizer = 'abc' + result = self._callFUT(request) + self.assertEqual(result, 'abc') + + def test_locale_from_registry(self): + from repoze.bfg.threadlocal import get_current_registry + from repoze.bfg.interfaces import ILocalizer + registry = get_current_registry() + locale = 'abc' + registry.registerUtility(locale, ILocalizer, name='en') + request = DummyRequest() + request.bfg_locale_name = 'en' + result = self._callFUT(request) + self.assertEqual(result, 'abc') + + def test_locale_from_mo(self): + import os + from repoze.bfg.threadlocal import get_current_registry + from repoze.bfg.interfaces import ITranslationDirectories + from repoze.bfg.i18n import Localizer + registry = get_current_registry() + here = os.path.dirname(__file__) + localedir = os.path.join(here, 'fixtures', 'locale') + localedirs = [localedir] + registry.registerUtility(localedirs, ITranslationDirectories) + request = DummyRequest() + request.bfg_locale_name = 'de' + result = self._callFUT(request) + self.assertEqual(result.__class__, Localizer) + self.assertEqual(result.translate('Approve', 'deformsite'), + 'Genehmigen') + self.assertEqual(result.translate('Approve'), 'Approve') + self.failUnless(hasattr(result, 'pluralize')) + + def test_locale_from_mo_bad_mo(self): + import os + from repoze.bfg.threadlocal import get_current_registry + from repoze.bfg.interfaces import ITranslationDirectories + from repoze.bfg.i18n import Localizer + registry = get_current_registry() + here = os.path.dirname(__file__) + localedir = os.path.join(here, 'fixtures', 'locale') + localedirs = [localedir] + registry.registerUtility(localedirs, ITranslationDirectories) + request = DummyRequest() + request.bfg_locale_name = 'be' + result = self._callFUT(request) + self.assertEqual(result.__class__, Localizer) + self.assertEqual(result.translate('Approve', 'deformsite'), + 'Approve') + +class Test_default_locale_negotiator(unittest.TestCase): + def setUp(self): + cleanUp() + + def tearDown(self): + cleanUp() + + def _callFUT(self, request): + from repoze.bfg.i18n import default_locale_negotiator + return default_locale_negotiator(request) + + def test_from_settings(self): + from repoze.bfg.interfaces import ISettings + from repoze.bfg.threadlocal import get_current_registry + settings = {'default_locale_name':'dude'} + registry = get_current_registry() + registry.registerUtility(settings, ISettings) + request = DummyRequest() + result = self._callFUT(request) + self.assertEqual(result, 'dude') + + def test_settings_empty(self): + request = DummyRequest() + result = self._callFUT(request) + self.assertEqual(result, 'en') + + def test_from_params(self): + request = DummyRequest() + request.params['locale'] = 'foo' + result = self._callFUT(request) + self.assertEqual(result, 'foo') + +class TestTranslations(unittest.TestCase): + def _getTargetClass(self): + from repoze.bfg.i18n import Translations + return Translations + + def _makeOne(self): + messages1 = [ + ('foo', 'Voh'), + (('foo1', 1), 'Voh1'), + ] + messages2 = [ + ('foo', 'VohD'), + (('foo1', 1), 'VohD1'), + ] + + klass = self._getTargetClass() + + translations1 = klass(None, domain='messages') + translations1._catalog = dict(messages1) + translations1.plural = lambda *arg: 1 + translations2 = klass(None, domain='messages1') + translations2._catalog = dict(messages2) + translations2.plural = lambda *arg: 1 + translations = translations1.add(translations2, merge=False) + return translations + + def test_load_domain_None(self): + import gettext + import os + here = os.path.dirname(__file__) + localedir = os.path.join(here, 'fixtures', 'locale') + locales = ['de', 'en'] + klass = self._getTargetClass() + result = klass.load(localedir, locales, domain=None) + self.assertEqual(result.__class__, gettext.NullTranslations) + + def test_load_found_locale_and_domain(self): + import os + here = os.path.dirname(__file__) + localedir = os.path.join(here, 'fixtures', 'locale') + locales = ['de', 'en'] + klass = self._getTargetClass() + result = klass.load(localedir, locales, domain='deformsite') + self.assertEqual(result.__class__, klass) + + def test_load_found_locale_and_domain_locale_is_string(self): + import os + here = os.path.dirname(__file__) + localedir = os.path.join(here, 'fixtures', 'locale') + locales = 'de' + klass = self._getTargetClass() + result = klass.load(localedir, locales, domain='deformsite') + self.assertEqual(result.__class__, klass) + + def test___repr__(self): + inst = self._makeOne() + result = repr(inst) + self.assertEqual(result, '') + + def test_merge_not_gnutranslations(self): + inst = self._makeOne() + self.assertEqual(inst.merge(None), inst) + + def test_merge_gnutranslations(self): + inst = self._makeOne() + inst2 = self._makeOne() + inst2._catalog['a'] = 'b' + inst.merge(inst2) + self.assertEqual(inst._catalog['a'], 'b') + + def test_add_different_domain_merge_true_notexisting(self): + inst = self._makeOne() + inst2 = self._makeOne() + inst2.domain = 'domain2' + inst.add(inst2) + self.assertEqual(inst._domains['domain2'], inst2) + + def test_add_different_domain_merge_true_existing(self): + inst = self._makeOne() + inst2 = self._makeOne() + inst3 = self._makeOne() + inst2.domain = 'domain2' + inst2._catalog['a'] = 'b' + inst3.domain = 'domain2' + inst._domains['domain2'] = inst3 + inst.add(inst2) + self.assertEqual(inst._domains['domain2'], inst3) + self.assertEqual(inst3._catalog['a'], 'b') + + def test_add_same_domain_merge_true(self): + inst = self._makeOne() + inst2 = self._makeOne() + inst2._catalog['a'] = 'b' + inst.add(inst2) + self.assertEqual(inst._catalog['a'], 'b') + + def test_dgettext(self): + t = self._makeOne() + self.assertEqual(t.dgettext('messages', 'foo'), 'Voh') + self.assertEqual(t.dgettext('messages1', 'foo'), 'VohD') + + def test_ldgettext(self): + t = self._makeOne() + self.assertEqual(t.ldgettext('messages', 'foo'), 'Voh') + self.assertEqual(t.ldgettext('messages1', 'foo'), 'VohD') + + def test_dugettext(self): + t = self._makeOne() + self.assertEqual(t.dugettext('messages', 'foo'), 'Voh') + self.assertEqual(t.dugettext('messages1', 'foo'), 'VohD') + + def test_dngettext(self): + t = self._makeOne() + self.assertEqual(t.dngettext('messages', 'foo1', 'foos1', 1), 'Voh1') + self.assertEqual(t.dngettext('messages1', 'foo1', 'foos1', 1), 'VohD1') + + def test_ldngettext(self): + t = self._makeOne() + self.assertEqual(t.ldngettext('messages', 'foo1', 'foos1', 1), 'Voh1') + self.assertEqual(t.ldngettext('messages1', 'foo1', 'foos1', 1), 'VohD1') + + def test_dungettext(self): + t = self._makeOne() + self.assertEqual(t.dungettext('messages', 'foo1', 'foos1', 1), 'Voh1') + self.assertEqual(t.dungettext('messages1', 'foo1', 'foos1', 1), 'VohD1') + + +class DummyRequest(object): + def __init__(self): + self.params = {} + +def dummy_negotiator(request): + return 'bogus' + +class DummyTranslations(object): + def ugettext(self, text): + return text + + def ungettext(self, singular, plural, n): + return singular diff --git a/repoze/bfg/tests/test_zcml.py b/repoze/bfg/tests/test_zcml.py index 7f42e9f09..5fdf25f33 100644 --- a/repoze/bfg/tests/test_zcml.py +++ b/repoze/bfg/tests/test_zcml.py @@ -1041,6 +1041,56 @@ class TestUtilityDirective(unittest.TestCase): self.assertEqual(utility['args'], (component, IFactory, '', None)) self.assertEqual(utility['kw'], {}) +class TestTranslationDirDirective(unittest.TestCase): + def setUp(self): + testing.setUp() + + def tearDown(self): + testing.tearDown() + + def _callFUT(self, *arg, **kw): + from repoze.bfg.zcml import translationdir + return translationdir(*arg, **kw) + + def test_it(self): + from repoze.bfg.configuration import Configurator + context = DummyContext() + tdir = 'repoze.bfg.tests.fixtures:locale' + self._callFUT(context, tdir) + actions = context.actions + self.assertEqual(len(actions), 1) + action = context.actions[0] + self.assertEqual(action['discriminator'], ('tdir', tdir)) + self.assertEqual(action['callable'].im_func, + Configurator.add_translation_dirs.im_func) + self.assertEqual(action['args'], (tdir,)) + action['callable'](*action['args']) # doesn't blow up + +class TestLocaleNegotiatorDirective(unittest.TestCase): + def setUp(self): + testing.setUp() + + def tearDown(self): + testing.tearDown() + + def _callFUT(self, *arg, **kw): + from repoze.bfg.zcml import localenegotiator + return localenegotiator(*arg, **kw) + + def test_it(self): + from repoze.bfg.configuration import Configurator + context = DummyContext() + dummy_negotiator = object() + self._callFUT(context, dummy_negotiator) + actions = context.actions + self.assertEqual(len(actions), 1) + action = context.actions[0] + self.assertEqual(action['discriminator'], 'lnegotiator') + self.assertEqual(action['callable'].im_func, + Configurator.set_locale_negotiator.im_func) + self.assertEqual(action['args'], (dummy_negotiator,)) + action['callable'](*action['args']) # doesn't blow up + class TestLoadZCML(unittest.TestCase): def setUp(self): testing.setUp() -- cgit v1.2.3