diff --git a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/util/xml/DOMNamespaceContext.java b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/util/xml/DOMNamespaceContext.java index e30e044ea8..b24429bed8 100644 --- a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/util/xml/DOMNamespaceContext.java +++ b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/util/xml/DOMNamespaceContext.java @@ -53,8 +53,13 @@ public class DOMNamespaceContext implements NamespaceContext { } private void addNamespaces(Node element) { - if (element.getParentNode() != null) { - addNamespaces(element.getParentNode()); + if (element.getChildNodes() != null) { + // loops through child Element Nodes and check for namespace attributes + for (int i = 0; i < element.getChildNodes().getLength(); i++) { + if (element.getChildNodes().item(i) instanceof Element) { + addNamespaces(element.getChildNodes().item(i)); + } + } } if (element instanceof Element) { Element el = (Element) element; @@ -62,7 +67,7 @@ public class DOMNamespaceContext implements NamespaceContext { for (int x = 0; x < map.getLength(); x++) { Attr attr = (Attr) map.item(x); if ("xmlns".equals(attr.getPrefix())) { - namespaceMap.put(attr.getLocalName(), attr.getValue()); + namespaceMap.putIfAbsent(attr.getLocalName(), attr.getValue()); } } } diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/XmlMethodBodyBuilderSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/XmlMethodBodyBuilderSpec.groovy index 16a7e97896..a60cfe614b 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/XmlMethodBodyBuilderSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/XmlMethodBodyBuilderSpec.groovy @@ -180,6 +180,64 @@ class XmlMethodBodyBuilderSpec extends Specification { } } + @Unroll + def 'should generate correct verification from xml with namespace [#methodBuilderName]'() { + given: + Contract contractDsl = + Contract.make { + request { + method GET() + urlPath '/get' + headers { + contentType(applicationXml()) + } + } + response { + status(OK()) + headers { + contentType(applicationXml()) + } + body """ + + + + 1 + + + """ + } + } + methodBuilder() + when: + String test = singleTestGenerator(contractDsl) + then: + test.contains('assertThat(valueFromXPath(parsedXml, "/soap:Envelope/soap:Body/ns2:Res/ns2:ID/text()")).isEqualTo("1")') + test.contains('assertThat(valueFromXPath(parsedXml, "/soap:Envelope/namespace::soap")).isEqualTo("http://schemas.xmlsoap.org/soap/envelope/")') + test.contains('valueFromXPath(parsedXml, "/soap:Envelope/soap:Body/ns2:Res/namespace::ns2")).isEqualTo("http://*******/****/****/******/schema"') + and: + SyntaxChecker.tryToCompile(methodBuilderName, test) + where: + methodBuilderName | methodBuilder + "spock" | { + properties.testFramework = TestFramework.SPOCK + } + "testng" | { + properties.testFramework = TestFramework.TESTNG + } + "junit" | { + properties.testMode = TestMode.MOCKMVC + } + "jaxrs-spock" | { + properties.testFramework = TestFramework.SPOCK; properties.testMode = TestMode.JAXRSCLIENT + } + "jaxrs" | { + properties.testFramework = TestFramework.JUNIT; properties.testMode = TestMode.JAXRSCLIENT + } + "webclient" | { + properties.testMode = TestMode.WEBTESTCLIENT + } + } + @Unroll def 'should generate correct verification from named xml with body matchers [#methodBuilderName]'() { given: