view 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 source

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