Mercurial > piecrust2
diff tests/test_sources_autoconfig.py @ 239:f43f19975671
sources: Refactor `autoconfig` source, add `OrderedPageSource`.
Also add unit tests.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sun, 15 Feb 2015 22:48:42 -0800 |
parents | |
children | f130365568ff |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test_sources_autoconfig.py Sun Feb 15 22:48:42 2015 -0800 @@ -0,0 +1,159 @@ +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}}]), + (mock_fs().withPage('test/08_something.md'), + ['08_something.md'], + [{'slug': 'something', 'config': {'foo': 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}}), + (mock_fs().withPage('test/bar/something.md'), + 'bar/something', 'bar/something.md', + {'slug': 'bar/something', 'config': {'foo': 0}}), + (mock_fs().withPage('test/42_something.md'), + 'something', '42_something.md', + {'slug': 'something', 'config': {'foo': 42}}), + (mock_fs().withPage('test/bar/42_something.md'), + 'bar/something', 'bar/42_something.md', + {'slug': 'bar/something', 'config': {'foo': 42}}), + + ((mock_fs() + .withPage('test/42_something.md') + .withPage('test/43_other_something.md')), + 'something', '42_something.md', + {'slug': 'something', 'config': {'foo': 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 = {'path': route_path} + fac_path, metadata = s.findPagePath(route_metadata, MODE_PARSING) + assert fac_path == expected_path + assert metadata == expected_metadata +