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
+