123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- '''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(out))
|