annotate tests/test_appconfig.py @ 683:ec384174b8b2

internal: More work/fixes on how default/theme/user configs are merged. Change how the code is organized to have better data flow. Add some tests.
author Ludovic Chabant <ludovic@chabant.com>
date Wed, 09 Mar 2016 00:23:51 -0800
parents 894d286b348f
children 15b5181b2e42
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
683
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
1 import yaml
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 from piecrust.appconfig import PieCrustConfiguration
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
3 from .mockutil import mock_fs, mock_fs_scope
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6 def test_config_default():
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7 values = {}
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8 config = PieCrustConfiguration(values=values)
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9 assert config.get('site/root') == '/'
683
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
10 assert len(config.get('site/sources')) == 3 # pages, posts, theme_pages
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13 def test_config_default2():
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14 config = PieCrustConfiguration()
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15 assert config.get('site/root') == '/'
683
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
16 assert len(config.get('site/sources')) == 3 # pages, posts, theme_pages
584
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19 def test_config_site_override_title():
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20 values = {'site': {'title': "Whatever"}}
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21 config = PieCrustConfiguration(values=values)
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22 assert config.get('site/root') == '/'
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23 assert config.get('site/title') == 'Whatever'
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25
9ccc933ac2c7 internal: Refactor the app configuration class.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 def test_config_site_add_source():
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
27 config = {'site': {
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
28 'sources': {'notes': {}},
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
29 'routes': [{'url': '/notes/%path:slug%', 'source': 'notes'}]
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
30 }}
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
31 fs = mock_fs().withConfig(config)
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
32 with mock_fs_scope(fs):
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
33 app = fs.getApp()
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
34 # The order of routes is important. Sources, not so much.
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
35 # `posts` shows up 3 times in routes (posts, tags, categories)
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
36 assert (list(
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
37 map(
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
38 lambda v: v['source'],
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
39 app.config.get('site/routes'))) ==
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
40 ['notes', 'posts', 'posts', 'posts', 'pages', 'theme_pages'])
683
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
41 assert list(app.config.get('site/sources').keys()) == [
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
42 'theme_pages', 'pages', 'posts', 'notes']
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
43
681
894d286b348f internal: Refactor config loading some more.
Ludovic Chabant <ludovic@chabant.com>
parents: 675
diff changeset
44
683
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
45 def test_config_site_add_source_in_both_site_and_theme():
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
46 theme_config = {'site': {
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
47 'sources': {'theme_notes': {}},
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
48 'routes': [{'url': '/theme_notes/%path:slug%', 'source': 'theme_notes'}]
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
49 }}
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
50 config = {'site': {
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
51 'sources': {'notes': {}},
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
52 'routes': [{'url': '/notes/%path:slug%', 'source': 'notes'}]
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
53 }}
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
54 fs = (mock_fs()
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
55 .withConfig(config)
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
56 .withFile('kitchen/theme/theme_config.yml', yaml.dump(theme_config)))
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
57 with mock_fs_scope(fs):
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
58 app = fs.getApp()
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
59 # The order of routes is important. Sources, not so much.
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
60 # `posts` shows up 3 times in routes (posts, tags, categories)
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
61 assert (list(
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
62 map(
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
63 lambda v: v['source'],
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
64 app.config.get('site/routes'))) ==
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
65 ['notes', 'posts', 'posts', 'posts', 'pages', 'theme_notes', 'theme_pages'])
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
66 assert list(app.config.get('site/sources').keys()) == [
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
67 'theme_pages', 'theme_notes', 'pages', 'posts', 'notes']
ec384174b8b2 internal: More work/fixes on how default/theme/user configs are merged.
Ludovic Chabant <ludovic@chabant.com>
parents: 681
diff changeset
68