view tests/test_sources_autoconfig.py @ 242:f130365568ff

internal: Code reorganization to put less stuff in `sources.base`. Interfaces that sources can implement are in `sources.interfaces`. The default page source is in `sources.default`. The `SimplePageSource` is gone since most subclasses only wanted to do *some* stuff the same, but *lots* of stuff slightly different. I may have to revisit the code to extract exactly the code that's in common.
author Ludovic Chabant <ludovic@chabant.com>
date Wed, 18 Feb 2015 18:35:03 -0800
parents f43f19975671
children f512905ae812
line wrap: on
line source

import pytest
from piecrust.sources.base import MODE_PARSING
from .mockutil import mock_fs, mock_fs_scope


@pytest.mark.parametrize(
        'fs, src_config, expected_paths, expected_metadata',
        [
            (mock_fs(), {}, [], []),
            (mock_fs().withPage('test/something.md'),
                {},
                ['something.md'],
                [{'slug': 'something', 'config': {'foo': []}}]),
            (mock_fs().withPage('test/bar/something.md'),
                {},
                ['bar/something.md'],
                [{'slug': 'something', 'config': {'foo': ['bar']}}]),
            (mock_fs().withPage('test/bar1/bar2/something.md'),
                {},
                ['bar1/bar2/something.md'],
                [{'slug': 'something', 'config': {'foo': ['bar1', 'bar2']}}]),

            (mock_fs().withPage('test/something.md'),
                {'collapse_single_values': True},
                ['something.md'],
                [{'slug': 'something', 'config': {'foo': None}}]),
            (mock_fs().withPage('test/bar/something.md'),
                {'collapse_single_values': True},
                ['bar/something.md'],
                [{'slug': 'something', 'config': {'foo': 'bar'}}]),
            (mock_fs().withPage('test/bar1/bar2/something.md'),
                {'collapse_single_values': True},
                ['bar1/bar2/something.md'],
                [{'slug': 'something', 'config': {'foo': ['bar1', 'bar2']}}]),

            (mock_fs().withPage('test/something.md'),
                {'only_single_values': True},
                ['something.md'],
                [{'slug': 'something', 'config': {'foo': None}}]),
            (mock_fs().withPage('test/bar/something.md'),
                {'only_single_values': True},
                ['bar/something.md'],
                [{'slug': 'something', 'config': {'foo': 'bar'}}]),
            ])
def test_autoconfig_source_factories(fs, src_config, expected_paths,
                                     expected_metadata):
    site_config = {
            'sources': {
                'test': {'type': 'autoconfig',
                         'setting_name': 'foo'}
                },
            'routes': [
                {'url': '/%slug%', 'source': 'test'}]
            }
    site_config['sources']['test'].update(src_config)
    fs.withConfig({'site': site_config})
    fs.withDir('kitchen/test')
    with mock_fs_scope(fs):
        app = fs.getApp()
        s = app.getSource('test')
        facs = list(s.buildPageFactories())
        paths = [f.rel_path for f in facs]
        assert paths == expected_paths
        metadata = [f.metadata for f in facs]
        assert metadata == expected_metadata


def test_autoconfig_fails_if_multiple_folders():
    site_config = {
            'sources': {
                'test': {'type': 'autoconfig',
                         'setting_name': 'foo',
                         'only_single_values': True}
                }
            }
    fs = mock_fs().withConfig({'site': site_config})
    fs.withPage('test/bar1/bar2/something.md')
    with mock_fs_scope(fs):
        app = fs.getApp()
        s = app.getSource('test')
        with pytest.raises(Exception):
            list(s.buildPageFactories())


@pytest.mark.parametrize(
        'fs, expected_paths, expected_metadata',
        [
            (mock_fs(), [], []),
            (mock_fs().withPage('test/something.md'),
                ['something.md'],
                [{'slug': 'something',
                    'config': {'foo': 0, 'foo_trail': [0]}}]),
            (mock_fs().withPage('test/08_something.md'),
                ['08_something.md'],
                [{'slug': 'something',
                    'config': {'foo': 8, 'foo_trail': [8]}}]),
            (mock_fs().withPage('test/02_there/08_something.md'),
                ['02_there/08_something.md'],
                [{'slug': 'there/something',
                    'config': {'foo': 8, 'foo_trail': [2, 8]}}]),
            ])
def test_ordered_source_factories(fs, expected_paths, expected_metadata):
    site_config = {
            'sources': {
                'test': {'type': 'ordered',
                         'setting_name': 'foo'}
                },
            'routes': [
                {'url': '/%slug%', 'source': 'test'}]
            }
    fs.withConfig({'site': site_config})
    fs.withDir('kitchen/test')
    with mock_fs_scope(fs):
        app = fs.getApp()
        s = app.getSource('test')
        facs = list(s.buildPageFactories())
        paths = [f.rel_path for f in facs]
        assert paths == expected_paths
        metadata = [f.metadata for f in facs]
        assert metadata == expected_metadata


@pytest.mark.parametrize(
        'fs, route_path, expected_path, expected_metadata',
        [
            (mock_fs(), 'missing', None, None),
            (mock_fs().withPage('test/something.md'),
                'something', 'something.md',
                {'slug': 'something',
                    'config': {'foo': 0, 'foo_trail': [0]}}),
            (mock_fs().withPage('test/bar/something.md'),
                'bar/something', 'bar/something.md',
                {'slug': 'bar/something',
                    'config': {'foo': 0, 'foo_trail': [0]}}),
            (mock_fs().withPage('test/42_something.md'),
                'something', '42_something.md',
                {'slug': 'something',
                    'config': {'foo': 42, 'foo_trail': [42]}}),
            (mock_fs().withPage('test/bar/42_something.md'),
                'bar/something', 'bar/42_something.md',
                {'slug': 'bar/something',
                    'config': {'foo': 42, 'foo_trail': [42]}}),

            ((mock_fs()
                .withPage('test/42_something.md')
                .withPage('test/43_other_something.md')),
                'something', '42_something.md',
                {'slug': 'something',
                    'config': {'foo': 42, 'foo_trail': [42]}}),
            ])
def test_ordered_source_find(fs, route_path, expected_path,
                             expected_metadata):
    site_config = {
            'sources': {
                'test': {'type': 'ordered',
                         'setting_name': 'foo'}
                },
            'routes': [
                {'url': '/%slug%', 'source': 'test'}]
            }
    fs.withConfig({'site': site_config})
    fs.withDir('kitchen/test')
    with mock_fs_scope(fs):
        app = fs.getApp()
        s = app.getSource('test')
        route_metadata = {'slug': route_path}
        fac_path, metadata = s.findPagePath(route_metadata, MODE_PARSING)
        assert fac_path == expected_path
        assert metadata == expected_metadata