Merge branch 'gh-167' into 1.0.x

This commit is contained in:
Andy Wilkinson
2015-11-16 17:48:51 +00:00
2 changed files with 80 additions and 1 deletions

View File

@@ -34,6 +34,7 @@ import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
@@ -115,7 +116,14 @@ class XmlContentHandler implements ContentHandler {
}
for (int i = 0; i < matchingNodes.getLength(); i++) {
Node node = matchingNodes.item(i);
node.getParentNode().removeChild(node);
if (node.getNodeType() == Node.ATTRIBUTE_NODE) {
Attr attr = (Attr) node;
attr.getOwnerElement().removeAttributeNode(attr);
}
else {
node.getParentNode().removeChild(node);
}
}
}
if (payload.getChildNodes().getLength() > 0) {

View File

@@ -193,6 +193,77 @@ public class ResponseFieldsSnippetTests {
.build());
}
@Test
public void xmlAttribute() throws IOException {
this.snippet.expectResponseFields("xml-attribute").withContents(
tableWithHeader("Path", "Type", "Description").row("a", "b", "one").row(
"a/@id", "c", "two"));
new ResponseFieldsSnippet(Arrays.asList(fieldWithPath("a").description("one")
.type("b"), fieldWithPath("a/@id").description("two").type("c")))
.document(new OperationBuilder("xml-attribute", this.snippet
.getOutputDirectory())
.response()
.content("<a id=\"1\">foo</a>")
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML_VALUE)
.build());
}
@Test
public void missingXmlAttribute() throws IOException {
this.thrown.expect(SnippetException.class);
this.thrown
.expectMessage(equalTo("Fields with the following paths were not found"
+ " in the payload: [a/@id]"));
new ResponseFieldsSnippet(Arrays.asList(fieldWithPath("a").description("one")
.type("b"), fieldWithPath("a/@id").description("two").type("c")))
.document(new OperationBuilder("missing-xml-attribute", this.snippet
.getOutputDirectory())
.response()
.content("<a>foo</a>")
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML_VALUE)
.build());
}
@Test
public void missingOptionalXmlAttribute() throws IOException {
this.snippet.expectResponseFields("missing-optional-xml-attribute").withContents(
tableWithHeader("Path", "Type", "Description").row("a", "b", "one").row(
"a/@id", "c", "two"));
new ResponseFieldsSnippet(Arrays.asList(fieldWithPath("a").description("one")
.type("b"), fieldWithPath("a/@id").description("two").type("c")
.optional())).document(new OperationBuilder(
"missing-optional-xml-attribute", this.snippet.getOutputDirectory())
.response().content("<a>foo</a>")
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML_VALUE)
.build());
}
@Test
public void undocumentedAttributeDoesNotCauseFailure() throws IOException {
this.snippet.expectResponseFields("undocumented-attribute").withContents(
tableWithHeader("Path", "Type", "Description").row("a", "a", "one"));
new ResponseFieldsSnippet(Arrays.asList(fieldWithPath("a").description("one")
.type("a"))).document(new OperationBuilder("undocumented-attribute",
this.snippet.getOutputDirectory()).response()
.content("<a id=\"foo\">bar</a>")
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML_VALUE)
.build());
}
@Test
public void documentedXmlAttributesAreRemoved() throws IOException {
this.thrown.expect(SnippetException.class);
this.thrown.expectMessage(equalTo(String
.format("The following parts of the payload were not documented:"
+ "%n<a>bar</a>%n")));
new ResponseFieldsSnippet(Arrays.asList(fieldWithPath("a/@id").description("one")
.type("a"))).document(new OperationBuilder(
"documented-attribute-is-removed", this.snippet.getOutputDirectory())
.response().content("<a id=\"foo\">bar</a>")
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML_VALUE)
.build());
}
@Test
public void xmlResponseFieldWithNoType() throws IOException {
this.thrown.expect(FieldTypeRequiredException.class);