-
Notifications
You must be signed in to change notification settings - Fork 15
Expand file tree
/
Copy pathtest_stack.py
More file actions
123 lines (113 loc) · 3.82 KB
/
test_stack.py
File metadata and controls
123 lines (113 loc) · 3.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import unittest
import copy
import docutils
import docutils.examples
import yaml
import stack
class TestStack(unittest.TestCase):
def test_cleanup(self):
obj = {
'__': 'overwrite',
'l': [{'__': 'merge-last'}]
}
self.assertEqual(stack._cleanup(obj), {'l': []})
def test_merge(self):
# parse the readme and check that the merging scenarios are corrects
with open('README.rst', 'r') as f:
doc, pub = docutils.examples.internals(
f.read(), input_encoding='utf8')
for table in doc.traverse(condition=docutils.nodes.table):
for row in table.traverse(condition=docutils.nodes.row)[1:]:
if len(row) != 3: continue
before, data, after = (yaml.load(c.astext()) for c in row)
merged = stack._merge_dict(
copy.deepcopy(before), copy.deepcopy(data))
before_yml, data_yml, after_yml, merged_yml = (
yaml.dump(yml, default_flow_style=False) for yml in (
before, data, after, merged))
self.assertEqual(
merged, after, msg='\n'.join([
'\nBEFORE =>', before_yml,
'DATA =>', data_yml,
'MERGES TO =>', merged_yml,
'INSTEAD OF =>', after_yml,
]))
def test_merge_first_explicit_top_level(self):
# This checks __ behaviour.
cur_stack = {
"flat": "First value",
"nested": {
"val": "First value nested",
"nested_again": {
"val": 123
}
}
}
obj = {
"__": "merge-first",
"flat": "Shouldn't overwrite",
"flat_newval": "OK",
"nested": {
"val": "Shouldn't overwrite",
"newval": "OK",
"nested_again": {
"val": 456,
"newval": 678
}
}
}
expected = {
"flat": "First value",
"flat_newval": "OK",
"nested": {
"val": "First value nested",
"newval": "OK",
"nested_again": {
"val": 123,
"newval": 678
}
}
}
new_stack = stack._merge_dict(cur_stack, obj)
self.assertDictEqual(new_stack, expected)
def test_merge_first_with_default(self):
# This makes sure that we get the same effect as
# test_merge_first_explicit_top_level, but using
# default_strategy instead.
cur_stack = {
"flat": "First value",
"nested": {
"val": "First value nested",
"nested_again": {
"val": 123
}
}
}
obj = {
"flat": "Shouldn't overwrite",
"flat_newval": "OK",
"nested": {
"val": "Shouldn't overwrite",
"newval": "OK",
"nested_again": {
"val": 456,
"newval": 678
}
}
}
expected = {
"flat": "First value",
"flat_newval": "OK",
"nested": {
"val": "First value nested",
"newval": "OK",
"nested_again": {
"val": 123,
"newval": 678
}
}
}
new_stack = stack._merge_dict(cur_stack, obj, default_strategy="merge-first")
self.assertDictEqual(new_stack, expected)
if __name__ == '__main__':
unittest.main()