ticket 38558: add unit test, deepcopy() only if necessary

This commit is contained in:
Jonathan Ballet 2017-01-05 23:09:35 +01:00 committed by rallytime
parent 30ae0a1958
commit c2f98d2f04
2 changed files with 25 additions and 1 deletions

View file

@ -91,10 +91,10 @@ def get(key,
raise SaltInvocationError(
'default must be a dictionary when merge=True'
)
default = copy.deepcopy(default)
ret = salt.utils.traverse_dict_and_list(pillar_dict, key, {}, delimiter)
if isinstance(ret, collections.Mapping) and \
isinstance(default, collections.Mapping):
default = copy.deepcopy(default)
return salt.utils.dictupdate.update(default, ret)
ret = salt.utils.traverse_dict_and_list(pillar_dict,

View file

@ -54,6 +54,30 @@ class PillarModuleTestCase(TestCase):
def test_ls(self):
self.assertEqual(pillarmod.ls(), ['a', 'b'])
def test_pillar_get_default_merge_regression_38558(self):
"""Test for pillar.get(key=..., default=..., merge=True)
Do not update the ``default`` value when using ``merge=True``.
See: https://github.com/saltstack/salt/issues/38558
"""
pillarmod.__opts__ = {}
pillarmod.__pillar__ = {'l1': {'l2': {'l3': 42}}}
res = pillarmod.get(key='l1')
self.assertEqual({'l2': {'l3': 42}}, res)
default = {'l2': {'l3': 43}}
res = pillarmod.get(key='l1', default=default)
self.assertEqual({'l2': {'l3': 42}}, res)
self.assertEqual({'l2': {'l3': 43}}, default)
res = pillarmod.get(key='l1', default=default, merge=True)
self.assertEqual({'l2': {'l3': 42}}, res)
self.assertEqual({'l2': {'l3': 43}}, default)
# gracinet: not sure this is really useful, but other test modules have this as well
if __name__ == '__main__':