def test_dedupe_preserves_order(self): """ Order of dedup'd lists is preserved. This too is a bit hairy to test with properties """ task_args = { 'suffix_to_merge': 'whatever__to_merge', 'merged_var_name': 'merged_var', 'dedup': True, 'expected_type': 'list', } list1 = [1, 2, 3] list2 = [3, 4, 5] list3 = [5, 6, 7] task_vars = { 'var1_whatever__to_merge': list1, 'var2_whatever__to_merge': list2, 'var3_whatever__to_merge': list3, } result = make_and_run_plugin(task_args=task_args, task_vars=task_vars) merged_var = result['ansible_facts']['merged_var'] self.assertEqual(merged_var, [1, 2, 3, 4, 5, 6, 7])
def test_merge_rec_with_list_dicts(self, dict1, dict2, dict3): task_args = { 'suffix_to_merge': 'whatever__to_merge', 'merged_var_name': 'merged_var', 'expected_type': 'dict', 'recursive_dict_merge': True, } task_vars = { 'var1_whatever__to_merge': dict1, 'var2_whatever__to_merge': dict2, 'var3_whatever__to_merge': dict3, } result = make_and_run_plugin(task_args=task_args, task_vars=task_vars) merged_var = result['ansible_facts']['merged_var'] # check all keys are present self.assertTrue( all([k in merged_var.keys() for k in dict1.keys()+dict2.keys()+dict3.keys()]) ) # check all list values are present from all input dicts self.assertTrue( all( [set(dict1[k]).issubset(set(merged_var[k])) for k in dict1.keys()] + [set(dict2[k]).issubset(set(merged_var[k])) for k in dict2.keys()] + [set(dict3[k]).issubset(set(merged_var[k])) for k in dict3.keys()] ) )
def test_dedup_unhashable(self): """ Lists with unhashable elements get deduped. This is too hairy to test with properties, because... it's inneficient to dup-check lists of unhashable things :) """ task_args = { 'suffix_to_merge': 'whatever__to_merge', 'merged_var_name': 'merged_var', 'dedup': True, 'expected_type': 'list', } task_vars = { 'var1_whatever__to_merge': [ {'subvar_b': 2}, {'subvar_c': 3}, ], 'var2_whatever__to_merge': [ {'subvar_a': 1}, {'subvar_b': 2}, ], } possibles = [ [{'subvar_b': 2}, {'subvar_c': 3}, {'subvar_a': 1}], [{'subvar_a': 1}, {'subvar_b': 2}, {'subvar_c': 3}], ] result = make_and_run_plugin(task_args=task_args, task_vars=task_vars) merged_var = result['ansible_facts']['merged_var'] self.assertTrue( any([merged_var == x for x in possibles]) )
def test_returns_unchanged(self): """Execution returns 'unchanged' status in ansible""" task_args = { 'suffix_to_merge': 'whatever__to_merge', 'merged_var_name': 'merged_var', 'expected_type': 'list', } result = make_and_run_plugin(task_args=task_args, task_vars={}) self.assertFalse(result['changed'])
def test_list_returns_empty_list(self): task_args = { 'suffix_to_merge': 'whatever__to_merge', 'merged_var_name': 'merged_var', 'expected_type': 'list', } expected = {'merged_var': []} result = make_and_run_plugin(task_args=task_args, task_vars={}) self.assertEqual(result['ansible_facts'], expected)
def test_dedup_dedups(self, list1, list2, list3): task_args = { 'suffix_to_merge': 'whatever__to_merge', 'merged_var_name': 'merged_var', 'expected_type': 'list', } task_vars = { 'var1_whatever__to_merge': list1, 'var2_whatever__to_merge': list2, 'var3_whatever__to_merge': list3, } result = make_and_run_plugin(task_args=task_args, task_vars=task_vars) merged_var = result['ansible_facts']['merged_var'] self.assertTrue(len(merged_var) == len(set(merged_var)))
def test_render_jinja(self): task_args = { 'suffix_to_merge': 'whatever__to_merge', 'merged_var_name': 'merged_var', 'expected_type': 'list', } task_vars = { 'some_var': 'woohoo', 'some_other_var': 'bar', 'var1_whatever__to_merge': ['{{ some_var }}'], 'var2_whatever__to_merge': ['foo{{ some_other_var }}'] } result = make_and_run_plugin(task_args=task_args, task_vars=task_vars) merged_var = result['ansible_facts']['merged_var'] self.assertEqual(merged_var, [u'woohoo', u'foobar'])
def test_merge_dicts(self, dict1, dict2, dict3): task_args = { 'suffix_to_merge': 'whatever__to_merge', 'merged_var_name': 'merged_var', 'expected_type': 'dict', } task_vars = { 'var1_whatever__to_merge': dict1, 'var2_whatever__to_merge': dict2, 'var3_whatever__to_merge': dict3, } expected = merge_dicts([dict1, dict2, dict3]) result = make_and_run_plugin(task_args=task_args, task_vars=task_vars) merged_var = result['ansible_facts']['merged_var'] self.assertEqual(merged_var, expected)
def test_render_complex_jinja(self): task_args = { 'suffix_to_merge': 'whatever__to_merge', 'merged_var_name': 'merged_var', 'expected_type': 'dict', 'recursive_dict_merge': True, } task_vars = { 'some_var': '{{ {1: 1, 2: 2} }}', 'some_other_var': '{{ {3:3} }}', 'var1_whatever__to_merge': {'foo': '{{ some_var }}'}, 'var2_whatever__to_merge': {'foo': '{{ some_other_var }}'}, } result = make_and_run_plugin(task_args=task_args, task_vars=task_vars) merged_var = result['ansible_facts']['merged_var'] expected = {'foo': {1: 1, 2: 2, 3: 3}} self.assertEqual(expected, merged_var)
def test_dedup_includes_all_vals(self, list1, list2, list3): task_args = { 'suffix_to_merge': 'whatever__to_merge', 'merged_var_name': 'merged_var', 'expected_type': 'list', } task_vars = { 'var1_whatever__to_merge': list1, 'var2_whatever__to_merge': list2, 'var3_whatever__to_merge': list3, } result = make_and_run_plugin(task_args=task_args, task_vars=task_vars) merged_var_set = set(result['ansible_facts']['merged_var']) list_set = set(list1 + list2 + list3) self.assertEqual(merged_var_set, list_set)
def test_merge_lists_no_dedup(self, list1, list2, list3): task_args = { 'suffix_to_merge': 'whatever__to_merge', 'merged_var_name': 'merged_var', 'dedup': False, 'expected_type': 'list', } task_vars = { 'var1_whatever__to_merge': list1, 'var2_whatever__to_merge': list2, 'var3_whatever__to_merge': list3, } result = make_and_run_plugin(task_args=task_args, task_vars=task_vars) merged_var = result['ansible_facts']['merged_var'] self.assertEqual( merged_var, list1 + list2 + list3 )
def test_merge_dicts(self, dict1, dict2, dict3): task_args = { 'suffix_to_merge': 'whatever__to_merge', 'merged_var_name': 'merged_var', 'expected_type': 'dict', } task_vars = { 'var1_whatever__to_merge': dict1, 'var2_whatever__to_merge': dict2, 'var3_whatever__to_merge': dict3, } possibles = [ merge_dicts([x, y, z]) for x, y, z in permutations([dict1, dict2, dict3]) ] result = make_and_run_plugin(task_args=task_args, task_vars=task_vars) merged_var = result['ansible_facts']['merged_var'] self.assertTrue(any([merged_var == x for x in possibles]))
def test_render_nested_jinja(self): task_args = { 'suffix_to_merge': 'whatever__to_merge', 'merged_var_name': 'merged_var', 'expected_type': 'list', } task_vars = { 'some_var': 'woohoo', 'some_other_var': 'bar', 'yet_another_var': '{{ some_var }}-{{ some_other_var }}', 'var1_whatever__to_merge': ['{{ some_var }}'], 'var2_whatever__to_merge': [{'some_key': '{{ yet_another_var }}'}] } result = make_and_run_plugin(task_args=task_args, task_vars=task_vars) merged_var = result['ansible_facts']['merged_var'] self.assertEqual(len(merged_var), 2) self.assertIn('woohoo', merged_var) self.assertIn({'some_key': u'woohoo-bar'}, merged_var)
def test_merge_lists_no_dedup(self, list1, list2, list3): task_args = { 'suffix_to_merge': 'whatever__to_merge', 'merged_var_name': 'merged_var', 'dedup': False, 'expected_type': 'list', } task_vars = { 'var1_whatever__to_merge': list1, 'var2_whatever__to_merge': list2, 'var3_whatever__to_merge': list3, } result = make_and_run_plugin(task_args=task_args, task_vars=task_vars) merged_var = result['ansible_facts']['merged_var'] possibles = [ x + y + z for x, y, z in permutations([list1, list2, list3]) ] self.assertTrue(any([merged_var == x for x in possibles]))