comparison tests/test_sources_autoconfig.py @ 979:45ad976712ec

tests: Big push to get the tests to pass again. - Lots of fixes everywhere in the code. - Try to handle debug logging in the multiprocessing worker pool when running in pytest. Not perfect, but usable for now. - Replace all `.md` test files with `.html` since now a auto-format extension always sets the format. - Replace `out` with `outfiles` in most places since now blog archives are added to the bake output and I don't want to add expected outputs for blog archives everywhere.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 29 Oct 2017 22:51:57 -0700
parents 72f17534d58e
children 8adc27285d93
comparison
equal deleted inserted replaced
978:7e51d14097cb 979:45ad976712ec
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_path, expected_slug, expected_foos',
9 [ 9 [
10 (lambda: mock_fs(), {}, [], []), 10 (lambda: mock_fs(),
11 {},
12 None, '', []),
11 (lambda: mock_fs().withPage('test/_index.md'), 13 (lambda: mock_fs().withPage('test/_index.md'),
12 {}, 14 {},
13 ['_index.md'], 15 '_index.md', '', []),
14 [{'slug': '', 'config': {'foo': []}}]),
15 (lambda: mock_fs().withPage('test/something.md'), 16 (lambda: mock_fs().withPage('test/something.md'),
16 {}, 17 {},
17 ['something.md'], 18 'something.md', 'something', []),
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', 'something', ['bar']),
22 [{'slug': 'something', 'config': {'foo': ['bar']}}]),
23 (lambda: mock_fs().withPage('test/bar1/bar2/something.md'), 22 (lambda: mock_fs().withPage('test/bar1/bar2/something.md'),
24 {}, 23 {},
25 ['bar1/bar2/something.md'], 24 'bar1/bar2/something.md', 'something', ['bar1', 'bar2']),
26 [{'slug': 'something', 'config': {'foo': ['bar1', 'bar2']}}]),
27 25
28 (lambda: mock_fs().withPage('test/something.md'), 26 (lambda: mock_fs().withPage('test/something.md'),
29 {'collapse_single_values': True}, 27 {'collapse_single_values': True},
30 ['something.md'], 28 'something.md', 'something', None),
31 [{'slug': 'something', 'config': {'foo': None}}]),
32 (lambda: mock_fs().withPage('test/bar/something.md'), 29 (lambda: mock_fs().withPage('test/bar/something.md'),
33 {'collapse_single_values': True}, 30 {'collapse_single_values': True},
34 ['bar/something.md'], 31 'bar/something.md', 'something', 'bar'),
35 [{'slug': 'something', 'config': {'foo': 'bar'}}]),
36 (lambda: mock_fs().withPage('test/bar1/bar2/something.md'), 32 (lambda: mock_fs().withPage('test/bar1/bar2/something.md'),
37 {'collapse_single_values': True}, 33 {'collapse_single_values': True},
38 ['bar1/bar2/something.md'], 34 'bar1/bar2/something.md', 'something', ['bar1', 'bar2']),
39 [{'slug': 'something', 'config': {'foo': ['bar1', 'bar2']}}]),
40 35
41 (lambda: mock_fs().withPage('test/something.md'), 36 (lambda: mock_fs().withPage('test/something.md'),
42 {'only_single_values': True}, 37 {'only_single_values': True},
43 ['something.md'], 38 'something.md', 'something', None),
44 [{'slug': 'something', 'config': {'foo': None}}]),
45 (lambda: mock_fs().withPage('test/bar/something.md'), 39 (lambda: mock_fs().withPage('test/bar/something.md'),
46 {'only_single_values': True}, 40 {'only_single_values': True},
47 ['bar/something.md'], 41 'bar/something.md', 'something', 'bar')
48 [{'slug': 'something', 'config': {'foo': 'bar'}}]),
49 ]) 42 ])
50 def test_autoconfig_source_factories(fs_fac, src_config, expected_paths, 43 def test_autoconfig_source_items(
51 expected_metadata): 44 fs_fac, src_config, expected_path, expected_slug, expected_foos):
52 site_config = { 45 site_config = {
53 'sources': { 46 'sources': {
54 'test': {'type': 'autoconfig', 47 'test': {'type': 'autoconfig',
55 'setting_name': 'foo'} 48 'setting_name': 'foo'}
56 }, 49 },
63 fs.withDir('kitchen/test') 56 fs.withDir('kitchen/test')
64 with mock_fs_scope(fs): 57 with mock_fs_scope(fs):
65 app = fs.getApp() 58 app = fs.getApp()
66 s = app.getSource('test') 59 s = app.getSource('test')
67 items = list(s.getAllContents()) 60 items = list(s.getAllContents())
68 paths = [os.path.relpath(i.spec, s.fs_endpoint_path) for i in items] 61
69 assert paths == slashfix(expected_paths) 62 if expected_path is None:
70 metadata = [i.metadata['route_params'] for i in items] 63 assert len(items) == 0
71 assert metadata == expected_metadata 64 else:
65 assert len(items) == 1
66 path = os.path.relpath(items[0].spec, s.fs_endpoint_path)
67 assert path == slashfix(expected_path)
68 slug = items[0].metadata['route_params']['slug']
69 assert slug == expected_slug
70 foos = items[0].metadata['config']['foo']
71 assert foos == expected_foos
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': {
87 with pytest.raises(Exception): 87 with pytest.raises(Exception):
88 list(s.getAllContents()) 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_route_params, expected_configs',
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 [{'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 [{'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 [{'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 [{'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_items(fs_fac, expected_paths, expected_route_params,
113 expected_configs):
113 site_config = { 114 site_config = {
114 'sources': { 115 'sources': {
115 'test': {'type': 'ordered', 116 'test': {'type': 'ordered',
116 'setting_name': 'foo'} 117 'setting_name': 'foo'}
117 }, 118 },
122 fs.withConfig({'site': site_config}) 123 fs.withConfig({'site': site_config})
123 fs.withDir('kitchen/test') 124 fs.withDir('kitchen/test')
124 with mock_fs_scope(fs): 125 with mock_fs_scope(fs):
125 app = fs.getApp() 126 app = fs.getApp()
126 s = app.getSource('test') 127 s = app.getSource('test')
127 facs = list(s.buildPageFactories()) 128 items = list(s.getAllContents())
128 paths = [f.rel_path for f in facs] 129
130 paths = [os.path.relpath(f.spec, s.fs_endpoint_path) for f in items]
129 assert paths == slashfix(expected_paths) 131 assert paths == slashfix(expected_paths)
130 metadata = [f.metadata for f in facs] 132 metadata = [f.metadata['route_params'] for f in items]
131 assert metadata == expected_metadata 133 assert metadata == expected_route_params
134 configs = [f.metadata['config'] for f in items]
135 for c in configs:
136 c.pop('format')
137 assert configs == expected_configs
132 138
133 139
134 @pytest.mark.parametrize( 140 @pytest.mark.parametrize(
135 'fs_fac, route_path, expected_path, expected_metadata', 141 'fs_fac, route_path, expected_path, expected_metadata',
136 [ 142 [
174 fs.withDir('kitchen/test') 180 fs.withDir('kitchen/test')
175 with mock_fs_scope(fs): 181 with mock_fs_scope(fs):
176 app = fs.getApp() 182 app = fs.getApp()
177 s = app.getSource('test') 183 s = app.getSource('test')
178 route_metadata = {'slug': route_path} 184 route_metadata = {'slug': route_path}
179 factory = s.findContent(route_metadata) 185 item = s.findContent(route_metadata)
180 if factory is None: 186 if item is None:
181 assert expected_path is None and expected_metadata is None 187 assert expected_path is None and expected_metadata is None
182 return 188 else:
183 assert factory.rel_path == slashfix(expected_path) 189 assert os.path.relpath(item.spec, s.fs_endpoint_path) == \
184 assert factory.metadata == expected_metadata 190 slashfix(expected_path)
191 assert item.metadata == expected_metadata
185 192