Completed
Pull Request — master (#77)
by
unknown
01:34
created

Test_40_merge.set_none_merge_strat()   A

Complexity

Conditions 2

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 2
c 1
b 0
f 1
dl 0
loc 3
rs 10
1
#
2
# Forked from m9dicts.tests.{api,dicts}
3
#
4
# Copyright (C) 2011 - 2016 Satoru SATOH <ssato @ redhat.com>
5
# Copyright (C) 2017 Red Hat, Inc.
6
#
7
# pylint: disable=missing-docstring,invalid-name,protected-access
8
from __future__ import absolute_import
9
10
import copy
11
import unittest
12
import anyconfig.dicts as TT
13
14
from tests.common import dicts_equal
15
from anyconfig.compat import OrderedDict
16
from anyconfig.utils import is_dict_like
17
18
19
class Test_10_get(unittest.TestCase):
20
21
    def test_10_empty_path(self):
22
        dic = dict(a=1, b=[1, 2])
23
        (dic2, err) = TT.get(dic, '')
24
        self.assertEqual(err, '')
25
        self.assertTrue(dicts_equal(dic2, dic))
26
27
    def test_20_json_pointer(self):
28
        # test case in rfc, http://tools.ietf.org/html/rfc6901
29
        dic = {"foo": ["bar", "baz"],
30
               "": 0,
31
               "a/b": 1,
32
               "c%d": 2,
33
               "e^f": 3,
34
               "g|h": 4,
35
               r"i\\j": 5,
36
               r'k\"l': 6,
37
               " ": 7,
38
               "m~n": 8}
39
40
        self.assertTrue(dicts_equal(TT.get(dic, "")[0], dic))
41
        self.assertEqual(TT.get(dic, "/foo")[0], ["bar", "baz"])
42
        self.assertEqual(TT.get(dic, "/foo/0")[0], "bar")
43
        self.assertEqual(TT.get(dic, "/")[0], 0)
44
        self.assertEqual(TT.get(dic, "/a~1b")[0], 1)
45
        self.assertEqual(TT.get(dic, "/c%d")[0], 2)
46
        self.assertEqual(TT.get(dic, "/e^f")[0], 3)
47
        self.assertEqual(TT.get(dic, "/g|h")[0], 4)
48
        self.assertEqual(TT.get(dic, r"/i\\j")[0], 5)
49
        self.assertEqual(TT.get(dic, r'/k\"l')[0], 6)
50
        self.assertEqual(TT.get(dic, "/ ")[0], 7)
51
        self.assertEqual(TT.get(dic, "/m~0n")[0], 8)
52
53
    def test_22_json_pointer__array(self):
54
        dic = dict(a=[1, 2], )
55
        self.assertEqual(TT.get(dic, "/a/1"), (2, ''))
56
57
        (val, msg) = TT.get(dic, "/a/2")
58
        self.assertTrue(val is None)
59
        self.assertTrue(bool(msg))
60
        # maybe the error message depends on python version.
61
        # self.assertEqual(msg, 'list index out of range')
62
63
        (val, msg) = TT.get(dic, "/a/b/d/-")
64
        self.assertTrue(val is None)
65
        self.assertTrue(bool(msg))
66
        # Likewise.
67
        # self.assertEqual(msg, 'list indices must be integers...')
68
69
70
class Test_10_update_with_replace(unittest.TestCase):
71
72
    ac_merge = TT.MS_REPLACE
73
74
    dic = OrderedDict((("a", 1), ("b", [1, 3]), ("c", "abc"), ("f", None)))
75
    other = OrderedDict((("a", 2), ("b", [0, 1]),
76
                         ("c", OrderedDict((("d", "d"), ("e", 1)))),
77
                         ("d", "d")))
78
79
    def assert_dicts_equal(self, dic, upd, ref):
80
        if not is_dict_like(upd):
81
            upd = OrderedDict(upd)
82
83
        self.assertTrue(all(dic[k] == upd[k] for k in upd.keys()))
84
        self.assertTrue(all(dic[k] == ref[k] for k in ref.keys()
85
                            if k not in upd))
86
87
    def assert_updated(self, other):
88
        dic = copy.deepcopy(self.dic)
89
        TT.merge(dic, other, ac_merge=self.ac_merge)
90
        self.assert_dicts_equal(dic, other, self.dic)
91
92
    def test_10_update_with_a_odict(self):
93
        self.assert_updated(self.other)
94
95
    def test_12_update_with_a_dict(self):
96
        self.assert_updated(dict(self.other))
97
98
    def test_20_update_with_iterable(self):
99
        self.assert_updated(self.other.items())
100
101
    def test_30_update_with_invalid(self):
102
        try:
103
            raised = False
104
            TT.merge(self.dic, 1)
105
        except (ValueError, TypeError):
106
            raised = True
107
108
        self.assertTrue(raised)
109
110
111
class Test_20_update_wo_replace(Test_10_update_with_replace):
112
113
    ac_merge = TT.MS_NO_REPLACE
114
115
    def assert_dicts_equal(self, dic, upd, ref):
116
        if not is_dict_like(upd):
117
            upd = OrderedDict(upd)
118
119
        self.assertTrue(all(dic[k] == upd[k] for k in upd.keys()
120
                            if k not in ref))
121
        self.assertTrue(all(dic[k] == ref[k] for k in ref.keys()))
122
123
124
class Test_30_update_with_merge(Test_10_update_with_replace):
125
126
    ac_merge = TT.MS_DICTS
127
    replaced_keys = "a b d".split()
128
129 View Code Duplication
    def assert_dicts_equal(self, dic, upd, ref):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
130
        if not is_dict_like(upd):
131
            upd = OrderedDict(upd)
132
133
        self.assertTrue(all(dic[k] == upd[k] for k in self.replaced_keys))
134
        self.assertTrue(all(dic["c"][k] == upd["c"][k] for k
135
                            in upd["c"].keys()))
136
        self.assertTrue(all(dic[k] == ref[k] for k in ref.keys()
137
                            if k not in upd))
138
139
140
class Test_32_update_with_merge_lists(Test_10_update_with_replace):
141
142
    ac_merge = TT.MS_DICTS_AND_LISTS
143
144 View Code Duplication
    def assert_dicts_equal(self, dic, upd, ref):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
145
        if not is_dict_like(upd):
146
            upd = OrderedDict(upd)
147
148
        self.assertTrue(all(dic[k] == upd[k] for k in ["d"]))
149
        self.assertEqual(dic["c"], upd["c"])  # Overwritten.
150
        self.assertTrue(all(dic[k] == ref[k] for k in ref.keys()
151
                            if k not in upd))
152
153
154
class Test_40_merge(unittest.TestCase):
155
156
    dic = dict(a=1, b=dict(b=[0, 1], c="C"), name="a")
157
    upd = dict(a=2, b=dict(b=[1, 2, 3, 4, 5], d="D"), e="E")
158
159
    def test_10_update_with_replace(self):
160
        dic = copy.deepcopy(self.dic)
161
        exp = copy.deepcopy(self.upd)
162
        exp["name"] = dic["name"]
163
164
        TT.merge(dic, self.upd, ac_merge=TT.MS_REPLACE)
165
        self.assertTrue(dicts_equal(dic, exp))
166
167
    def test_20_update_wo_replace(self):
168
        dic = copy.deepcopy(self.dic)
169
        exp = copy.deepcopy(self.dic)
170
        exp["e"] = self.upd["e"]
171
172
        TT.merge(dic, self.upd, ac_merge=TT.MS_NO_REPLACE)
173
        self.assertTrue(dicts_equal(dic, exp))
174
175
    def test_30_update_with_merge(self):
176
        dic = copy.deepcopy(self.dic)
177
        exp = copy.deepcopy(self.upd)
178
        exp["b"]["c"] = dic["b"]["c"]
179
        exp["name"] = dic["name"]
180
181
        TT.merge(dic, self.upd, ac_merge=TT.MS_DICTS)
182
        self.assertTrue(dicts_equal(dic, exp))
183
184 View Code Duplication
    def test_40_update_with_merge_lists(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
185
        dic = copy.deepcopy(self.dic)
186
        exp = copy.deepcopy(self.upd)
187
        exp["b"]["b"] = [0] + exp["b"]["b"]
188
        exp["b"]["c"] = dic["b"]["c"]
189
        exp["name"] = dic["name"]
190
191
        TT.merge(dic, self.upd, ac_merge=TT.MS_DICTS_AND_LISTS)
192
        self.assertTrue(dicts_equal(dic, exp))
193
194
    def test_50_update_with_custom_merge(self):
195
        def set_none_merge_strat(self, other, key, *args, **kwargs):
196
            for k in self:
197
                self[k] = None
198
199
        dic = copy.deepcopy(self.dic)
200
        exp = dict(zip(dic.keys(), [None for _ in dic]))
201
202
        TT.merge(dic, self.upd, ac_merge=set_none_merge_strat)
203
        self.assertTrue(dicts_equal(dic, exp))
204
205
# vim:sw=4:ts=4:et:
206