Mercurial > piecrust2
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 |