diff tests/test_pipelines_page.py @ 974:72f17534d58e

tests: First pass on making unit tests work again. - Fix all imports - Add more helper functions to work with mock file-systems - Simplify some code by running chef directly on the mock FS - Fix a couple tests
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 17 Oct 2017 01:07:30 -0700
parents
children 45ad976712ec
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test_pipelines_page.py	Tue Oct 17 01:07:30 2017 -0700
@@ -0,0 +1,98 @@
+import time
+import os.path
+import urllib.parse
+import pytest
+from piecrust.pipelines.records import MultiRecord
+from piecrust.pipelines._pagebaker import PageBaker
+from .mockutil import get_mock_app, mock_fs, mock_fs_scope
+
+
+@pytest.mark.parametrize('uri, pretty, expected', [
+    # Pretty URLs
+    ('', True, 'index.html'),
+    ('2', True, '2/index.html'),
+    ('foo', True, 'foo/index.html'),
+    ('foo/2', True, 'foo/2/index.html'),
+    ('foo/bar', True, 'foo/bar/index.html'),
+    ('foo/bar/2', True, 'foo/bar/2/index.html'),
+    ('foo.ext', True, 'foo.ext/index.html'),
+    ('foo.ext/2', True, 'foo.ext/2/index.html'),
+    ('foo/bar.ext', True, 'foo/bar.ext/index.html'),
+    ('foo/bar.ext/2', True, 'foo/bar.ext/2/index.html'),
+    ('foo.bar.ext', True, 'foo.bar.ext/index.html'),
+    ('foo.bar.ext/2', True, 'foo.bar.ext/2/index.html'),
+    # Ugly URLs
+    ('', False, 'index.html'),
+    ('2.html', False, '2.html'),
+    ('foo.html', False, 'foo.html'),
+    ('foo/2.html', False, 'foo/2.html'),
+    ('foo/bar.html', False, 'foo/bar.html'),
+    ('foo/bar/2.html', False, 'foo/bar/2.html'),
+    ('foo.ext', False, 'foo.ext'),
+    ('foo/2.ext', False, 'foo/2.ext'),
+    ('foo/bar.ext', False, 'foo/bar.ext'),
+    ('foo/bar/2.ext', False, 'foo/bar/2.ext'),
+    ('foo.bar.ext', False, 'foo.bar.ext'),
+    ('foo.bar/2.ext', False, 'foo.bar/2.ext')
+])
+def test_get_output_path(uri, pretty, expected):
+    app = get_mock_app()
+    if pretty:
+        app.config.set('site/pretty_urls', True)
+    assert app.config.get('site/pretty_urls') == pretty
+
+    for site_root in ['/', '/whatever/', '/~johndoe/']:
+        app.config.set('site/root', urllib.parse.quote(site_root))
+        baker = PageBaker(app, '/destination')
+        try:
+            path = baker.getOutputPath(urllib.parse.quote(site_root) + uri,
+                                       pretty)
+            expected = os.path.normpath(
+                os.path.join('/destination', expected))
+            assert expected == path
+        finally:
+            baker.shutdown()
+
+
+def test_removed():
+    fs = (mock_fs()
+          .withConfig()
+          .withPage('pages/foo.md', {'layout': 'none', 'format': 'none'},
+                    "a foo page")
+          .withPage('pages/_index.md', {'layout': 'none', 'format': 'none'},
+                    "something"))
+    with mock_fs_scope(fs):
+        fs.runChef('bake')
+        structure = fs.getStructure('kitchen/_counter')
+        assert structure == {
+            'foo.html': 'a foo page',
+            'index.html': 'something'}
+
+        os.remove(fs.path('kitchen/pages/foo.md'))
+        fs.runChef('bake')
+        structure = fs.getStructure('kitchen/_counter')
+        assert structure == {
+            'index.html': 'something'}
+
+
+def test_record_version_change():
+    fs = (mock_fs()
+          .withConfig()
+          .withPage('pages/foo.md', {'layout': 'none', 'format': 'none'},
+                    'a foo page'))
+    with mock_fs_scope(fs):
+        fs.runChef('bake')
+        mtime = os.path.getmtime(fs.path('kitchen/_counter/foo.html'))
+        time.sleep(1)
+
+        fs.runChef('bake')
+        assert mtime == os.path.getmtime(fs.path('kitchen/_counter/foo.html'))
+
+        MultiRecord.RECORD_VERSION += 1
+        try:
+            fs.runChef('bake')
+            assert mtime < os.path.getmtime(fs.path(
+                'kitchen/_counter/foo.html'))
+        finally:
+            MultiRecord.RECORD_VERSION -= 1
+