aboutsummaryrefslogtreecommitdiff
path: root/plugins/i18n_subsites/test_i18n_subsites.py
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/i18n_subsites/test_i18n_subsites.py')
-rw-r--r--plugins/i18n_subsites/test_i18n_subsites.py139
1 files changed, 139 insertions, 0 deletions
diff --git a/plugins/i18n_subsites/test_i18n_subsites.py b/plugins/i18n_subsites/test_i18n_subsites.py
new file mode 100644
index 0000000..83d0cb9
--- /dev/null
+++ b/plugins/i18n_subsites/test_i18n_subsites.py
@@ -0,0 +1,139 @@
+'''Unit tests for the i18n_subsites plugin'''
+
+import os
+import locale
+import unittest
+import subprocess
+from tempfile import mkdtemp
+from shutil import rmtree
+
+from . import i18n_subsites as i18ns
+from pelican import Pelican
+from pelican.tests.support import get_settings
+from pelican.settings import read_settings
+
+
+class TestTemporaryLocale(unittest.TestCase):
+ '''Test the temporary locale context manager'''
+
+ def test_locale_restored(self):
+ '''Test that the locale is restored after exiting context'''
+ orig_locale = locale.setlocale(locale.LC_ALL)
+ with i18ns.temporary_locale():
+ locale.setlocale(locale.LC_ALL, 'C')
+ self.assertEqual(locale.setlocale(locale.LC_ALL), 'C')
+ self.assertEqual(locale.setlocale(locale.LC_ALL), orig_locale)
+
+ def test_temp_locale_set(self):
+ '''Test that the temporary locale is set'''
+ with i18ns.temporary_locale('C'):
+ self.assertEqual(locale.setlocale(locale.LC_ALL), 'C')
+
+
+class TestSettingsManipulation(unittest.TestCase):
+ '''Test operations on settings dict'''
+
+ def setUp(self):
+ '''Prepare default settings'''
+ self.settings = get_settings()
+
+ def test_get_pelican_cls_class(self):
+ '''Test that we get class given as an object'''
+ self.settings['PELICAN_CLASS'] = object
+ cls = i18ns.get_pelican_cls(self.settings)
+ self.assertIs(cls, object)
+
+ def test_get_pelican_cls_str(self):
+ '''Test that we get correct class given by string'''
+ cls = i18ns.get_pelican_cls(self.settings)
+ self.assertIs(cls, Pelican)
+
+
+class TestSitesRelpath(unittest.TestCase):
+ '''Test relative path between sites generation'''
+
+ def setUp(self):
+ '''Generate some sample siteurls'''
+ self.siteurl = 'http://example.com'
+ i18ns._SITE_DB['en'] = self.siteurl
+ i18ns._SITE_DB['de'] = self.siteurl + '/de'
+
+ def tearDown(self):
+ '''Remove sites from db'''
+ i18ns._SITE_DB.clear()
+
+ def test_get_site_path(self):
+ '''Test getting the path within a site'''
+ self.assertEqual(i18ns.get_site_path(self.siteurl), '/')
+ self.assertEqual(i18ns.get_site_path(self.siteurl + '/de'), '/de')
+
+ def test_relpath_to_site(self):
+ '''Test getting relative paths between sites'''
+ self.assertEqual(i18ns.relpath_to_site('en', 'de'), 'de')
+ self.assertEqual(i18ns.relpath_to_site('de', 'en'), '..')
+
+
+class TestRegistration(unittest.TestCase):
+ '''Test plugin registration'''
+
+ def test_return_on_missing_signal(self):
+ '''Test return on missing required signal'''
+ i18ns._SIGNAL_HANDLERS_DB['tmp_sig'] = None
+ i18ns.register()
+ self.assertNotIn(id(i18ns.save_generator),
+ i18ns.signals.generator_init.receivers)
+
+ def test_registration(self):
+ '''Test registration of all signal handlers'''
+ i18ns.register()
+ for sig_name, handler in i18ns._SIGNAL_HANDLERS_DB.items():
+ sig = getattr(i18ns.signals, sig_name)
+ self.assertIn(id(handler), sig.receivers)
+ # clean up
+ sig.disconnect(handler)
+
+
+class TestFullRun(unittest.TestCase):
+ '''Test running Pelican with the Plugin'''
+
+ def setUp(self):
+ '''Create temporary output and cache folders'''
+ self.temp_path = mkdtemp(prefix='pelicantests.')
+ self.temp_cache = mkdtemp(prefix='pelican_cache.')
+
+ def tearDown(self):
+ '''Remove output and cache folders'''
+ rmtree(self.temp_path)
+ rmtree(self.temp_cache)
+
+ def test_sites_generation(self):
+ '''Test generation of sites with the plugin
+
+ Compare with recorded output via ``git diff``.
+ To generate output for comparison run the command
+ ``pelican -o test_data/output -s test_data/pelicanconf.py \
+ test_data/content``
+ Remember to remove the output/ folder before that.
+ '''
+ base_path = os.path.dirname(os.path.abspath(__file__))
+ base_path = os.path.join(base_path, 'test_data')
+ content_path = os.path.join(base_path, 'content')
+ output_path = os.path.join(base_path, 'output')
+ settings_path = os.path.join(base_path, 'pelicanconf.py')
+ settings = read_settings(path=settings_path, override={
+ 'PATH': content_path,
+ 'OUTPUT_PATH': self.temp_path,
+ 'CACHE_PATH': self.temp_cache,
+ 'PLUGINS': [i18ns],
+ }
+ )
+ pelican = Pelican(settings)
+ pelican.run()
+
+ # compare output
+ out, err = subprocess.Popen(
+ ['git', 'diff', '--no-ext-diff', '--exit-code', '-w', output_path,
+ self.temp_path], env={'PAGER': ''},
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
+ self.assertFalse(out, 'non-empty `diff` stdout:\n{}'.format(out))
+ self.assertFalse(err, 'non-empty `diff` stderr:\n{}'.format(err))