summaryrefslogtreecommitdiff
path: root/repoze/bfg/tests
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2010-04-25 00:02:12 +0000
committerChris McDonough <chrism@agendaless.com>2010-04-25 00:02:12 +0000
commit7534bae0c5eeb34a0146e76a81a9312797f6ba5c (patch)
tree15d3fd388eb3c5538c50da20c3691a9f39ca6de3 /repoze/bfg/tests
parent51981a128c7ed05e51938a3f358c0970dcc33a6f (diff)
downloadpyramid-7534bae0c5eeb34a0146e76a81a9312797f6ba5c.tar.gz
pyramid-7534bae0c5eeb34a0146e76a81a9312797f6ba5c.tar.bz2
pyramid-7534bae0c5eeb34a0146e76a81a9312797f6ba5c.zip
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.
Diffstat (limited to 'repoze/bfg/tests')
-rw-r--r--repoze/bfg/tests/fixtures/__init__.py1
-rw-r--r--repoze/bfg/tests/fixtures/locale/GARBAGE1
-rw-r--r--repoze/bfg/tests/fixtures/locale/be/LC_MESSAGES1
-rw-r--r--repoze/bfg/tests/fixtures/locale/de/LC_MESSAGES/deformsite.mobin0 -> 543 bytes
-rw-r--r--repoze/bfg/tests/fixtures/locale/de/LC_MESSAGES/deformsite.po31
-rw-r--r--repoze/bfg/tests/fixtures/locale/en/LC_MESSAGES/deformsite.mobin0 -> 543 bytes
-rw-r--r--repoze/bfg/tests/fixtures/locale/en/LC_MESSAGES/deformsite.po31
-rw-r--r--repoze/bfg/tests/test_chameleon_text.py20
-rw-r--r--repoze/bfg/tests/test_chameleon_zpt.py20
-rw-r--r--repoze/bfg/tests/test_configuration.py57
-rw-r--r--repoze/bfg/tests/test_i18n.py382
-rw-r--r--repoze/bfg/tests/test_zcml.py50
12 files changed, 594 insertions, 0 deletions
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
--- /dev/null
+++ b/repoze/bfg/tests/fixtures/locale/de/LC_MESSAGES/deformsite.mo
Binary files 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
+"Language-Team: de <LL@li.org>\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
--- /dev/null
+++ b/repoze/bfg/tests/fixtures/locale/en/LC_MESSAGES/deformsite.mo
Binary files 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
+"Language-Team: de <LL@li.org>\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, '<Translations: "None">')
+
+ 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()