aboutsummaryrefslogtreecommitdiffstats
path: root/tests/test_integration.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_integration.py')
-rw-r--r--tests/test_integration.py549
1 files changed, 0 insertions, 549 deletions
diff --git a/tests/test_integration.py b/tests/test_integration.py
deleted file mode 100644
index 87a3eba..0000000
--- a/tests/test_integration.py
+++ /dev/null
@@ -1,549 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import unicode_literals, print_function, absolute_import
-
-import os
-import sys
-
-import io
-import locale
-import shutil
-import subprocess
-import tempfile
-import unittest
-
-import lxml.html
-import pytest
-
-from nikola import __main__
-import nikola
-import nikola.plugins.command
-import nikola.plugins.command.init
-import nikola.utils
-
-from .base import BaseTestCase, cd, LocaleSupportInTesting
-
-LocaleSupportInTesting.initialize()
-
-
-class EmptyBuildTest(BaseTestCase):
- """Basic integration testcase."""
-
- dataname = None
-
- @classmethod
- def setUpClass(cls):
- """Setup a demo site."""
- # for tests that need bilingual support override language_settings
- cls.language_settings()
- cls.startdir = os.getcwd()
- cls.tmpdir = tempfile.mkdtemp()
- cls.target_dir = os.path.join(cls.tmpdir, "target")
- cls.init_command = nikola.plugins.command.init.CommandInit()
- cls.fill_site()
- cls.patch_site()
- cls.build()
-
- @classmethod
- def language_settings(cls):
- LocaleSupportInTesting.initialize_locales_for_testing("unilingual")
-
- @classmethod
- def fill_site(self):
- """Add any needed initial content."""
- self.init_command.create_empty_site(self.target_dir)
- self.init_command.create_configuration(self.target_dir)
-
- if self.dataname:
- src = os.path.join(os.path.dirname(__file__), 'data',
- self.dataname)
- for root, dirs, files in os.walk(src):
- for src_name in files:
- rel_dir = os.path.relpath(root, src)
- dst_file = os.path.join(self.target_dir, rel_dir, src_name)
- src_file = os.path.join(root, src_name)
- shutil.copy2(src_file, dst_file)
-
- @classmethod
- def patch_site(self):
- """Make any modifications you need to the site."""
-
- @classmethod
- def build(self):
- """Build the site."""
- with cd(self.target_dir):
- __main__.main(["build"])
-
- @classmethod
- def tearDownClass(self):
- """Remove the demo site."""
- # Don't saw off the branch you're sitting on!
- os.chdir(self.startdir)
- # ignore_errors=True for windows by issue #782
- shutil.rmtree(self.tmpdir, ignore_errors=(sys.platform == 'win32'))
- # Fixes Issue #438
- try:
- del sys.modules['conf']
- except KeyError:
- pass
- # clear LocaleBorg state
- nikola.utils.LocaleBorg.reset()
- if hasattr(self.__class__, "ol"):
- delattr(self.__class__, "ol")
-
- def test_build(self):
- """Ensure the build did something."""
- index_path = os.path.join(
- self.target_dir, "output", "archive.html")
- self.assertTrue(os.path.isfile(index_path))
-
-
-class DemoBuildTest(EmptyBuildTest):
- """Test that a default build of --demo works."""
-
- @classmethod
- def fill_site(self):
- """Fill the site with demo content."""
- self.init_command.copy_sample_site(self.target_dir)
- self.init_command.create_configuration(self.target_dir)
- src1 = os.path.join(os.path.dirname(__file__), 'data', '1-nolinks.rst')
- dst1 = os.path.join(self.target_dir, 'posts', '1.rst')
- shutil.copy(src1, dst1)
- # File for Issue #374 (empty post text)
- with io.open(os.path.join(self.target_dir, 'posts', 'empty.txt'), "w+", encoding="utf8") as outf:
- outf.write(
- ".. title: foobar\n"
- ".. slug: foobar\n"
- ".. date: 2013-03-06 19:08:15\n"
- )
-
- def test_index_in_sitemap(self):
- sitemap_path = os.path.join(self.target_dir, "output", "sitemap.xml")
- sitemap_data = io.open(sitemap_path, "r", encoding="utf8").read()
- self.assertTrue('<loc>https://example.com/index.html</loc>' in sitemap_data)
-
- def test_avoid_double_slash_in_rss(self):
- rss_path = os.path.join(self.target_dir, "output", "rss.xml")
- rss_data = io.open(rss_path, "r", encoding="utf8").read()
- self.assertFalse('https://example.com//' in rss_data)
-
-
-class RepeatedPostsSetting(DemoBuildTest):
- """Duplicate POSTS, should not read each post twice, which causes conflicts."""
- @classmethod
- def patch_site(self):
- """Set the SITE_URL to have a path"""
- conf_path = os.path.join(self.target_dir, "conf.py")
- with io.open(conf_path, "a", encoding="utf8") as outf:
- outf.write('\nPOSTS = (("posts/*.txt", "posts", "post.tmpl"),("posts/*.txt", "posts", "post.tmpl"))\n')
-
-
-class FuturePostTest(EmptyBuildTest):
- """Test a site with future posts."""
-
- @classmethod
- def fill_site(self):
- import datetime
- from nikola.utils import current_time
- self.init_command.copy_sample_site(self.target_dir)
- self.init_command.create_configuration(self.target_dir)
-
- # Change COMMENT_SYSTEM_ID to not wait for 5 seconds
- with io.open(os.path.join(self.target_dir, 'conf.py'), "a+", encoding="utf8") as outf:
- outf.write('\nCOMMENT_SYSTEM_ID = "nikolatest"\n')
-
- with io.open(os.path.join(self.target_dir, 'posts', 'empty1.txt'), "w+", encoding="utf8") as outf:
- outf.write(
- ".. title: foo\n"
- ".. slug: foo\n"
- ".. date: %s\n" % (current_time() + datetime.timedelta(-1)).strftime('%Y-%m-%d %H:%M:%S')
- )
-
- with io.open(os.path.join(self.target_dir, 'posts', 'empty2.txt'), "w+", encoding="utf8") as outf:
- outf.write(
- ".. title: bar\n"
- ".. slug: bar\n"
- ".. date: %s\n" % (current_time() + datetime.timedelta(1)).strftime('%Y-%m-%d %H:%M:%S')
- )
-
- def test_future_post(self):
- """ Ensure that the future post is not present in the index and sitemap."""
- index_path = os.path.join(self.target_dir, "output", "index.html")
- sitemap_path = os.path.join(self.target_dir, "output", "sitemap.xml")
- foo_path = os.path.join(self.target_dir, "output", "posts", "foo.html")
- bar_path = os.path.join(self.target_dir, "output", "posts", "bar.html")
- self.assertTrue(os.path.isfile(index_path))
- self.assertTrue(os.path.isfile(foo_path))
- self.assertTrue(os.path.isfile(bar_path))
- index_data = io.open(index_path, "r", encoding="utf8").read()
- sitemap_data = io.open(sitemap_path, "r", encoding="utf8").read()
- self.assertTrue('foo.html' in index_data)
- self.assertFalse('bar.html' in index_data)
- self.assertTrue('foo.html' in sitemap_data)
- self.assertFalse('bar.html' in sitemap_data)
-
- # Run deploy command to see if future post is deleted
- with cd(self.target_dir):
- __main__.main(["deploy"])
-
- self.assertTrue(os.path.isfile(index_path))
- self.assertTrue(os.path.isfile(foo_path))
- self.assertFalse(os.path.isfile(bar_path))
-
-
-class TranslatedBuildTest(EmptyBuildTest):
- """Test a site with translated content."""
-
- dataname = "translated_titles"
-
- @classmethod
- def language_settings(cls):
- LocaleSupportInTesting.initialize_locales_for_testing("bilingual")
- # the other language
- cls.ol = LocaleSupportInTesting.langlocales["other"][0]
-
- def test_translated_titles(self):
- """Check that translated title is picked up."""
- en_file = os.path.join(self.target_dir, "output", "pages", "1.html")
- pl_file = os.path.join(self.target_dir, "output", self.ol, "pages", "1.html")
- # Files should be created
- self.assertTrue(os.path.isfile(en_file))
- self.assertTrue(os.path.isfile(pl_file))
- # And now let's check the titles
- with io.open(en_file, 'r', encoding='utf8') as inf:
- doc = lxml.html.parse(inf)
- self.assertEqual(doc.find('//title').text, 'Foo | Demo Site')
- with io.open(pl_file, 'r', encoding='utf8') as inf:
- doc = lxml.html.parse(inf)
- self.assertEqual(doc.find('//title').text, 'Bar | Demo Site')
-
-
-class TranslationsPatternTest1(TranslatedBuildTest):
- """Check that the path.lang.ext TRANSLATIONS_PATTERN works too"""
-
- @classmethod
- def patch_site(self):
- """Set the TRANSLATIONS_PATTERN to the old v6 default"""
- os.rename(os.path.join(self.target_dir, "pages", "1.%s.txt" % self.ol),
- os.path.join(self.target_dir, "pages", "1.txt.%s" % self.ol)
- )
- conf_path = os.path.join(self.target_dir, "conf.py")
- with io.open(conf_path, "r", encoding="utf-8") as inf:
- data = inf.read()
- data = data.replace('TRANSLATIONS_PATTERN = "{path}.{lang}.{ext}"',
- 'TRANSLATIONS_PATTERN = "{path}.{ext}.{lang}"')
- with io.open(conf_path, "w+", encoding="utf8") as outf:
- outf.write(data)
-
-
-class MissingDefaultLanguageTest(TranslatedBuildTest):
- """Make sure posts only in secondary languages work."""
-
- @classmethod
- def fill_site(self):
- super(MissingDefaultLanguageTest, self).fill_site()
- os.unlink(os.path.join(self.target_dir, "pages", "1.txt"))
-
- def test_translated_titles(self):
- """Do not test titles as we just removed the translation"""
- pass
-
-
-class TranslationsPatternTest2(TranslatedBuildTest):
- """Check that the path_lang.ext TRANSLATIONS_PATTERN works too"""
-
- @classmethod
- def patch_site(self):
- """Set the TRANSLATIONS_PATTERN to the old v6 default"""
- conf_path = os.path.join(self.target_dir, "conf.py")
- os.rename(os.path.join(self.target_dir, "pages", "1.%s.txt" % self.ol),
- os.path.join(self.target_dir, "pages", "1.txt.%s" % self.ol)
- )
- with io.open(conf_path, "r", encoding="utf-8") as inf:
- data = inf.read()
- data = data.replace('TRANSLATIONS_PATTERN = "{path}.{lang}.{ext}"',
- 'TRANSLATIONS_PATTERN = "{path}.{ext}.{lang}"')
- with io.open(conf_path, "w+", encoding="utf8") as outf:
- outf.write(data)
-
-
-class RelativeLinkTest(DemoBuildTest):
- """Check that SITE_URL with a path doesn't break links."""
-
- @classmethod
- def patch_site(self):
- """Set the SITE_URL to have a path"""
- conf_path = os.path.join(self.target_dir, "conf.py")
- with io.open(conf_path, "r", encoding="utf-8") as inf:
- data = inf.read()
- data = data.replace('SITE_URL = "https://example.com/"',
- 'SITE_URL = "https://example.com/foo/bar/"')
- with io.open(conf_path, "w+", encoding="utf8") as outf:
- outf.write(data)
-
- def test_relative_links(self):
- """Check that the links in output/index.html are correct"""
- test_path = os.path.join(self.target_dir, "output", "index.html")
- flag = False
- with open(test_path, "rb") as inf:
- data = inf.read()
- for _, _, url, _ in lxml.html.iterlinks(data):
- # Just need to be sure this one is ok
- if url.endswith("css"):
- self.assertFalse(url.startswith(".."))
- flag = True
- # But I also need to be sure it is there!
- self.assertTrue(flag)
-
- def test_index_in_sitemap(self):
- """Test that the correct path is in sitemap, and not the wrong one."""
- sitemap_path = os.path.join(self.target_dir, "output", "sitemap.xml")
- sitemap_data = io.open(sitemap_path, "r", encoding="utf8").read()
- self.assertFalse('<loc>https://example.com/</loc>' in sitemap_data)
- self.assertTrue('<loc>https://example.com/foo/bar/index.html</loc>' in sitemap_data)
-
-
-class TestCheck(DemoBuildTest):
- """The demo build should pass 'nikola check'"""
-
- def test_check_links(self):
- with cd(self.target_dir):
- self.assertIsNone(__main__.main(['check', '-l']))
-
- def test_check_files(self):
- with cd(self.target_dir):
- self.assertIsNone(__main__.main(['check', '-f']))
-
-
-class TestCheckAbsoluteSubFolder(TestCheck):
- """Validate links in a site which is:
-
- * built in URL_TYPE="absolute"
- * deployable to a subfolder (BASE_URL="https://example.com/foo/")
- """
-
- @classmethod
- def patch_site(self):
- conf_path = os.path.join(self.target_dir, "conf.py")
- with io.open(conf_path, "r", encoding="utf-8") as inf:
- data = inf.read()
- data = data.replace('SITE_URL = "https://example.com/"',
- 'SITE_URL = "https://example.com/foo/"')
- data = data.replace("# URL_TYPE = 'rel_path'",
- "URL_TYPE = 'absolute'")
- with io.open(conf_path, "w+", encoding="utf8") as outf:
- outf.write(data)
- outf.flush()
-
- def test_index_in_sitemap(self):
- """Test that the correct path is in sitemap, and not the wrong one."""
- sitemap_path = os.path.join(self.target_dir, "output", "sitemap.xml")
- sitemap_data = io.open(sitemap_path, "r", encoding="utf8").read()
- self.assertTrue('<loc>https://example.com/foo/index.html</loc>' in sitemap_data)
-
-
-class TestCheckFullPathSubFolder(TestCheckAbsoluteSubFolder):
- """Validate links in a site which is:
-
- * built in URL_TYPE="full_path"
- * deployable to a subfolder (BASE_URL="https://example.com/foo/")
- """
-
- @classmethod
- def patch_site(self):
- conf_path = os.path.join(self.target_dir, "conf.py")
- with io.open(conf_path, "r", encoding="utf-8") as inf:
- data = inf.read()
- data = data.replace('SITE_URL = "https://example.com/"',
- 'SITE_URL = "https://example.com/foo/"')
- data = data.replace("# URL_TYPE = 'rel_path'",
- "URL_TYPE = 'full_path'")
- with io.open(conf_path, "w+", encoding="utf8") as outf:
- outf.write(data)
- outf.flush()
-
-
-class TestCheckFailure(DemoBuildTest):
- """The demo build should pass 'nikola check'"""
-
- def test_check_links_fail(self):
- with cd(self.target_dir):
- os.unlink(os.path.join("output", "archive.html"))
- try:
- __main__.main(['check', '-l'])
- except SystemExit as e:
- self.assertNotEqual(e.code, 0)
-
- def test_check_files_fail(self):
- with cd(self.target_dir):
- with io.open(os.path.join("output", "foobar"), "w+", encoding="utf8") as outf:
- outf.write("foo")
- try:
- __main__.main(['check', '-f'])
- except SystemExit as e:
- self.assertNotEqual(e.code, 0)
-
-
-class RelativeLinkTest2(DemoBuildTest):
- """Check that dropping pages to the root doesn't break links."""
-
- @classmethod
- def patch_site(self):
- """Set the SITE_URL to have a path"""
- conf_path = os.path.join(self.target_dir, "conf.py")
- with io.open(conf_path, "r", encoding="utf-8") as inf:
- data = inf.read()
- data = data.replace('("pages/*.txt", "pages", "story.tmpl"),',
- '("pages/*.txt", "", "story.tmpl"),')
- data = data.replace('("pages/*.rst", "pages", "story.tmpl"),',
- '("pages/*.rst", "", "story.tmpl"),')
- data = data.replace('# INDEX_PATH = ""',
- 'INDEX_PATH = "blog"')
- with io.open(conf_path, "w+", encoding="utf8") as outf:
- outf.write(data)
- outf.flush()
-
- def test_relative_links(self):
- """Check that the links in a page are correct"""
- test_path = os.path.join(self.target_dir, "output", "about-nikola.html")
- flag = False
- with open(test_path, "rb") as inf:
- data = inf.read()
- for _, _, url, _ in lxml.html.iterlinks(data):
- # Just need to be sure this one is ok
- if url.endswith("css"):
- self.assertFalse(url.startswith(".."))
- flag = True
- # But I also need to be sure it is there!
- self.assertTrue(flag)
-
- def test_index_in_sitemap(self):
- """Test that the correct path is in sitemap, and not the wrong one."""
- sitemap_path = os.path.join(self.target_dir, "output", "sitemap.xml")
- sitemap_data = io.open(sitemap_path, "r", encoding="utf8").read()
- self.assertFalse('<loc>https://example.com/</loc>' in sitemap_data)
- self.assertTrue('<loc>https://example.com/blog/index.html</loc>' in sitemap_data)
-
-
-class MonthlyArchiveTest(DemoBuildTest):
- """Check that the monthly archives build and are correct."""
-
- @classmethod
- def patch_site(self):
- """Set the SITE_URL to have a path"""
- conf_path = os.path.join(self.target_dir, "conf.py")
- with io.open(conf_path, "r", encoding="utf-8") as inf:
- data = inf.read()
- data = data.replace('# CREATE_MONTHLY_ARCHIVE = False',
- 'CREATE_MONTHLY_ARCHIVE = True')
- with io.open(conf_path, "w+", encoding="utf8") as outf:
- outf.write(data)
- outf.flush()
-
- def test_monthly_archive(self):
- """See that it builds"""
- self.assertTrue(os.path.isfile(os.path.join(self.tmpdir, 'target', 'output', '2012', '03', 'index.html')))
-
-
-class DayArchiveTest(DemoBuildTest):
- """Check that per-day archives build and are correct."""
-
- @classmethod
- def patch_site(self):
- """Set the SITE_URL to have a path"""
- conf_path = os.path.join(self.target_dir, "conf.py")
- with io.open(conf_path, "r", encoding="utf-8") as inf:
- data = inf.read()
- data = data.replace('# CREATE_DAILY_ARCHIVE = False',
- 'CREATE_DAILY_ARCHIVE = True')
- with io.open(conf_path, "w+", encoding="utf8") as outf:
- outf.write(data)
- outf.flush()
-
- def test_day_archive(self):
- """See that it builds"""
- self.assertTrue(os.path.isfile(os.path.join(self.tmpdir, 'target', 'output', '2012', '03', '30', 'index.html')))
-
-
-class FullArchiveTest(DemoBuildTest):
- """Check that full archives build and are correct."""
-
- @classmethod
- def patch_site(self):
- """Set the SITE_URL to have a path"""
- conf_path = os.path.join(self.target_dir, "conf.py")
- with io.open(conf_path, "r", encoding="utf-8") as inf:
- data = inf.read()
- data = data.replace('# CREATE_FULL_ARCHIVES = False',
- 'CREATE_FULL_ARCHIVES = True')
- with io.open(conf_path, "w+", encoding="utf8") as outf:
- outf.write(data)
- outf.flush()
-
- def test_full_archive(self):
- """See that it builds"""
- self.assertTrue(os.path.isfile(os.path.join(self.tmpdir, 'target', 'output', 'archive.html')))
- self.assertTrue(os.path.isfile(os.path.join(self.tmpdir, 'target', 'output', '2012', 'index.html')))
- self.assertTrue(os.path.isfile(os.path.join(self.tmpdir, 'target', 'output', '2012', '03', 'index.html')))
- self.assertTrue(os.path.isfile(os.path.join(self.tmpdir, 'target', 'output', '2012', '03', '30', 'index.html')))
-
-
-class SubdirRunningTest(DemoBuildTest):
- """Check that running nikola from subdir works."""
-
- def test_subdir_run(self):
- """Check whether build works from posts/"""
-
- with cd(os.path.join(self.target_dir, 'posts')):
- result = __main__.main(['build'])
- self.assertEquals(result, 0)
-
-
-class RedirectionsTest1(TestCheck):
- """Check REDIRECTIONS"""
-
- @classmethod
- def patch_site(self):
- """"""
- conf_path = os.path.join(self.target_dir, "conf.py")
- with io.open(conf_path, "a", encoding="utf8") as outf:
- outf.write("""\n\nREDIRECTIONS = [ ("posts/foo.html", "/foo/bar.html"), ]\n\n""")
-
- @classmethod
- def fill_site(self):
- target_path = os.path.join(self.target_dir, "files", "foo", "bar.html")
- nikola.utils.makedirs(os.path.join(self.target_dir, "files", "foo"))
- with io.open(target_path, "w+", encoding="utf8") as outf:
- outf.write("foo")
-
-
-class RedirectionsTest2(TestCheck):
- """Check external REDIRECTIONS"""
-
- @classmethod
- def patch_site(self):
- """"""
- conf_path = os.path.join(self.target_dir, "conf.py")
- with io.open(conf_path, "a", encoding="utf8") as outf:
- outf.write("""\n\nREDIRECTIONS = [ ("foo.html", "http://www.example.com/"), ]\n\n""")
-
-
-class RedirectionsTest3(TestCheck):
- """Check relative REDIRECTIONS"""
-
- @classmethod
- def patch_site(self):
- """"""
- conf_path = os.path.join(self.target_dir, "conf.py")
- with io.open(conf_path, "a", encoding="utf8") as outf:
- outf.write("""\n\nREDIRECTIONS = [ ("foo.html", "foo/bar.html"), ]\n\n""")
-
- @classmethod
- def fill_site(self):
- target_path = os.path.join(self.target_dir, "files", "foo", "bar.html")
- nikola.utils.makedirs(os.path.join(self.target_dir, "files", "foo"))
- with io.open(target_path, "w+", encoding="utf8") as outf:
- outf.write("foo")
-
-
-if __name__ == "__main__":
- unittest.main()