comparison tests/conftest.py @ 674:f987b29d6fab

tests: Add ability to run tests with a theme site. * Remove automatic creating of `config.yml`. * Add option to specify `theme_config` in YAML tests.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 06 Mar 2016 23:48:01 -0800
parents d6403c21bdea
children ba0a6bd5e913
comparison
equal deleted inserted replaced
673:d6403c21bdea 674:f987b29d6fab
74 def __init__(self, name, parent, spec): 74 def __init__(self, name, parent, spec):
75 super(YamlTestItemBase, self).__init__(name, parent) 75 super(YamlTestItemBase, self).__init__(name, parent)
76 self.spec = spec 76 self.spec = spec
77 77
78 @property 78 @property
79 def is_theme_site(self):
80 return self.spec.get('theme_config') is not None
81
82 @property
79 def mock_debug(self): 83 def mock_debug(self):
80 return bool(self.config.getoption('--mock-debug')) 84 return bool(self.config.getoption('--mock-debug'))
81 85
82 def _prepareMockFs(self): 86 def _prepareMockFs(self):
83 fs = mock_fs() 87 fs = mock_fs()
84 88
85 # Website config. 89 # Suppress any formatting or layout so we can compare
90 # much simpler strings.
86 config = { 91 config = {
87 'site': { 92 'site': {
88 'default_format': 'none', 93 'default_format': 'none',
89 'default_page_layout': 'none', 94 'default_page_layout': 'none',
90 'default_post_layout': 'none'} 95 'default_post_layout': 'none'}
91 } 96 }
92 test_config = self.spec.get('config') 97
93 if test_config is not None: 98 # Website or theme config.
94 merge_dicts(config, test_config) 99 test_theme_config = self.spec.get('theme_config')
95 fs.withConfig(config) 100 if test_theme_config is not None:
101 merge_dicts(config, test_theme_config)
102 fs.withThemeConfig(config)
103 else:
104 test_config = self.spec.get('config')
105 if test_config is not None:
106 merge_dicts(config, test_config)
107 fs.withConfig(config)
96 108
97 # Input file-system. 109 # Input file-system.
98 input_files = self.spec.get('in') 110 input_files = self.spec.get('in')
99 if input_files is not None: 111 if input_files is not None:
100 _add_mock_files(fs, '/kitchen', input_files) 112 _add_mock_files(fs, '/kitchen', input_files)
179 fs = self._prepareMockFs() 191 fs = self._prepareMockFs()
180 192
181 argv = self.spec['args'] 193 argv = self.spec['args']
182 if isinstance(argv, str): 194 if isinstance(argv, str):
183 argv = argv.split(' ') 195 argv = argv.split(' ')
196 if self.is_theme_site:
197 argv.insert(0, '--theme')
198 argv = ['--root', fs.path('/kitchen')] + argv
184 199
185 expected_code = self.spec.get('code', 0) 200 expected_code = self.spec.get('code', 0)
186 expected_out = self.spec.get('out', None) 201 expected_out = self.spec.get('out', None)
187 202
188 with mock_fs_scope(fs, keep=self.mock_debug): 203 with mock_fs_scope(fs, keep=self.mock_debug):
189 memstream = io.StringIO() 204 memstream = io.StringIO()
190 hdl = logging.StreamHandler(stream=memstream) 205 hdl = logging.StreamHandler(stream=memstream)
191 logging.getLogger().addHandler(hdl) 206 logging.getLogger().addHandler(hdl)
192 try: 207 try:
193 from piecrust.main import _pre_parse_chef_args, _run_chef 208 from piecrust.main import _pre_parse_chef_args, _run_chef
194 pre_args = _pre_parse_chef_args([ 209 pre_args = _pre_parse_chef_args(argv)
195 '--root', fs.path('/kitchen')])
196 exit_code = _run_chef(pre_args, argv) 210 exit_code = _run_chef(pre_args, argv)
197 finally: 211 finally:
198 logging.getLogger().removeHandler(hdl) 212 logging.getLogger().removeHandler(hdl)
199 213
200 assert expected_code == exit_code 214 assert expected_code == exit_code
230 fs = self._prepareMockFs() 244 fs = self._prepareMockFs()
231 245
232 from piecrust.baking.baker import Baker 246 from piecrust.baking.baker import Baker
233 with mock_fs_scope(fs, keep=self.mock_debug): 247 with mock_fs_scope(fs, keep=self.mock_debug):
234 out_dir = fs.path('kitchen/_counter') 248 out_dir = fs.path('kitchen/_counter')
235 app = fs.getApp() 249 app = fs.getApp(theme_site=self.is_theme_site)
236 250
237 variant = self.spec.get('config_variant') 251 variant = self.spec.get('config_variant')
238 values = self.spec.get('config_values') 252 values = self.spec.get('config_values')
239 if values is not None: 253 if values is not None:
240 values = list(values.items()) 254 values = list(values.items())
288 fs = self._prepareMockFs() 302 fs = self._prepareMockFs()
289 303
290 from piecrust.processing.pipeline import ProcessorPipeline 304 from piecrust.processing.pipeline import ProcessorPipeline
291 with mock_fs_scope(fs, keep=self.mock_debug): 305 with mock_fs_scope(fs, keep=self.mock_debug):
292 out_dir = fs.path('kitchen/_counter') 306 out_dir = fs.path('kitchen/_counter')
293 app = fs.getApp() 307 app = fs.getApp(theme_site=self.is_theme_site)
294 pipeline = ProcessorPipeline(app, out_dir) 308 pipeline = ProcessorPipeline(app, out_dir)
295 309
296 proc_names = self.spec.get('processors') 310 proc_names = self.spec.get('processors')
297 if proc_names: 311 if proc_names:
298 pipeline.enabled_processors = proc_names 312 pipeline.enabled_processors = proc_names
361 from werkzeug.test import Client 375 from werkzeug.test import Client
362 from werkzeug.wrappers import BaseResponse 376 from werkzeug.wrappers import BaseResponse
363 from piecrust.app import PieCrustFactory 377 from piecrust.app import PieCrustFactory
364 from piecrust.serving.server import Server 378 from piecrust.serving.server import Server
365 with mock_fs_scope(fs, keep=self.mock_debug): 379 with mock_fs_scope(fs, keep=self.mock_debug):
366 appfactory = PieCrustFactory(fs.path('/kitchen')) 380 appfactory = PieCrustFactory(
381 fs.path('/kitchen'),
382 theme_site=self.is_theme_site)
367 server = Server(appfactory) 383 server = Server(appfactory)
368 test_app = self._TestApp(server) 384 test_app = self._TestApp(server)
369 client = Client(test_app, BaseResponse) 385 client = Client(test_app, BaseResponse)
370 resp = client.get(url) 386 resp = client.get(url)
371 assert expected_status == resp.status_code 387 assert expected_status == resp.status_code