Mercurial > piecrust2
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 +