view tests/test_data_assetor.py @ 1188:a7c43131d871

bake: Fix file write flushing problem with Python 3.8+ Writing the cache files fails in Python 3.8 because it looks like flushing behaviour has changed. We need to explicitly flush. And even then, in very rare occurrences, it looks like it can still run into racing conditions, so we do a very hacky and ugly "retry" loop when fetching cached data :(
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 15 Jun 2021 22:36:23 -0700
parents 11b9d0c8bd62
children
line wrap: on
line source

import pytest
from piecrust.data.assetor import Assetor, UnsupportedAssetsError
from .mockutil import mock_fs, mock_fs_scope, get_simple_page


@pytest.mark.parametrize('fs_fac, site_root, expected', [
    (lambda: mock_fs().withPage('pages/foo/bar'), '/', {}),
    (lambda: mock_fs()
     .withPage('pages/foo/bar')
     .withPageAsset('pages/foo/bar', 'one.txt', 'one'),
     '/',
     {'one': 'one'}),
    (lambda: mock_fs()
     .withPage('pages/foo/bar')
     .withPageAsset('pages/foo/bar', 'one.txt', 'one')
     .withPageAsset('pages/foo/bar', 'two.txt', 'two'),
     '/',
     {'one': 'one', 'two': 'two'}),

    (lambda: mock_fs().withPage('pages/foo/bar'), '/whatever', {}),
    (lambda: mock_fs()
     .withPage('pages/foo/bar')
     .withPageAsset('pages/foo/bar', 'one.txt', 'one'),
     '/whatever',
     {'one': 'one'}),
    (lambda: mock_fs()
     .withPage('pages/foo/bar')
     .withPageAsset('pages/foo/bar', 'one.txt', 'one')
     .withPageAsset('pages/foo/bar', 'two.txt', 'two'),
     '/whatever',
     {'one': 'one', 'two': 'two'})
])
def test_assets(fs_fac, site_root, expected):
    fs = fs_fac()
    fs.withConfig({'site': {'root': site_root}})
    with mock_fs_scope(fs):
        app = fs.getApp()
        app.config.set('site/asset_url_format', '%page_uri%/%filename%')
        page = get_simple_page(app, 'foo/bar')

        assetor = Assetor(page)
        for en in expected.keys():
            assert en in assetor
            assert hasattr(assetor, en)
            path = site_root.rstrip('/') + '/foo/bar/%s.txt' % en
            assert str(assetor[en]) == path
            assert str(getattr(assetor, en)) == path


def test_missing_asset():
    with pytest.raises(KeyError):
        fs = (mock_fs()
              .withConfig()
              .withPage('pages/foo/bar'))
        with mock_fs_scope(fs):
            app = fs.getApp()
            app.config.set('site/asset_url_format', '%page_uri%/%filename%')
            page = get_simple_page(app, 'foo/bar')

            assetor = Assetor(page)
            assetor['this_doesnt_exist']


def test_multiple_assets_with_same_name():
    with pytest.raises(UnsupportedAssetsError):
        fs = (mock_fs()
              .withConfig()
              .withPage('pages/foo/bar')
              .withPageAsset('pages/foo/bar', 'one.txt', 'one text')
              .withPageAsset('pages/foo/bar', 'one.jpg', 'one picture'))
        with mock_fs_scope(fs):
            app = fs.getApp()
            app.config.set('site/asset_url_format', '%page_uri%/%filename%')
            page = get_simple_page(app, 'foo/bar')

            assetor = Assetor(page)
            assetor['one']