From 2634ef955ac2c7779503caba5fc4ca9c94ddc228 Mon Sep 17 00:00:00 2001 From: Dag Wieers Date: Fri, 25 Aug 2017 02:07:58 +0200 Subject: [PATCH] xml module: Better change detection, improved tests (#28460) This PR includes: - Improvements to change-detection by comparing 2 objectified XML trees - Implement better integration tests by comparing 2 files using copy --- lib/ansible/modules/files/xml.py | 96 +++++++------- test/integration/targets/xml/tasks/main.yml | 59 +++++---- .../test-add-children-elements-unicode.yml | 20 ++- .../xml/tasks/test-add-children-elements.yml | 20 ++- .../test-add-children-from-groupvars.yml | 20 ++- ...t-add-children-with-attributes-unicode.yml | 24 +++- .../test-add-children-with-attributes.yml | 27 +++- .../xml/tasks/test-add-element-implicitly.yml | 124 +++++++++++++----- .../test-add-namespaced-children-elements.yml | 20 ++- .../xml/tasks/test-children-elements-xml.yml | 20 ++- .../targets/xml/tasks/test-count-unicode.yml | 12 +- .../targets/xml/tasks/test-count.yml | 12 +- .../test-get-element-content-unicode.yml | 21 ++- .../xml/tasks/test-get-element-content.yml | 21 ++- .../test-mutually-exclusive-attributes.yml | 15 ++- .../xml/tasks/test-pretty-print-only.yml | 18 ++- .../targets/xml/tasks/test-pretty-print.yml | 22 +++- .../xml/tasks/test-remove-attribute.yml | 20 ++- .../targets/xml/tasks/test-remove-element.yml | 20 ++- .../test-remove-namespaced-attribute.yml | 20 ++- .../tasks/test-remove-namespaced-element.yml | 20 ++- .../test-set-attribute-value-unicode.yml | 21 ++- .../xml/tasks/test-set-attribute-value.yml | 21 ++- .../test-set-children-elements-level.yml | 71 +++++----- .../test-set-children-elements-unicode.yml | 51 ++++--- .../xml/tasks/test-set-children-elements.yml | 50 +++++-- .../tasks/test-set-element-value-empty.yml | 20 ++- .../tasks/test-set-element-value-unicode.yml | 28 ++-- .../xml/tasks/test-set-element-value.yml | 30 +++-- .../test-set-namespaced-attribute-value.yml | 21 ++- .../test-set-namespaced-children-elements.yml | 54 ++++++++ .../test-set-namespaced-element-value.yml | 25 ++-- .../targets/xml/tasks/test-xmlstring.yml | 69 ++++++++-- 33 files changed, 799 insertions(+), 293 deletions(-) create mode 100644 test/integration/targets/xml/tasks/test-set-namespaced-children-elements.yml diff --git a/lib/ansible/modules/files/xml.py b/lib/ansible/modules/files/xml.py index 4c4a83b0cd7..0712fe38053 100644 --- a/lib/ansible/modules/files/xml.py +++ b/lib/ansible/modules/files/xml.py @@ -21,7 +21,8 @@ module: xml short_description: Manage bits and pieces of XML files or strings description: - A CRUD-like interface to managing bits of XML files. -- You might also be interested in a brief tutorial from U(http://www.w3schools.com/xpath/). +- You might also be interested in a brief tutorial from U(http://www.w3schools.com/xpath/) + and U(https://developer.mozilla.org/en-US/docs/Web/XPath). version_added: '2.4' options: path: @@ -101,6 +102,7 @@ requirements: - lxml >= 2.3.0 notes: - Use the C(--check) and C(--diff) options when testing your expressions. +- The diff output is automatically pretty-printed, so may not reflect the actual file content, only the file structure. - This module does not handle complicated xpath expressions, so limit xpath selectors to simple expressions. - Beware that in case your XML elements are namespaced, you need to use the C(namespaces) parameter. - Namespaces prefix should be used for all children of an element where namespace is defined, unless another namespace is defined for them. @@ -233,7 +235,7 @@ from distutils.version import LooseVersion from io import BytesIO try: - from lxml import etree + from lxml import etree, objectify HAS_LXML = True except ImportError: HAS_LXML = False @@ -256,6 +258,12 @@ _RE_SPLITSUBLAST = re.compile("^(.*)/(" + _NSIDENT + ")\\[(.*)\\]$") _RE_SPLITONLYEQVALUE = re.compile("^(.*)/text\\(\\)=" + _XPSTR + "$") +def has_changed(doc): + orig_obj = etree.tostring(objectify.fromstring(etree.tostring(orig_doc))) + obj = etree.tostring(objectify.fromstring(etree.tostring(doc))) + return (orig_obj != obj) + + def do_print_match(module, tree, xpath, namespaces): match = tree.xpath(xpath, namespaces=namespaces) match_xpaths = [] @@ -535,34 +543,6 @@ def set_target(module, tree, xpath, namespaces, attribute, value): finish(module, tree, xpath, namespaces, changed) -def pretty(module, tree): - xml_string = etree.tostring(tree, xml_declaration=True, encoding='UTF-8', pretty_print=module.params['pretty_print']) - - result = dict( - changed=False, - ) - - if module.params['path']: - xml_file = module.params['path'] - xml_content = open(xml_file) - try: - if xml_string != xml_content.read(): - result['changed'] = True - if not module.check_mode: - if module.params['backup']: - result['backup_file'] = module.backup_local(module.params['path']) - tree.write(xml_file, xml_declaration=True, encoding='UTF-8', pretty_print=module.params['pretty_print']) - finally: - xml_content.close() - - elif module.params['xmlstring']: - result['xmlstring'] = xml_string - if xml_string != module.params['xmlstring']: - result['changed'] = True - - module.exit_json(**result) - - def get_element_text(module, tree, xpath, namespaces): if not is_node(tree, xpath, namespaces): module.fail_json(msg="Xpath %s does not reference a node!" % xpath) @@ -633,27 +613,56 @@ def children_to_nodes(module=None, children=[], type='yaml'): return [child_to_element(module, child, type) for child in children] +def pretty(module, tree): + xml_string = etree.tostring(tree, xml_declaration=True, encoding='UTF-8', pretty_print=module.params['pretty_print']) + + result = dict( + changed=False, + ) + + if module.params['path']: + xml_file = module.params['path'] + xml_content = open(xml_file) + try: + if xml_string != xml_content.read(): + result['changed'] = True + if not module.check_mode: + if module.params['backup']: + result['backup_file'] = module.backup_local(module.params['path']) + tree.write(xml_file, xml_declaration=True, encoding='UTF-8', pretty_print=module.params['pretty_print']) + finally: + xml_content.close() + + elif module.params['xmlstring']: + result['xmlstring'] = xml_string + # NOTE: Modifying a string is not considered a change ! + if xml_string != module.params['xmlstring']: + result['changed'] = True + + module.exit_json(**result) + + def finish(module, tree, xpath, namespaces, changed=False, msg="", hitcount=0, matches=tuple()): result = dict( actions=dict(xpath=xpath, namespaces=namespaces, state=module.params['state']), - changed=changed, + changed=has_changed(tree), count=hitcount, matches=matches, msg=msg, ) - if changed and module._diff: - result['diff'] = dict( - before=etree.tostring(orig_doc, xml_declaration=True, encoding='UTF-8', pretty_print=module.params['pretty_print']), - after=etree.tostring(tree, xml_declaration=True, encoding='UTF-8', pretty_print=module.params['pretty_print']), - ) - - if module.params['path'] and not module.check_mode: - if module.params['backup']: - result['backup_file'] = module.backup_local(module.params['path']) + if result['changed']: + if module._diff: + result['diff'] = dict( + before=etree.tostring(orig_doc, xml_declaration=True, encoding='UTF-8', pretty_print=True), + after=etree.tostring(tree, xml_declaration=True, encoding='UTF-8', pretty_print=True), + ) - tree.write(module.params['path'], xml_declaration=True, encoding='UTF-8', pretty_print=module.params['pretty_print']) + if module.params['path'] and not module.check_mode: + if module.params['backup']: + result['backup_file'] = module.backup_local(module.params['path']) + tree.write(module.params['path'], xml_declaration=True, encoding='UTF-8', pretty_print=module.params['pretty_print']) if module.params['xmlstring']: result['xmlstring'] = etree.tostring(tree, xml_declaration=True, encoding='UTF-8', pretty_print=module.params['pretty_print']) @@ -741,9 +750,8 @@ def main(): module.fail_json(msg="Error while parsing document: %s (%s)" % (xml_file or 'xml_string', e)) # Ensure we have the original copy to compare - if module._diff: - global orig_doc - orig_doc = copy.deepcopy(doc) + global orig_doc + orig_doc = copy.deepcopy(doc) if print_match: do_print_match(module, doc, xpath, namespaces) diff --git a/test/integration/targets/xml/tasks/main.yml b/test/integration/targets/xml/tasks/main.yml index e189c558139..e992990a28b 100644 --- a/test/integration/targets/xml/tasks/main.yml +++ b/test/integration/targets/xml/tasks/main.yml @@ -35,34 +35,35 @@ when: lxml_xpath_attribute_result_attrname block: - - include: test-add-children-elements.yml - - include: test-add-children-from-groupvars.yml - - include: test-add-children-with-attributes.yml - - include: test-add-element-implicitly.yml - - include: test-count.yml - - include: test-mutually-exclusive-attributes.yml - - include: test-remove-attribute.yml - - include: test-remove-element.yml - - include: test-set-attribute-value.yml - - include: test-set-children-elements.yml - - include: test-set-children-elements-level.yml - - include: test-set-element-value.yml - - include: test-set-element-value-empty.yml - - include: test-pretty-print.yml - - include: test-pretty-print-only.yml - - include: test-add-namespaced-children-elements.yml - - include: test-remove-namespaced-attribute.yml - - include: test-set-namespaced-attribute-value.yml - - include: test-set-namespaced-element-value.yml - - include: test-get-element-content.yml - - include: test-xmlstring.yml - - include: test-children-elements-xml.yml + - include_tasks: test-add-children-elements.yml + - include_tasks: test-add-children-from-groupvars.yml + - include_tasks: test-add-children-with-attributes.yml + - include_tasks: test-add-element-implicitly.yml + - include_tasks: test-count.yml + - include_tasks: test-mutually-exclusive-attributes.yml + - include_tasks: test-remove-attribute.yml + - include_tasks: test-remove-element.yml + - include_tasks: test-set-attribute-value.yml + - include_tasks: test-set-children-elements.yml + - include_tasks: test-set-children-elements-level.yml + - include_tasks: test-set-element-value.yml + - include_tasks: test-set-element-value-empty.yml + - include_tasks: test-pretty-print.yml + - include_tasks: test-pretty-print-only.yml + - include_tasks: test-add-namespaced-children-elements.yml + - include_tasks: test-remove-namespaced-attribute.yml + - include_tasks: test-set-namespaced-attribute-value.yml + - include_tasks: test-set-namespaced-element-value.yml + - include_tasks: test-set-namespaced-children-elements.yml + - include_tasks: test-get-element-content.yml + - include_tasks: test-xmlstring.yml + - include_tasks: test-children-elements-xml.yml # Unicode tests - - include: test-add-children-elements-unicode.yml - - include: test-add-children-with-attributes-unicode.yml - - include: test-set-attribute-value-unicode.yml - - include: test-count-unicode.yml - - include: test-get-element-content.yml - - include: test-set-children-elements-unicode.yml - - include: test-set-element-value-unicode.yml + - include_tasks: test-add-children-elements-unicode.yml + - include_tasks: test-add-children-with-attributes-unicode.yml + - include_tasks: test-set-attribute-value-unicode.yml + - include_tasks: test-count-unicode.yml + - include_tasks: test-get-element-content.yml + - include_tasks: test-set-children-elements-unicode.yml + - include_tasks: test-set-element-value-unicode.yml diff --git a/test/integration/targets/xml/tasks/test-add-children-elements-unicode.yml b/test/integration/targets/xml/tasks/test-add-children-elements-unicode.yml index 59c688c9150..8ad91501c38 100644 --- a/test/integration/targets/xml/tasks/test-add-children-elements-unicode.yml +++ b/test/integration/targets/xml/tasks/test-add-children-elements-unicode.yml @@ -1,15 +1,29 @@ --- - name: Setup test fixture copy: - src: '{{ role_path }}/fixtures/ansible-xml-beers.xml' + src: fixtures/ansible-xml-beers.xml dest: /tmp/ansible-xml-beers.xml + - name: Add child element xml: path: /tmp/ansible-xml-beers.xml xpath: /business/beers add_children: - - beer: "Окское" + - beer: Окское + register: add_children_elements_unicode + + - name: Compare to expected result + copy: + src: results/test-add-children-elements-unicode.xml + dest: /tmp/ansible-xml-beers.xml + check_mode: yes + diff: yes + register: comparison - name: Test expected result - command: diff -u {{ role_path }}/results/test-add-children-elements-unicode.xml /tmp/ansible-xml-beers.xml + assert: + that: + - add_children_elements_unicode.changed == true + - comparison.changed == false # identical + #command: diff -u {{ role_path }}/results/test-add-children-elements-unicode.xml /tmp/ansible-xml-beers.xml diff --git a/test/integration/targets/xml/tasks/test-add-children-elements.yml b/test/integration/targets/xml/tasks/test-add-children-elements.yml index 1f9d02629bf..8d9b06866d8 100644 --- a/test/integration/targets/xml/tasks/test-add-children-elements.yml +++ b/test/integration/targets/xml/tasks/test-add-children-elements.yml @@ -1,15 +1,29 @@ --- - name: Setup test fixture copy: - src: '{{ role_path }}/fixtures/ansible-xml-beers.xml' + src: fixtures/ansible-xml-beers.xml dest: /tmp/ansible-xml-beers.xml + - name: Add child element xml: path: /tmp/ansible-xml-beers.xml xpath: /business/beers add_children: - - beer: "Old Rasputin" + - beer: Old Rasputin + register: add_children_elements + + - name: Compare to expected result + copy: + src: results/test-add-children-elements.xml + dest: /tmp/ansible-xml-beers.xml + check_mode: yes + diff: yes + register: comparison - name: Test expected result - command: diff -u {{ role_path }}/results/test-add-children-elements.xml /tmp/ansible-xml-beers.xml + assert: + that: + - add_children_elements.changed == true + - comparison.changed == false # identical + #command: diff -u {{ role_path }}/results/test-add-children-elements.xml /tmp/ansible-xml-beers.xml diff --git a/test/integration/targets/xml/tasks/test-add-children-from-groupvars.yml b/test/integration/targets/xml/tasks/test-add-children-from-groupvars.yml index a5142773419..e062de8d149 100644 --- a/test/integration/targets/xml/tasks/test-add-children-from-groupvars.yml +++ b/test/integration/targets/xml/tasks/test-add-children-from-groupvars.yml @@ -1,14 +1,28 @@ --- - name: Setup test fixture copy: - src: '{{ role_path }}/fixtures/ansible-xml-beers.xml' + src: fixtures/ansible-xml-beers.xml dest: /tmp/ansible-xml-beers.xml + - name: Add child element xml: path: /tmp/ansible-xml-beers.xml xpath: /business/beers - add_children: "{{ bad_beers }}" + add_children: '{{ bad_beers }}' + register: add_children_from_groupvars + + - name: Compare to expected result + copy: + src: results/test-add-children-from-groupvars.xml + dest: /tmp/ansible-xml-beers.xml + check_mode: yes + diff: yes + register: comparison - name: Test expected result - command: diff -u {{ role_path }}/results/test-add-children-from-groupvars.xml /tmp/ansible-xml-beers.xml + assert: + that: + - add_children_from_groupvars.changed == true + - comparison.changed == false # identical + #command: diff -u {{ role_path }}/results/test-add-children-from-groupvars.xml /tmp/ansible-xml-beers.xml diff --git a/test/integration/targets/xml/tasks/test-add-children-with-attributes-unicode.yml b/test/integration/targets/xml/tasks/test-add-children-with-attributes-unicode.yml index 9696543818e..d4a2329f69e 100644 --- a/test/integration/targets/xml/tasks/test-add-children-with-attributes-unicode.yml +++ b/test/integration/targets/xml/tasks/test-add-children-with-attributes-unicode.yml @@ -1,17 +1,31 @@ --- - name: Setup test fixture copy: - src: '{{ role_path }}/fixtures/ansible-xml-beers.xml' + src: fixtures/ansible-xml-beers.xml dest: /tmp/ansible-xml-beers.xml + - name: Add child element xml: path: /tmp/ansible-xml-beers.xml xpath: /business/beers add_children: - - beer: - name: Окское - type: экстра + - beer: + name: Окское + type: экстра + register: add_children_with_attributes_unicode + + - name: Compare to expected result + copy: + src: results/test-add-children-with-attributes-unicode.xml + dest: /tmp/ansible-xml-beers.xml + check_mode: yes + diff: yes + register: comparison - name: Test expected result - command: diff -u {{ role_path }}/results/test-add-children-with-attributes-unicode.xml /tmp/ansible-xml-beers.xml + assert: + that: + - add_children_with_attributes_unicode.changed == true + - comparison.changed == false # identical + #command: diff -u {{ role_path }}/results/test-add-children-with-attributes-unicode.xml /tmp/ansible-xml-beers.xml diff --git a/test/integration/targets/xml/tasks/test-add-children-with-attributes.yml b/test/integration/targets/xml/tasks/test-add-children-with-attributes.yml index 11e6af97140..91e92637fc2 100644 --- a/test/integration/targets/xml/tasks/test-add-children-with-attributes.yml +++ b/test/integration/targets/xml/tasks/test-add-children-with-attributes.yml @@ -1,22 +1,35 @@ --- - name: Setup test fixture copy: - src: '{{ role_path }}/fixtures/ansible-xml-beers.xml' + src: fixtures/ansible-xml-beers.xml dest: /tmp/ansible-xml-beers.xml + - name: Add child element xml: path: /tmp/ansible-xml-beers.xml xpath: /business/beers add_children: - - beer: - name: Ansible Brew - type: light + - beer: + name: Ansible Brew + type: light + register: add_children_with_attributes + + - name: Compare to expected result + copy: + src: results/test-add-children-with-attributes.xml + dest: /tmp/ansible-xml-beers.xml + check_mode: yes + diff: yes + register: comparison # NOTE: This test may fail if lxml does not support predictable element attribute order # So we filter the failure out for these platforms (e.g. CentOS 6) # The module still works fine, we simply are not comparing as smart as we should. - name: Test expected result - command: diff -u {{ role_path }}/results/test-add-children-with-attributes.xml /tmp/ansible-xml-beers.xml - register: diff - failed_when: diff.rc != 0 and lxml_predictable_attribute_order + assert: + that: + - add_children_with_attributes.changed == true + - comparison.changed == false # identical + when: lxml_predictable_attribute_order + #command: diff -u {{ role_path }}/results/test-add-children-with-attributes.xml /tmp/ansible-xml-beers.xml diff --git a/test/integration/targets/xml/tasks/test-add-element-implicitly.yml b/test/integration/targets/xml/tasks/test-add-element-implicitly.yml index 0ef714ee197..db674ba4fc0 100644 --- a/test/integration/targets/xml/tasks/test-add-element-implicitly.yml +++ b/test/integration/targets/xml/tasks/test-add-element-implicitly.yml @@ -1,62 +1,118 @@ --- - name: Setup test fixture - copy: src={{ role_path }}/fixtures/ansible-xml-beers.xml dest=/tmp/ansible-xml-beers-implicit.xml + copy: + src: fixtures/ansible-xml-beers.xml + dest: /tmp/ansible-xml-beers-implicit.xml + - name: Add a phonenumber element to the business element. Implicit mkdir -p behavior where applicable - xml: file=/tmp/ansible-xml-beers-implicit.xml xpath=/business/phonenumber value=555-555-1234 + xml: + file: /tmp/ansible-xml-beers-implicit.xml + xpath: /business/phonenumber + value: 555-555-1234 - name: Add a owner element to the business element, testing implicit mkdir -p behavior 1/2 - xml: file=/tmp/ansible-xml-beers-implicit.xml xpath=/business/owner/name/last value=Smith + xml: + file: /tmp/ansible-xml-beers-implicit.xml + xpath: /business/owner/name/last + value: Smith - name: Add a owner element to the business element, testing implicit mkdir -p behavior 2/2 - xml: file=/tmp/ansible-xml-beers-implicit.xml xpath=/business/owner/name/first value=John + xml: + file: /tmp/ansible-xml-beers-implicit.xml + xpath: /business/owner/name/first + value: John - name: Add a validxhtml element to the website element. Note that ensure is present by default and while value defaults to null for elements, if one doesn't specify it we don't know what to do. - xml: file=/tmp/ansible-xml-beers-implicit.xml xpath=/business/website/validxhtml + xml: + file: /tmp/ansible-xml-beers-implicit.xml + xpath: /business/website/validxhtml - name: Add an empty validateon attribute to the validxhtml element. This actually makes the previous example redundant because of the implicit parent-node creation behavior. - xml: file=/tmp/ansible-xml-beers-implicit.xml xpath=/business/website/validxhtml/@validateon + xml: + file: /tmp/ansible-xml-beers-implicit.xml + xpath: /business/website/validxhtml/@validateon - name: Add an empty validateon attribute to the validxhtml element. Actually verifies the implicit parent-node creation behavior. - xml: file=/tmp/ansible-xml-beers-implicit.xml xpath=/business/website_bis/validxhtml/@validateon + xml: + file: /tmp/ansible-xml-beers-implicit.xml + xpath: /business/website_bis/validxhtml/@validateon - name: Add an attribute with a value - xml: file=/tmp/ansible-xml-beers-implicit.xml xpath=/business/owner/@dob='1976-04-12' + xml: + file: /tmp/ansible-xml-beers-implicit.xml + xpath: /business/owner/@dob='1976-04-12' - name: Add an element with a value, alternate syntax - xml: file=/tmp/ansible-xml-beers-implicit.xml xpath="/business/beers/beer/text()=\"George Killian's Irish Red\"" # note the quote within an XPath string thing + xml: + file: /tmp/ansible-xml-beers-implicit.xml + xpath: /business/beers/beer/text()="George Killian's Irish Red" # note the quote within an XPath string thing - name: Add an element without special characters - xml: file=/tmp/ansible-xml-beers-implicit.xml xpath=/business/testnormalelement value="xml tag with no special characters" pretty_print=true + xml: + file: /tmp/ansible-xml-beers-implicit.xml + xpath: /business/testnormalelement + value: xml tag with no special characters + pretty_print: yes - name: Add an element with dash - xml: file=/tmp/ansible-xml-beers-implicit.xml xpath=/business/test-with-dash value="xml tag with dashes" pretty_print=true + xml: + file: /tmp/ansible-xml-beers-implicit.xml + xpath: /business/test-with-dash + value: xml tag with dashes + pretty_print: yes - name: Add an element with dot - xml: file=/tmp/ansible-xml-beers-implicit.xml xpath=/business/test-with-dash.and.dot value="xml tag with dashes and dots" pretty_print=true + xml: + file: /tmp/ansible-xml-beers-implicit.xml + xpath: /business/test-with-dash.and.dot + value: xml tag with dashes and dots + pretty_print: yes - name: Add an element with underscore - xml: file=/tmp/ansible-xml-beers-implicit.xml xpath=/business/test-with.dash_and.dot_and-underscores value="xml tag with dashes, dots and underscores" pretty_print=true + xml: + file: /tmp/ansible-xml-beers-implicit.xml + xpath: /business/test-with.dash_and.dot_and-underscores + value: xml tag with dashes, dots and underscores + pretty_print: yes - name: Add an attribute on a conditional element - xml: file=/tmp/ansible-xml-beers-implicit.xml xpath="/business/beers/beer[text()=\"George Killian's Irish Red\"]/@color='red'" + xml: + file: /tmp/ansible-xml-beers-implicit.xml + xpath: /business/beers/beer[text()="George Killian's Irish Red"]/@color='red' - name: Add two attributes on a conditional element - xml: file=/tmp/ansible-xml-beers-implicit.xml xpath="/business/beers/beer[text()=\"Pilsner Urquell\" and @origin='CZ']/@color='blonde'" + xml: + file: /tmp/ansible-xml-beers-implicit.xml + xpath: /business/beers/beer[text()="Pilsner Urquell" and @origin='CZ']/@color='blonde' - name: Add a owner element to the business element, testing implicit mkdir -p behavior 3/2 -- complex lookup - xml: file=/tmp/ansible-xml-beers-implicit.xml xpath=/business/owner/name[first/text()='John']/middle value=Q + xml: + file: /tmp/ansible-xml-beers-implicit.xml + xpath: /business/owner/name[first/text()='John']/middle + value: Q - name: Pretty Print this! - xml: file=/tmp/ansible-xml-beers-implicit.xml pretty_print=True + xml: + file: /tmp/ansible-xml-beers-implicit.xml + pretty_print: yes + +- name: Compare to expected result + copy: + src: results/test-add-element-implicitly.yml + dest: /tmp/ansible-xml-beers-implicit.xml + check_mode: yes + diff: yes + register: comparison - name: Test expected result - command: diff -u {{ role_path }}/results/test-add-element-implicitly.yml /tmp/ansible-xml-beers-implicit.xml + assert: + that: + - comparison.changed == false # identical + #command: diff -u {{ role_path }}/results/test-add-element-implicitly.yml /tmp/ansible-xml-beers-implicit.xml -# -# Now we repeat the same, just to ensure proper use of namespaces -# +# Now we repeat the same, just to ensure proper use of namespaces - name: Add a phonenumber element to the business element. Implicit mkdir -p behavior where applicable xml: file: /tmp/ansible-xml-beers-implicit.xml @@ -112,21 +168,21 @@ - name: Add an element with a value, alternate syntax xml: file: /tmp/ansible-xml-beers-implicit.xml - xpath: "/business/a:beers/a:beer/text()=\"George Killian's Irish Red\"" # note the quote within an XPath string thing + xpath: /business/a:beers/a:beer/text()="George Killian's Irish Red" # note the quote within an XPath string thing namespaces: a: http://example.com/some/namespace - name: Add an attribute on a conditional element xml: file: /tmp/ansible-xml-beers-implicit.xml - xpath: "/business/a:beers/a:beer[text()=\"George Killian's Irish Red\"]/@a:color='red'" + xpath: /business/a:beers/a:beer[text()="George Killian's Irish Red"]/@a:color='red' namespaces: a: http://example.com/some/namespace - name: Add two attributes on a conditional element xml: file: /tmp/ansible-xml-beers-implicit.xml - xpath: "/business/a:beers/a:beer[text()=\"Pilsner Urquell\" and @a:origin='CZ']/@a:color='blonde'" + xpath: /business/a:beers/a:beer[text()="Pilsner Urquell" and @a:origin='CZ']/@a:color='blonde' namespaces: a: http://example.com/some/namespace @@ -142,8 +198,8 @@ xml: file: /tmp/ansible-xml-beers-implicit.xml xpath: /business/testnormalelement - value: "xml tag with no special characters" - pretty_print: true + value: xml tag with no special characters + pretty_print: yes namespaces: a: http://example.com/some/namespace @@ -152,8 +208,8 @@ xml: file: /tmp/ansible-xml-beers-implicit.xml xpath: /business/test-with-dash - value: "xml tag with dashes" - pretty_print: true + value: xml tag with dashes + pretty_print: yes namespaces: a: http://example.com/some/namespace @@ -161,8 +217,8 @@ xml: file: /tmp/ansible-xml-beers-implicit.xml xpath: /business/test-with-dash.and.dot - value: "xml tag with dashes and dots" - pretty_print: true + value: xml tag with dashes and dots + pretty_print: yes namespaces: a: http://example.com/some/namespace @@ -170,10 +226,12 @@ xml: file: /tmp/ansible-xml-beers-implicit.xml xpath: /business/test-with.dash_and.dot_and-underscores - value: "xml tag with dashes, dots and underscores" - pretty_print: true + value: xml tag with dashes, dots and underscores + pretty_print: yes namespaces: a: http://example.com/some/namespace - name: Pretty Print this! - xml: file=/tmp/ansible-xml-beers-implicit.xml pretty_print=True + xml: + file: /tmp/ansible-xml-beers-implicit.xml + pretty_print: yes diff --git a/test/integration/targets/xml/tasks/test-add-namespaced-children-elements.yml b/test/integration/targets/xml/tasks/test-add-namespaced-children-elements.yml index 09974c8e796..25eca47f5b1 100644 --- a/test/integration/targets/xml/tasks/test-add-namespaced-children-elements.yml +++ b/test/integration/targets/xml/tasks/test-add-namespaced-children-elements.yml @@ -1,9 +1,10 @@ --- - name: Setup test fixture copy: - src: '{{ role_path }}/fixtures/ansible-xml-namespaced-beers.xml' + src: fixtures/ansible-xml-namespaced-beers.xml dest: /tmp/ansible-xml-namespaced-beers.xml + - name: Add namespaced child element xml: path: /tmp/ansible-xml-namespaced-beers.xml @@ -12,7 +13,20 @@ bus: http://test.business ber: http://test.beers add_children: - - beer: "Old Rasputin" + - beer: Old Rasputin + register: add_namespaced_children_elements + + - name: Compare to expected result + copy: + src: results/test-add-namespaced-children-elements.xml + dest: /tmp/ansible-xml-namespaced-beers.xml + check_mode: yes + diff: yes + register: comparison - name: Test expected result - command: diff -u {{ role_path }}/results/test-add-namespaced-children-elements.xml /tmp/ansible-xml-namespaced-beers.xml + assert: + that: + - add_namespaced_children_elements.changed == true + - comparison.changed == false # identical + #command: diff -u {{ role_path }}/results/test-add-namespaced-children-elements.xml /tmp/ansible-xml-namespaced-beers.xml diff --git a/test/integration/targets/xml/tasks/test-children-elements-xml.yml b/test/integration/targets/xml/tasks/test-children-elements-xml.yml index 4350bcaab6b..f4a3c3d582b 100644 --- a/test/integration/targets/xml/tasks/test-children-elements-xml.yml +++ b/test/integration/targets/xml/tasks/test-children-elements-xml.yml @@ -1,16 +1,30 @@ --- - name: Setup test fixture copy: - src: '{{ role_path }}/fixtures/ansible-xml-beers.xml' + src: fixtures/ansible-xml-beers.xml dest: /tmp/ansible-xml-beers.xml + - name: Add child element with xml format xml: path: /tmp/ansible-xml-beers.xml xpath: /business/beers input_type: xml add_children: - - "Old Rasputin" + - 'Old Rasputin' + register: children_elements + + - name: Compare to expected result + copy: + src: results/test-add-children-elements.xml + dest: /tmp/ansible-xml-beers.xml + check_mode: yes + diff: yes· + register: comparison - name: Test expected result - command: diff -u {{ role_path }}/results/test-add-children-elements.xml /tmp/ansible-xml-beers.xml + assert: + that: + - children_elements.changed == true + - comparison.changed == false # identical + #command: diff -u {{ role_path }}/results/test-add-children-elements.xml /tmp/ansible-xml-beers.xml diff --git a/test/integration/targets/xml/tasks/test-count-unicode.yml b/test/integration/targets/xml/tasks/test-count-unicode.yml index 17444f4ff42..47a806bf98a 100644 --- a/test/integration/targets/xml/tasks/test-count-unicode.yml +++ b/test/integration/targets/xml/tasks/test-count-unicode.yml @@ -1,13 +1,19 @@ --- - name: Setup test fixture copy: - src: '{{ role_path }}/fixtures/ansible-xml-beers-unicode.xml' + src: fixtures/ansible-xml-beers-unicode.xml dest: /tmp/ansible-xml-beers-unicode.xml + - name: Count child element xml: path: /tmp/ansible-xml-beers-unicode.xml xpath: /business/beers/beer - count: true + count: yes register: beers - failed_when: beers.count != 2 + + - name: Test expected result + assert: + that: + - beers.changed == false + - beers.count == 2 diff --git a/test/integration/targets/xml/tasks/test-count.yml b/test/integration/targets/xml/tasks/test-count.yml index acaf8ff1ae5..cbc97e323c5 100644 --- a/test/integration/targets/xml/tasks/test-count.yml +++ b/test/integration/targets/xml/tasks/test-count.yml @@ -1,13 +1,19 @@ --- - name: Setup test fixture copy: - src: '{{ role_path }}/fixtures/ansible-xml-beers.xml' + src: fixtures/ansible-xml-beers.xml dest: /tmp/ansible-xml-beers.xml + - name: Add child element xml: path: /tmp/ansible-xml-beers.xml xpath: /business/beers/beer - count: true + count: yes register: beers - failed_when: beers.count != 3 + + - name: Test expected result + assert: + that: + - beers.changed == false + - beers.count == 3 diff --git a/test/integration/targets/xml/tasks/test-get-element-content-unicode.yml b/test/integration/targets/xml/tasks/test-get-element-content-unicode.yml index 0658c6c49f0..73ae96674fb 100644 --- a/test/integration/targets/xml/tasks/test-get-element-content-unicode.yml +++ b/test/integration/targets/xml/tasks/test-get-element-content-unicode.yml @@ -1,21 +1,32 @@ --- - name: Setup test fixture copy: - src: '{{ role_path }}/fixtures/ansible-xml-beers-unicode.xml' + src: fixtures/ansible-xml-beers-unicode.xml dest: /tmp/ansible-xml-beers-unicode.xml + - name: Get element attributes xml: path: /tmp/ansible-xml-beers-unicode.xml xpath: /business/rating - content: 'attribute' + content: attribute register: get_element_attribute - failed_when: get_element_attribute.matches[0]['rating'] is not defined or get_element_attribute.matches[0]['rating']['subjective'] != 'да' + + - name: Test expected result + assert: + that: + - get_element_attribute.changed == false + - get_element_attribute.matches[0]['rating'] is defined and get_element_attribute.matches[0]['rating']['subjective'] == 'да' - name: Get element text xml: path: /tmp/ansible-xml-beers-unicode.xml xpath: /business/rating - content: 'text' + content: text register: get_element_text - failed_when: get_element_text.matches[0]['rating'] != 'десять' + + - name: Test expected result + assert: + that: + - get_element_text.changed == false + - get_element_text.matches[0]['rating'] == 'десять' diff --git a/test/integration/targets/xml/tasks/test-get-element-content.yml b/test/integration/targets/xml/tasks/test-get-element-content.yml index 3546be00271..893003eec7b 100644 --- a/test/integration/targets/xml/tasks/test-get-element-content.yml +++ b/test/integration/targets/xml/tasks/test-get-element-content.yml @@ -1,21 +1,32 @@ --- - name: Setup test fixture copy: - src: '{{ role_path }}/fixtures/ansible-xml-beers.xml' + src: fixtures/ansible-xml-beers.xml dest: /tmp/ansible-xml-beers.xml + - name: Get element attributes xml: path: /tmp/ansible-xml-beers.xml xpath: /business/rating - content: 'attribute' + content: attribute register: get_element_attribute - failed_when: get_element_attribute.matches[0]['rating'] is not defined or get_element_attribute.matches[0]['rating']['subjective'] != 'true' + + - name: Test expected result + assert: + that: + - get_element_attribute.changed == false + - get_element_attribute.matches[0]['rating'] is defined and get_element_attribute.matches[0]['rating']['subjective'] == 'true' - name: Get element text xml: path: /tmp/ansible-xml-beers.xml xpath: /business/rating - content: 'text' + content: text register: get_element_text - failed_when: get_element_text.matches[0]['rating'] != '10' + + - name: Test expected result + assert: + that: + - get_element_text.changed == false + - get_element_text.matches[0]['rating'] == '10' diff --git a/test/integration/targets/xml/tasks/test-mutually-exclusive-attributes.yml b/test/integration/targets/xml/tasks/test-mutually-exclusive-attributes.yml index a3769f6902c..3f24b0ac840 100644 --- a/test/integration/targets/xml/tasks/test-mutually-exclusive-attributes.yml +++ b/test/integration/targets/xml/tasks/test-mutually-exclusive-attributes.yml @@ -1,15 +1,22 @@ --- - name: Setup test fixture copy: - src: '{{ role_path }}/fixtures/ansible-xml-beers.xml' + src: fixtures/ansible-xml-beers.xml dest: /tmp/ansible-xml-beers.xml + - name: Specify both children to add and a value xml: path: /tmp/ansible-xml-beers.xml add_children: - - child01 - - child02 + - child01 + - child02 value: conflict! register: module_output - failed_when: "module_output.failed == 'false'" + ignore_errors: yes + + - name: Test expected result + assert: + that: + - module_output.changed == false + - module_output.failed == true diff --git a/test/integration/targets/xml/tasks/test-pretty-print-only.yml b/test/integration/targets/xml/tasks/test-pretty-print-only.yml index cd8d52e0cfe..54511f2b0c9 100644 --- a/test/integration/targets/xml/tasks/test-pretty-print-only.yml +++ b/test/integration/targets/xml/tasks/test-pretty-print-only.yml @@ -2,10 +2,24 @@ - name: Setup test fixture shell: cat {{ role_path }}/fixtures/ansible-xml-beers.xml | sed 's/^[ ]*//g' > /tmp/ansible-xml-beers.xml + - name: Pretty print without modification xml: path: /tmp/ansible-xml-beers.xml - pretty_print: True + pretty_print: yes + register: pretty_print_only + + - name: Compare to expected result + copy: + src: results/test-pretty-print-only.xml + dest: /tmp/ansible-xml-beers.xml + check_mode: yes + diff: yes + register: comparison - name: Test expected result - command: diff -u {{ role_path }}/results/test-pretty-print-only.xml /tmp/ansible-xml-beers.xml + assert: + that: + - pretty_print_only.changed == true + - comparison.changed == false # identical + #command: diff -u {{ role_path }}/results/test-pretty-print-only.xml /tmp/ansible-xml-beers.xml diff --git a/test/integration/targets/xml/tasks/test-pretty-print.yml b/test/integration/targets/xml/tasks/test-pretty-print.yml index dd63f26a72f..88b618b25d9 100644 --- a/test/integration/targets/xml/tasks/test-pretty-print.yml +++ b/test/integration/targets/xml/tasks/test-pretty-print.yml @@ -1,16 +1,30 @@ --- - name: Setup test fixture copy: - src: '{{ role_path }}/fixtures/ansible-xml-beers.xml' + src: fixtures/ansible-xml-beers.xml dest: /tmp/ansible-xml-beers.xml + - name: Pretty print xml: path: /tmp/ansible-xml-beers.xml xpath: /business/beers - pretty_print: True + pretty_print: yes add_children: - - beer: "Old Rasputin" + - beer: Old Rasputin + register: pretty_print + + - name: Compare to expected result + copy: + src: results/test-pretty-print.xml + dest: /tmp/ansible-xml-beers.xml + check_mode: yes + diff: yes + register: comparison - name: Test expected result - command: diff -u {{ role_path }}/results/test-pretty-print.xml /tmp/ansible-xml-beers.xml + assert: + that: + - pretty_print.changed == true + - comparison.changed == false # identical + #command: diff -u {{ role_path }}/results/test-pretty-print.xml /tmp/ansible-xml-beers.xml diff --git a/test/integration/targets/xml/tasks/test-remove-attribute.yml b/test/integration/targets/xml/tasks/test-remove-attribute.yml index 6af599b9846..9aa395e6665 100644 --- a/test/integration/targets/xml/tasks/test-remove-attribute.yml +++ b/test/integration/targets/xml/tasks/test-remove-attribute.yml @@ -1,14 +1,28 @@ --- - name: Setup test fixture copy: - src: '{{ role_path }}/fixtures/ansible-xml-beers.xml' + src: fixtures/ansible-xml-beers.xml dest: /tmp/ansible-xml-beers.xml + - name: Remove '/business/rating/@subjective' xml: path: /tmp/ansible-xml-beers.xml xpath: /business/rating/@subjective - ensure: absent + state: absent + register: remove_attribute + + - name: Compare to expected result + copy: + src: results/test-remove-attribute.xml + dest: /tmp/ansible-xml-beers.xml + check_mode: yes + diff: yes + register: comparison - name: Test expected result - command: diff -u {{ role_path }}/results/test-remove-attribute.xml /tmp/ansible-xml-beers.xml + assert: + that: + - remove_attribute.changed == true + - comparison.changed == false # identical + #command: diff -u {{ role_path }}/results/test-remove-attribute.xml /tmp/ansible-xml-beers.xml diff --git a/test/integration/targets/xml/tasks/test-remove-element.yml b/test/integration/targets/xml/tasks/test-remove-element.yml index f8edd734b1a..f2e20ea2208 100644 --- a/test/integration/targets/xml/tasks/test-remove-element.yml +++ b/test/integration/targets/xml/tasks/test-remove-element.yml @@ -1,14 +1,28 @@ --- - name: Setup test fixture copy: - src: '{{ role_path }}/fixtures/ansible-xml-beers.xml' + src: fixtures/ansible-xml-beers.xml dest: /tmp/ansible-xml-beers.xml + - name: Remove '/business/rating' xml: path: /tmp/ansible-xml-beers.xml xpath: /business/rating - ensure: absent + state: absent + register: remove_element + + - name: Compare to expected result + copy: + src: results/test-remove-element.xml + dest: /tmp/ansible-xml-beers.xml + check_mode: yes + diff: yes + register: comparison - name: Test expected result - command: diff -u {{ role_path }}/results/test-remove-element.xml /tmp/ansible-xml-beers.xml + assert: + that: + - remove_element.changed == true + - comparison.changed == false # identical + #command: diff -u {{ role_path }}/results/test-remove-element.xml /tmp/ansible-xml-beers.xml diff --git a/test/integration/targets/xml/tasks/test-remove-namespaced-attribute.yml b/test/integration/targets/xml/tasks/test-remove-namespaced-attribute.yml index 19f41a08275..36682b22025 100644 --- a/test/integration/targets/xml/tasks/test-remove-namespaced-attribute.yml +++ b/test/integration/targets/xml/tasks/test-remove-namespaced-attribute.yml @@ -1,9 +1,10 @@ --- - name: Setup test fixture copy: - src: '{{ role_path }}/fixtures/ansible-xml-namespaced-beers.xml' + src: fixtures/ansible-xml-namespaced-beers.xml dest: /tmp/ansible-xml-namespaced-beers.xml + - name: Remove namespaced '/bus:business/rat:rating/@attr:subjective' xml: path: /tmp/ansible-xml-namespaced-beers.xml @@ -13,7 +14,20 @@ ber: http://test.beers rat: http://test.rating attr: http://test.attribute - ensure: absent + state: absent + register: remove_namespaced_attribute + + - name: Compare to expected result + copy: + src: results/test-remove-namespaced-attribute.xml + dest: /tmp/ansible-xml-namespaced-beers.xml + check_mode: yes + diff: yes + register: comparison - name: Test expected result - command: diff -u {{ role_path }}/results/test-remove-namespaced-attribute.xml /tmp/ansible-xml-namespaced-beers.xml + assert: + that: + - remove_element.changed == true + - comparison.changed == false # identical + #command: diff -u {{ role_path }}/results/test-remove-namespaced-attribute.xml /tmp/ansible-xml-namespaced-beers.xml diff --git a/test/integration/targets/xml/tasks/test-remove-namespaced-element.yml b/test/integration/targets/xml/tasks/test-remove-namespaced-element.yml index 5be96af5a69..be78af68037 100644 --- a/test/integration/targets/xml/tasks/test-remove-namespaced-element.yml +++ b/test/integration/targets/xml/tasks/test-remove-namespaced-element.yml @@ -1,9 +1,10 @@ --- - name: Setup test fixture copy: - src: '{{ role_path }}/fixtures/ansible-xml-namespaced-beers.xml' + src: fixtures/ansible-xml-namespaced-beers.xml dest: /tmp/ansible-xml-namespaced-beers.xml + - name: Remove namespaced '/bus:business/rat:rating' xml: path: /tmp/ansible-xml-namespaced-beers.xml @@ -13,7 +14,20 @@ ber: http://test.beers rat: http://test.rating attr: http://test.attribute - ensure: absent + state: absent + register: remove_namespaced_element + + - name: Compare to expected result + copy: + src: results/test-remove-element.xml + dest: /tmp/ansible-xml-namespaced-beers.xml + check_mode: yes + diff: yes + register: comparison - name: Test expected result - command: diff -u {{ role_path }}/results/test-remove-element.xml /tmp/ansible-xml-namespaced-beers.xml + assert: + that: + - remove_namespaced_element.changed == true + - comparison.changed == false # identical + #command: diff -u {{ role_path }}/results/test-remove-element.xml /tmp/ansible-xml-namespaced-beers.xml diff --git a/test/integration/targets/xml/tasks/test-set-attribute-value-unicode.yml b/test/integration/targets/xml/tasks/test-set-attribute-value-unicode.yml index e6ab507e76e..dabf72a1b7e 100644 --- a/test/integration/targets/xml/tasks/test-set-attribute-value-unicode.yml +++ b/test/integration/targets/xml/tasks/test-set-attribute-value-unicode.yml @@ -1,16 +1,29 @@ --- - name: Setup test fixture copy: - src: '{{ role_path }}/fixtures/ansible-xml-beers.xml' + src: fixtures/ansible-xml-beers.xml dest: /tmp/ansible-xml-beers.xml + - name: Set '/business/rating/@subjective' to 'нет' xml: path: /tmp/ansible-xml-beers.xml xpath: /business/rating attribute: subjective - value: "нет" + value: нет + register: set_attribute_value_unicode + + - name: Compare to expected result + copy: + src: results/test-set-attribute-value-unicode.xml + dest: /tmp/ansible-xml-beers.xml + check_mode: yes + diff: yes + register: comparison - name: Test expected result - command: diff -u {{ role_path }}/results/test-set-attribute-value-unicode.xml /tmp/ansible-xml-beers.xml - changed_when: False + assert: + that: + - set_attribute_value_unicode.changed == true + - comparison.changed == false # identical + #command: diff -u {{ role_path }}/results/test-set-attribute-value-unicode.xml /tmp/ansible-xml-beers.xml diff --git a/test/integration/targets/xml/tasks/test-set-attribute-value.yml b/test/integration/targets/xml/tasks/test-set-attribute-value.yml index ad6a041dd9d..2aa39fe22fd 100644 --- a/test/integration/targets/xml/tasks/test-set-attribute-value.yml +++ b/test/integration/targets/xml/tasks/test-set-attribute-value.yml @@ -1,16 +1,29 @@ --- - name: Setup test fixture copy: - src: '{{ role_path }}/fixtures/ansible-xml-beers.xml' + src: fixtures/ansible-xml-beers.xml dest: /tmp/ansible-xml-beers.xml + - name: Set '/business/rating/@subjective' to 'false' xml: path: /tmp/ansible-xml-beers.xml xpath: /business/rating attribute: subjective - value: "false" + value: 'false' + register: set_attribute_value + + - name: Compare to expected result + copy: + src: results/test-set-attribute-value.xml + dest: /tmp/ansible-xml-beers.xml + check_mode: yes + diff: yes + register: comparison - name: Test expected result - command: diff -u {{ role_path }}/results/test-set-attribute-value.xml /tmp/ansible-xml-beers.xml - changed_when: False + assert: + that: + - set_attribute_value.changed == true + - comparison.changed == false # identical + #command: diff -u {{ role_path }}/results/test-set-attribute-value.xml /tmp/ansible-xml-beers.xml diff --git a/test/integration/targets/xml/tasks/test-set-children-elements-level.yml b/test/integration/targets/xml/tasks/test-set-children-elements-level.yml index 4cd0168aa17..f90cc573a7e 100644 --- a/test/integration/targets/xml/tasks/test-set-children-elements-level.yml +++ b/test/integration/targets/xml/tasks/test-set-children-elements-level.yml @@ -1,14 +1,17 @@ --- - name: Setup test fixture - command: cp {{ role_path }}/fixtures/ansible-xml-beers.xml /tmp/ansible-xml-beers.xml + copy: + src: fixtures/ansible-xml-beers.xml + dest: /tmp/ansible-xml-beers.xml + - name: Set child elements xml: path: /tmp/ansible-xml-beers.xml xpath: /business/beers - set_children: + set_children: &children - beer: - name: "90 Minute IPA" + name: 90 Minute IPA alcohol: "0.5" _: - Water: @@ -21,7 +24,7 @@ - Yeast: quantity: 20g - beer: - name: "Harvest Pumpkin Ale" + name: Harvest Pumpkin Ale alcohol: "0.3" _: - Water: @@ -31,41 +34,41 @@ quantity: 25g - Yeast: quantity: 20g + register: set_children_elements_level + + - name: Compare to expected result + copy: + src: results/test-set-children-elements-level.xml + dest: /tmp/ansible-xml-beers.xml + check_mode: yes + diff: yes + register: comparison - name: Test expected result - command: diff -u {{ role_path }}/results/test-set-children-elements-level.xml /tmp/ansible-xml-beers.xml + assert: + that: + - set_children_elements_level.changed == true + - comparison.changed == false # identical + #command: diff -u {{ role_path }}/results/test-set-children-elements-level.xml /tmp/ansible-xml-beers.xml - - name: Set child elements + + - name: Set child elements (again) xml: path: /tmp/ansible-xml-beers.xml xpath: /business/beers - set_children: - - beer: - name: "90 Minute IPA" - alcohol: "0.5" - _: - - Water: - quantity: 200g - liter: "0.2" - - Starch: - quantity: 10g - - Hops: - quantity: 50g - - Yeast: - quantity: 20g - - beer: - name: "Harvest Pumpkin Ale" - alcohol: "0.3" - _: - - Water: - quantity: 200g - liter: "0.2" - - Hops: - quantity: 25g - - Yeast: - quantity: 20g + set_children: *children register: set_children_again - - fail: - msg: "Setting children is not idempotent!" - when: set_children_again.changed + - name: Compare to expected result + copy: + src: results/test-set-children-elements-level.xml + dest: /tmp/ansible-xml-beers.xml + check_mode: yes + diff: yes + register: comparison + + - name: Test expected result + assert: + that: + - set_children_again.changed == false + - comparison.changed == false # identical diff --git a/test/integration/targets/xml/tasks/test-set-children-elements-unicode.yml b/test/integration/targets/xml/tasks/test-set-children-elements-unicode.yml index cdb9da6bc1b..240b894ac7a 100644 --- a/test/integration/targets/xml/tasks/test-set-children-elements-unicode.yml +++ b/test/integration/targets/xml/tasks/test-set-children-elements-unicode.yml @@ -1,27 +1,46 @@ --- - name: Setup test fixture - command: cp {{ role_path }}/fixtures/ansible-xml-beers.xml /tmp/ansible-xml-beers.xml + copy: + src: fixtures/ansible-xml-beers.xml + dest: /tmp/ansible-xml-beers.xml + - name: Set child elements xml: path: /tmp/ansible-xml-beers.xml xpath: /business/beers - set_children: - - beer: "Окское" - - beer: "Невское" + set_children: &children + - beer: Окское + - beer: Невское + register: set_children_elements_unicode + + - name: Compare to expected result + copy: + src: results/test-set-children-elements-unicode.xml + dest: /tmp/ansible-xml-beers.xml + check_mode: yes + diff: yes + register: comparison - name: Test expected result - command: diff -u {{ role_path }}/results/test-set-children-elements-unicode.xml /tmp/ansible-xml-beers.xml + assert: + that: + - set_children_elements_unicode.changed == true + - comparison.changed == false # identical + #command: diff -u {{ role_path }}/results/test-set-children-elements-unicode.xml /tmp/ansible-xml-beers.xml - - name: Set child elements - xml: - path: /tmp/ansible-xml-beers.xml - xpath: /business/beers - set_children: - - beer: "Окское" - - beer: "Невское" - register: set_children_again - - fail: - msg: "Setting children is not idempotent!" - when: set_children_again.changed + - name: Compare to expected result + copy: + src: results/test-set-children-elements-unicode.xml + dest: /tmp/ansible-xml-beers.xml + check_mode: yes + diff: yes + register: comparison + + - name: Test expected result + assert: + that: + - set_children_again.changed == false + - comparison.changed == false # identical + #command: diff -u {{ role_path }}/results/test-set-children-elements-unicode.xml /tmp/ansible-xml-beers.xml diff --git a/test/integration/targets/xml/tasks/test-set-children-elements.yml b/test/integration/targets/xml/tasks/test-set-children-elements.yml index a7ec6436685..7b0f3247ad2 100644 --- a/test/integration/targets/xml/tasks/test-set-children-elements.yml +++ b/test/integration/targets/xml/tasks/test-set-children-elements.yml @@ -1,27 +1,53 @@ --- - name: Setup test fixture - command: cp {{ role_path }}/fixtures/ansible-xml-beers.xml /tmp/ansible-xml-beers.xml + copy: + src: fixtures/ansible-xml-beers.xml + dest: /tmp/ansible-xml-beers.xml + - name: Set child elements xml: path: /tmp/ansible-xml-beers.xml xpath: /business/beers - set_children: - - beer: "90 Minute IPA" - - beer: "Harvest Pumpkin Ale" + set_children: &children + - beer: 90 Minute IPA + - beer: Harvest Pumpkin Ale + register: set_children_elements + + - name: Compare to expected result + copy: + src: results/test-set-children-elements.xml + dest: /tmp/ansible-xml-beers.xml + check_mode: yes + diff: yes + register: comparison - name: Test expected result - command: diff -u {{ role_path }}/results/test-set-children-elements.xml /tmp/ansible-xml-beers.xml + assert: + that: + - set_children_elements.changed == true + - comparison.changed == false # identical + #command: diff -u {{ role_path }}/results/test-set-children-elements.xml /tmp/ansible-xml-beers.xml - - name: Set child elements + + - name: Set child elements (again) xml: path: /tmp/ansible-xml-beers.xml xpath: /business/beers - set_children: - - beer: "90 Minute IPA" - - beer: "Harvest Pumpkin Ale" + set_children: *children register: set_children_again - - fail: - msg: "Setting children is not idempotent!" - when: set_children_again.changed + - name: Compare to expected result + copy: + src: results/test-set-children-elements.xml + dest: /tmp/ansible-xml-beers.xml + check_mode: yes + diff: yes + register: comparison + + - name: Test expected result + assert: + that: + - set_children_again.changed == false + - comparison.changed == false # identical + #command: diff -u {{ role_path }}/results/test-set-children-elements.xml /tmp/ansible-xml-beers.xml diff --git a/test/integration/targets/xml/tasks/test-set-element-value-empty.yml b/test/integration/targets/xml/tasks/test-set-element-value-empty.yml index 0f5a73938f3..5814803cb74 100644 --- a/test/integration/targets/xml/tasks/test-set-element-value-empty.yml +++ b/test/integration/targets/xml/tasks/test-set-element-value-empty.yml @@ -1,14 +1,28 @@ --- - name: Setup test fixture copy: - src: '{{ role_path }}/fixtures/ansible-xml-beers.xml' + src: fixtures/ansible-xml-beers.xml dest: /tmp/ansible-xml-beers.xml - - name: Set /business/website/address to empty string. + + - name: Set '/business/website/address' to empty string. xml: path: /tmp/ansible-xml-beers.xml xpath: /business/website/address value: '' + register: set_element_value_empty + + - name: Compare to expected result + copy: + src: results/test-set-element-value-empty.xml + dest: /tmp/ansible-xml-beers.xml + check_mode: yes + diff: yes + register: comparison - name: Test expected result - command: diff -u {{ role_path }}/results/test-set-element-value-empty.xml /tmp/ansible-xml-beers.xml + assert: + that: + - set_element_value_empty.changed == true + - comparison.changed == false # identical + #command: diff -u {{ role_path }}/results/test-set-element-value-empty.xml /tmp/ansible-xml-beers.xml diff --git a/test/integration/targets/xml/tasks/test-set-element-value-unicode.yml b/test/integration/targets/xml/tasks/test-set-element-value-unicode.yml index 4e13808a2fa..c3a40b7d934 100644 --- a/test/integration/targets/xml/tasks/test-set-element-value-unicode.yml +++ b/test/integration/targets/xml/tasks/test-set-element-value-unicode.yml @@ -1,37 +1,43 @@ --- - name: Setup test fixture copy: - src: '{{ role_path }}/fixtures/ansible-xml-beers.xml' + src: fixtures/ansible-xml-beers.xml dest: /tmp/ansible-xml-beers.xml + - name: Add 2nd '/business/rating' with value 'пять' xml: path: /tmp/ansible-xml-beers.xml xpath: /business add_children: - - rating: "пять" + - rating: пять - name: Set '/business/rating' to 'пять' xml: path: /tmp/ansible-xml-beers.xml xpath: /business/rating - value: "пять" + value: пять register: set_element_first_run - name: Set '/business/rating' to 'false'... again xml: path: /tmp/ansible-xml-beers.xml xpath: /business/rating - value: "пять" + value: пять register: set_element_second_run - - name: Test expected result - command: diff -u {{ role_path }}/results/test-set-element-value-unicode.xml /tmp/ansible-xml-beers.xml - changed_when: no + - name: Compare to expected result + copy: + src: results/test-set-element-value-unicode.xml + dest: /tmp/ansible-xml-beers.xml + check_mode: yes + diff: yes + register: comparison - - name: Test registered 'changed' on run 1 and unchanged on run 2 + - name: Test expected result assert: that: - - set_element_first_run.changed - - not set_element_second_run.changed -... + - set_element_first_run.changed == true + - set_element_second_run.changed == false + - comparison.changed == false # identical + #command: diff -u {{ role_path }}/results/test-set-element-value-unicode.xml /tmp/ansible-xml-beers.xml diff --git a/test/integration/targets/xml/tasks/test-set-element-value.yml b/test/integration/targets/xml/tasks/test-set-element-value.yml index 07e6d6a24aa..dbd070f1398 100644 --- a/test/integration/targets/xml/tasks/test-set-element-value.yml +++ b/test/integration/targets/xml/tasks/test-set-element-value.yml @@ -1,37 +1,43 @@ --- - name: Setup test fixture copy: - src: '{{ role_path }}/fixtures/ansible-xml-beers.xml' + src: fixtures/ansible-xml-beers.xml dest: /tmp/ansible-xml-beers.xml + - name: Add 2nd '/business/rating' with value '5' xml: path: /tmp/ansible-xml-beers.xml xpath: /business add_children: - - rating: "5" + - rating: '5' - name: Set '/business/rating' to '5' xml: path: /tmp/ansible-xml-beers.xml xpath: /business/rating - value: "5" + value: '5' register: set_element_first_run - - name: Set '/business/rating' to 'false'... again + - name: Set '/business/rating' to '5'... again xml: path: /tmp/ansible-xml-beers.xml xpath: /business/rating - value: "5" + value: '5' register: set_element_second_run - - name: Test expected result - command: diff -u {{ role_path }}/results/test-set-element-value.xml /tmp/ansible-xml-beers.xml - changed_when: no + - name: Compare to expected result + copy: + src: results/test-set-element-value.xml + dest: /tmp/ansible-xml-beers.xml + check_mode: yes + diff: yes + register: comparison - - name: Test registered 'changed' on run 1 and unchanged on run 2 + - name: Test expected result assert: that: - - set_element_first_run.changed - - not set_element_second_run.changed -... + - set_element_first_run.changed == true + - set_element_second_run.changed == false + - comparison.changed == false # identical + #command: diff -u {{ role_path }}/results/test-set-element-value.xml /tmp/ansible-xml-beers.xml diff --git a/test/integration/targets/xml/tasks/test-set-namespaced-attribute-value.yml b/test/integration/targets/xml/tasks/test-set-namespaced-attribute-value.yml index 1201abb4c95..e0086efe3ad 100644 --- a/test/integration/targets/xml/tasks/test-set-namespaced-attribute-value.yml +++ b/test/integration/targets/xml/tasks/test-set-namespaced-attribute-value.yml @@ -1,9 +1,10 @@ --- - name: Setup test fixture copy: - src: '{{ role_path }}/fixtures/ansible-xml-namespaced-beers.xml' + src: fixtures/ansible-xml-namespaced-beers.xml dest: /tmp/ansible-xml-namespaced-beers.xml + - name: Set namespaced '/bus:business/rat:rating/@attr:subjective' to 'false' xml: path: /tmp/ansible-xml-namespaced-beers.xml @@ -14,8 +15,20 @@ rat: http://test.rating attr: http://test.attribute attribute: attr:subjective - value: "false" + value: 'false' + register: set_namespaced_attribute_value + + - name: Compare to expected result + copy: + src: results/test-set-namespaced-attribute-value.xml + dest: /tmp/ansible-xml-namespaced-beers.xml + check_mode: yes + diff: yes + register: comparison - name: Test expected result - command: diff -u {{ role_path }}/results/test-set-namespaced-attribute-value.xml /tmp/ansible-xml-namespaced-beers.xml - changed_when: no + assert: + that: + - set_namespaced_attribute_value.changed == true + - comparison.changed == false # identical + #command: diff -u {{ role_path }}/results/test-set-namespaced-attribute-value.xml /tmp/ansible-xml-namespaced-beers.xml diff --git a/test/integration/targets/xml/tasks/test-set-namespaced-children-elements.yml b/test/integration/targets/xml/tasks/test-set-namespaced-children-elements.yml new file mode 100644 index 00000000000..e55bb2836c5 --- /dev/null +++ b/test/integration/targets/xml/tasks/test-set-namespaced-children-elements.yml @@ -0,0 +1,54 @@ +--- + - name: Setup test fixture + copy: + src: fixtures/ansible-xml-namespaced-beers.xml + dest: /tmp/ansible-xml-namespaced-beers-xml.xml + + - name: Set child elements + xml: + path: /tmp/ansible-xml-namespaced-beers-xml.xml + xpath: /bus:business/ber:beers + namespaces: + bus: http://test.business + ber: http://test.beers + set_children: + - beer: 90 Minute IPA + - beer: Harvest Pumpkin Ale + + - name: Copy state after first set_children + copy: + src: /tmp/ansible-xml-namespaced-beers.xml + dest: /tmp/ansible-xml-namespaced-beers-1.xml + + - name: Set child elements again + xml: + path: /tmp/ansible-xml-namespaced-beers-xml.xml + xpath: /bus:business/ber:beers + namespaces: + bus: http://test.business + ber: http://test.beers + set_children: + - beer: 90 Minute IPA + - beer: Harvest Pumpkin Ale + register: set_children_again + + - name: Copy state after second set_children + copy: + src: /tmp/ansible-xml-namespaced-beers.xml + dest: /tmp/ansible-xml-namespaced-beers-2.xml + + - name: Compare to expected result + copy: + src: /tmp/ansible-xml-namespaced-beers-1.xml + dest: /tmp/ansible-xml-namespaced-beers-2.xml + check_mode: yes + diff: yes + register: comparison + #command: diff /tmp/ansible-xml-namespaced-beers-1.xml /tmp/ansible-xml-namespaced-beers-2.xml + + - name: Test expected result + assert: + that: + - set_children_again.changed == false # idempotency + - set_namespaced_attribute_value.changed == true + - comparison.changed == false # identical diff --git a/test/integration/targets/xml/tasks/test-set-namespaced-element-value.yml b/test/integration/targets/xml/tasks/test-set-namespaced-element-value.yml index 80b4e3b5433..f77d7537e93 100644 --- a/test/integration/targets/xml/tasks/test-set-namespaced-element-value.yml +++ b/test/integration/targets/xml/tasks/test-set-namespaced-element-value.yml @@ -1,9 +1,10 @@ --- - name: Setup test fixture copy: - src: '{{ role_path }}/fixtures/ansible-xml-namespaced-beers.xml' + src: fixtures/ansible-xml-namespaced-beers.xml dest: /tmp/ansible-xml-namespaced-beers.xml + - name: Set namespaced '/bus:business/rat:rating' to '11' xml: path: /tmp/ansible-xml-namespaced-beers.xml @@ -13,7 +14,7 @@ rat: http://test.rating attr: http://test.attribute xpath: /bus:business/rat:rating - value: "11" + value: '11' register: set_element_first_run - name: Set namespaced '/bus:business/rat:rating' to '11' again @@ -25,15 +26,21 @@ rat: http://test.rating attr: http://test.attribute xpath: /bus:business/rat:rating - value: "11" + value: '11' register: set_element_second_run - - name: Test expected result - command: diff -u {{ role_path }}/results/test-set-namespaced-element-value.xml /tmp/ansible-xml-namespaced-beers.xml - changed_when: no + - name: Compare to expected result + copy: + src: results/test-set-namespaced-element-value.xml + dest: /tmp/ansible-xml-namespaced-beers.xml + check_mode: yes + diff: yes + register: comparison + #command: diff -u {{ role_path }}/results/test-set-namespaced-element-value.xml /tmp/ansible-xml-namespaced-beers.xml - - name: Test registered 'changed' on run 1 and unchanged on run 2 + - name: Test expected result assert: that: - - set_element_first_run.changed - - not set_element_second_run.changed + - set_element_first_run.changed == true + - set_element_second_run.changed == false + - comparison.changed == false # identical diff --git a/test/integration/targets/xml/tasks/test-xmlstring.yml b/test/integration/targets/xml/tasks/test-xmlstring.yml index 4ae642fd571..4e80c45fa4e 100644 --- a/test/integration/targets/xml/tasks/test-xmlstring.yml +++ b/test/integration/targets/xml/tasks/test-xmlstring.yml @@ -1,31 +1,74 @@ --- - - name: Read from xmlstring + # NOTE: Jinja2 templating eats trailing newlines + - name: Read from xmlstring (not using pretty_print) xml: xmlstring: "{{ lookup('file', '{{ role_path }}/fixtures/ansible-xml-beers.xml') }}" - pretty_print: True + xpath: . register: xmlresponse - - - name: Write result to file + + + - name: Compare to expected result + copy: + content: "{{ xmlresponse.xmlstring }}\n" + dest: '{{ role_path }}/results/test-pretty-print-only.xml' + check_mode: yes + diff: yes + register: comparison + + - name: Test expected result + assert: + that: + - xmlresponse.changed == false + - comparison.changed == false # identical + #command: diff -u {{ role_path }}/results/test-pretty-print-only.xml /tmp/ansible-xml-beers.xml + + + # NOTE: Jinja2 templating eats trailing newlines + - name: Read from xmlstring (using pretty_print) + xml: + xmlstring: "{{ lookup('file', '{{ role_path }}/fixtures/ansible-xml-beers.xml') }}" + pretty_print: yes + register: xmlresponse + + - name: Compare to expected result copy: - dest: /tmp/ansible-xml-beers.xml - content: "{{ xmlresponse.xmlstring }}" + content: '{{ xmlresponse.xmlstring }}' + dest: '{{ role_path }}/results/test-pretty-print-only.xml' + check_mode: yes + diff: yes + register: comparison + # FIXME: This change is related to the newline added by pretty_print - name: Test expected result - command: diff -u {{ role_path }}/results/test-pretty-print-only.xml /tmp/ansible-xml-beers.xml + assert: + that: + - xmlresponse.changed == true + - comparison.changed == false # identical + #command: diff -u {{ role_path }}/results/test-pretty-print-only.xml /tmp/ansible-xml-beers.xml + + # NOTE: Jinja2 templating eats trailing newlines - name: Read from xmlstring xml: xmlstring: "{{ lookup('file', '{{ role_path }}/fixtures/ansible-xml-beers.xml') }}" xpath: /business/beers - pretty_print: True + pretty_print: yes add_children: - - beer: "Old Rasputin" + - beer: Old Rasputin register: xmlresponse_modification - - name: Write result to file + - name: Compare to expected result copy: - dest: /tmp/ansible-xml-beers.xml - content: "{{ xmlresponse_modification.xmlstring }}" + content: '{{ xmlresponse_modification.xmlstring }}' + dest: '{{ role_path }}/results/test-pretty-print.xml' + check_mode: yes + diff: yes + register: comparison + # FIXME: This change is related to the newline added by pretty_print - name: Test expected result - command: diff -u {{ role_path }}/results/test-pretty-print.xml /tmp/ansible-xml-beers.xml + assert: + that: + - xmlresponse_modification.changed == true + - comparison.changed == false # identical + #command: diff -u {{ role_path }}/results/test-pretty-print.xml /tmp/ansible-xml-beers.xml