<reponame>mohnjahoney/website_source
"""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))

"""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))
Unit tests for the i18n_subsites plugin Test the temporary locale context manager Test that the locale is restored after exiting context Test that the temporary locale is set Test operations on settings dict Prepare default settings Test that we get class given as an object Test that we get correct class given by string Test relative path between sites generation Generate some sample siteurls Remove sites from db Test getting the path within a site Test getting relative paths between sites Test plugin registration Test return on missing required signal Test registration of all signal handlers # clean up Test running Pelican with the Plugin Create temporary output and cache folders Remove output and cache folders 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. # compare output