140 lines
4.9 KiB
Python
140 lines
4.9 KiB
Python
|
'''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))
|