comparison tests/test_sources_autoconfig.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 e7b865f8f335
children 45ad976712ec
comparison
equal deleted inserted replaced
973:8419daaa7a0e 974:72f17534d58e
1 import os.path
1 import pytest 2 import pytest
2 from piecrust.sources.base import MODE_PARSING
3 from .mockutil import mock_fs, mock_fs_scope 3 from .mockutil import mock_fs, mock_fs_scope
4 from .pathutil import slashfix 4 from .pathutil import slashfix
5 5
6 6
7 @pytest.mark.parametrize( 7 @pytest.mark.parametrize(
8 'fs_fac, src_config, expected_paths, expected_metadata', 8 'fs_fac, src_config, expected_paths, expected_metadata',
9 [ 9 [
10 (lambda: mock_fs(), {}, [], []), 10 (lambda: mock_fs(), {}, [], []),
11 (lambda: mock_fs().withPage('test/_index.md'), 11 (lambda: mock_fs().withPage('test/_index.md'),
12 {}, 12 {},
13 ['_index.md'], 13 ['_index.md'],
14 [{'slug': '', 'config': {'foo': []}}]), 14 [{'slug': '', 'config': {'foo': []}}]),
15 (lambda: mock_fs().withPage('test/something.md'), 15 (lambda: mock_fs().withPage('test/something.md'),
16 {}, 16 {},
17 ['something.md'], 17 ['something.md'],
18 [{'slug': 'something', 'config': {'foo': []}}]), 18 [{'slug': 'something', 'config': {'foo': []}}]),
19 (lambda: mock_fs().withPage('test/bar/something.md'), 19 (lambda: mock_fs().withPage('test/bar/something.md'),
20 {}, 20 {},
21 ['bar/something.md'], 21 ['bar/something.md'],
22 [{'slug': 'something', 'config': {'foo': ['bar']}}]), 22 [{'slug': 'something', 'config': {'foo': ['bar']}}]),
23 (lambda: mock_fs().withPage('test/bar1/bar2/something.md'), 23 (lambda: mock_fs().withPage('test/bar1/bar2/something.md'),
24 {}, 24 {},
25 ['bar1/bar2/something.md'], 25 ['bar1/bar2/something.md'],
26 [{'slug': 'something', 'config': {'foo': ['bar1', 'bar2']}}]), 26 [{'slug': 'something', 'config': {'foo': ['bar1', 'bar2']}}]),
27 27
28 (lambda: mock_fs().withPage('test/something.md'), 28 (lambda: mock_fs().withPage('test/something.md'),
29 {'collapse_single_values': True}, 29 {'collapse_single_values': True},
30 ['something.md'], 30 ['something.md'],
31 [{'slug': 'something', 'config': {'foo': None}}]), 31 [{'slug': 'something', 'config': {'foo': None}}]),
32 (lambda: mock_fs().withPage('test/bar/something.md'), 32 (lambda: mock_fs().withPage('test/bar/something.md'),
33 {'collapse_single_values': True}, 33 {'collapse_single_values': True},
34 ['bar/something.md'], 34 ['bar/something.md'],
35 [{'slug': 'something', 'config': {'foo': 'bar'}}]), 35 [{'slug': 'something', 'config': {'foo': 'bar'}}]),
36 (lambda: mock_fs().withPage('test/bar1/bar2/something.md'), 36 (lambda: mock_fs().withPage('test/bar1/bar2/something.md'),
37 {'collapse_single_values': True}, 37 {'collapse_single_values': True},
38 ['bar1/bar2/something.md'], 38 ['bar1/bar2/something.md'],
39 [{'slug': 'something', 'config': {'foo': ['bar1', 'bar2']}}]), 39 [{'slug': 'something', 'config': {'foo': ['bar1', 'bar2']}}]),
40 40
41 (lambda: mock_fs().withPage('test/something.md'), 41 (lambda: mock_fs().withPage('test/something.md'),
42 {'only_single_values': True}, 42 {'only_single_values': True},
43 ['something.md'], 43 ['something.md'],
44 [{'slug': 'something', 'config': {'foo': None}}]), 44 [{'slug': 'something', 'config': {'foo': None}}]),
45 (lambda: mock_fs().withPage('test/bar/something.md'), 45 (lambda: mock_fs().withPage('test/bar/something.md'),
46 {'only_single_values': True}, 46 {'only_single_values': True},
47 ['bar/something.md'], 47 ['bar/something.md'],
48 [{'slug': 'something', 'config': {'foo': 'bar'}}]), 48 [{'slug': 'something', 'config': {'foo': 'bar'}}]),
49 ]) 49 ])
50 def test_autoconfig_source_factories(fs_fac, src_config, expected_paths, 50 def test_autoconfig_source_factories(fs_fac, src_config, expected_paths,
51 expected_metadata): 51 expected_metadata):
52 site_config = { 52 site_config = {
53 'sources': { 53 'sources': {
54 'test': {'type': 'autoconfig', 54 'test': {'type': 'autoconfig',
55 'setting_name': 'foo'} 55 'setting_name': 'foo'}
56 }, 56 },
57 'routes': [ 57 'routes': [
58 {'url': '/%slug%', 'source': 'test'}] 58 {'url': '/%slug%', 'source': 'test'}]
59 } 59 }
60 site_config['sources']['test'].update(src_config) 60 site_config['sources']['test'].update(src_config)
61 fs = fs_fac() 61 fs = fs_fac()
62 fs.withConfig({'site': site_config}) 62 fs.withConfig({'site': site_config})
63 fs.withDir('kitchen/test') 63 fs.withDir('kitchen/test')
64 with mock_fs_scope(fs): 64 with mock_fs_scope(fs):
65 app = fs.getApp() 65 app = fs.getApp()
66 s = app.getSource('test') 66 s = app.getSource('test')
67 facs = list(s.buildPageFactories()) 67 items = list(s.getAllContents())
68 paths = [f.rel_path for f in facs] 68 paths = [os.path.relpath(i.spec, s.fs_endpoint_path) for i in items]
69 assert paths == slashfix(expected_paths) 69 assert paths == slashfix(expected_paths)
70 metadata = [f.metadata for f in facs] 70 metadata = [i.metadata['route_params'] for i in items]
71 assert metadata == expected_metadata 71 assert metadata == expected_metadata
72 72
73 73
74 def test_autoconfig_fails_if_multiple_folders(): 74 def test_autoconfig_fails_if_multiple_folders():
75 site_config = { 75 site_config = {
76 'sources': { 76 'sources': {
77 'test': {'type': 'autoconfig', 77 'test': {'type': 'autoconfig',
78 'setting_name': 'foo', 78 'setting_name': 'foo',
79 'only_single_values': True} 79 'only_single_values': True}
80 } 80 }
81 } 81 }
82 fs = mock_fs().withConfig({'site': site_config}) 82 fs = mock_fs().withConfig({'site': site_config})
83 fs.withPage('test/bar1/bar2/something.md') 83 fs.withPage('test/bar1/bar2/something.md')
84 with mock_fs_scope(fs): 84 with mock_fs_scope(fs):
85 app = fs.getApp() 85 app = fs.getApp()
86 s = app.getSource('test') 86 s = app.getSource('test')
87 with pytest.raises(Exception): 87 with pytest.raises(Exception):
88 list(s.buildPageFactories()) 88 list(s.getAllContents())
89 89
90 90
91 @pytest.mark.parametrize( 91 @pytest.mark.parametrize(
92 'fs_fac, expected_paths, expected_metadata', 92 'fs_fac, expected_paths, expected_metadata',
93 [ 93 [
94 (lambda: mock_fs(), [], []), 94 (lambda: mock_fs(), [], []),
95 (lambda: mock_fs().withPage('test/_index.md'), 95 (lambda: mock_fs().withPage('test/_index.md'),
96 ['_index.md'], 96 ['_index.md'],
97 [{'slug': '', 97 [{'slug': '',
98 'config': {'foo': 0, 'foo_trail': [0]}}]), 98 'config': {'foo': 0, 'foo_trail': [0]}}]),
99 (lambda: mock_fs().withPage('test/something.md'), 99 (lambda: mock_fs().withPage('test/something.md'),
100 ['something.md'], 100 ['something.md'],
101 [{'slug': 'something', 101 [{'slug': 'something',
102 'config': {'foo': 0, 'foo_trail': [0]}}]), 102 'config': {'foo': 0, 'foo_trail': [0]}}]),
103 (lambda: mock_fs().withPage('test/08_something.md'), 103 (lambda: mock_fs().withPage('test/08_something.md'),
104 ['08_something.md'], 104 ['08_something.md'],
105 [{'slug': 'something', 105 [{'slug': 'something',
106 'config': {'foo': 8, 'foo_trail': [8]}}]), 106 'config': {'foo': 8, 'foo_trail': [8]}}]),
107 (lambda: mock_fs().withPage('test/02_there/08_something.md'), 107 (lambda: mock_fs().withPage('test/02_there/08_something.md'),
108 ['02_there/08_something.md'], 108 ['02_there/08_something.md'],
109 [{'slug': 'there/something', 109 [{'slug': 'there/something',
110 'config': {'foo': 8, 'foo_trail': [2, 8]}}]), 110 'config': {'foo': 8, 'foo_trail': [2, 8]}}]),
111 ]) 111 ])
112 def test_ordered_source_factories(fs_fac, expected_paths, expected_metadata): 112 def test_ordered_source_factories(fs_fac, expected_paths, expected_metadata):
113 site_config = { 113 site_config = {
114 'sources': { 114 'sources': {
115 'test': {'type': 'ordered', 115 'test': {'type': 'ordered',
116 'setting_name': 'foo'} 116 'setting_name': 'foo'}
117 }, 117 },
118 'routes': [ 118 'routes': [
119 {'url': '/%slug%', 'source': 'test'}] 119 {'url': '/%slug%', 'source': 'test'}]
120 } 120 }
121 fs = fs_fac() 121 fs = fs_fac()
122 fs.withConfig({'site': site_config}) 122 fs.withConfig({'site': site_config})
123 fs.withDir('kitchen/test') 123 fs.withDir('kitchen/test')
124 with mock_fs_scope(fs): 124 with mock_fs_scope(fs):
125 app = fs.getApp() 125 app = fs.getApp()
130 metadata = [f.metadata for f in facs] 130 metadata = [f.metadata for f in facs]
131 assert metadata == expected_metadata 131 assert metadata == expected_metadata
132 132
133 133
134 @pytest.mark.parametrize( 134 @pytest.mark.parametrize(
135 'fs_fac, route_path, expected_path, expected_metadata', 135 'fs_fac, route_path, expected_path, expected_metadata',
136 [ 136 [
137 (lambda: mock_fs(), 'missing', None, None), 137 (lambda: mock_fs(), 'missing', None, None),
138 (lambda: mock_fs().withPage('test/something.md'), 138 (lambda: mock_fs().withPage('test/something.md'),
139 'something', 'something.md', 139 'something', 'something.md',
140 {'slug': 'something', 140 {'slug': 'something',
141 'config': {'foo': 0, 'foo_trail': [0]}}), 141 'config': {'foo': 0, 'foo_trail': [0]}}),
142 (lambda: mock_fs().withPage('test/bar/something.md'), 142 (lambda: mock_fs().withPage('test/bar/something.md'),
143 'bar/something', 'bar/something.md', 143 'bar/something', 'bar/something.md',
144 {'slug': 'bar/something', 144 {'slug': 'bar/something',
145 'config': {'foo': 0, 'foo_trail': [0]}}), 145 'config': {'foo': 0, 'foo_trail': [0]}}),
146 (lambda: mock_fs().withPage('test/42_something.md'), 146 (lambda: mock_fs().withPage('test/42_something.md'),
147 'something', '42_something.md', 147 'something', '42_something.md',
148 {'slug': 'something', 148 {'slug': 'something',
149 'config': {'foo': 42, 'foo_trail': [42]}}), 149 'config': {'foo': 42, 'foo_trail': [42]}}),
150 (lambda: mock_fs().withPage('test/bar/42_something.md'), 150 (lambda: mock_fs().withPage('test/bar/42_something.md'),
151 'bar/something', 'bar/42_something.md', 151 'bar/something', 'bar/42_something.md',
152 {'slug': 'bar/something', 152 {'slug': 'bar/something',
153 'config': {'foo': 42, 'foo_trail': [42]}}), 153 'config': {'foo': 42, 'foo_trail': [42]}}),
154 154
155 ((lambda: mock_fs() 155 ((lambda: mock_fs()
156 .withPage('test/42_something.md') 156 .withPage('test/42_something.md')
157 .withPage('test/43_other_something.md')), 157 .withPage('test/43_other_something.md')),
158 'something', '42_something.md', 158 'something', '42_something.md',
159 {'slug': 'something', 159 {'slug': 'something',
160 'config': {'foo': 42, 'foo_trail': [42]}}), 160 'config': {'foo': 42, 'foo_trail': [42]}}),
161 ]) 161 ])
162 def test_ordered_source_find(fs_fac, route_path, expected_path, 162 def test_ordered_source_find(fs_fac, route_path, expected_path,
163 expected_metadata): 163 expected_metadata):
164 site_config = { 164 site_config = {
165 'sources': { 165 'sources': {
166 'test': {'type': 'ordered', 166 'test': {'type': 'ordered',
167 'setting_name': 'foo'} 167 'setting_name': 'foo'}
168 }, 168 },
169 'routes': [ 169 'routes': [
170 {'url': '/%slug%', 'source': 'test'}] 170 {'url': '/%slug%', 'source': 'test'}]
171 } 171 }
172 fs = fs_fac() 172 fs = fs_fac()
173 fs.withConfig({'site': site_config}) 173 fs.withConfig({'site': site_config})
174 fs.withDir('kitchen/test') 174 fs.withDir('kitchen/test')
175 with mock_fs_scope(fs): 175 with mock_fs_scope(fs):
176 app = fs.getApp() 176 app = fs.getApp()
177 s = app.getSource('test') 177 s = app.getSource('test')
178 route_metadata = {'slug': route_path} 178 route_metadata = {'slug': route_path}
179 factory = s.findPageFactory(route_metadata, MODE_PARSING) 179 factory = s.findContent(route_metadata)
180 if factory is None: 180 if factory is None:
181 assert expected_path is None and expected_metadata is None 181 assert expected_path is None and expected_metadata is None
182 return 182 return
183 assert factory.rel_path == slashfix(expected_path) 183 assert factory.rel_path == slashfix(expected_path)
184 assert factory.metadata == expected_metadata 184 assert factory.metadata == expected_metadata