6 changed files with 146 additions and 158 deletions
@ -1,129 +0,0 @@ |
|||||||
package org.springframework.util.xml; |
|
||||||
|
|
||||||
import org.junit.jupiter.api.BeforeEach; |
|
||||||
import org.junit.jupiter.api.Test; |
|
||||||
import org.w3c.dom.Document; |
|
||||||
import org.w3c.dom.Element; |
|
||||||
import org.xml.sax.SAXException; |
|
||||||
|
|
||||||
import javax.xml.parsers.DocumentBuilder; |
|
||||||
import javax.xml.parsers.DocumentBuilderFactory; |
|
||||||
import javax.xml.parsers.ParserConfigurationException; |
|
||||||
import java.io.File; |
|
||||||
import java.io.IOException; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.*; |
|
||||||
|
|
||||||
public class DomUtilsTest { |
|
||||||
|
|
||||||
private Element elementWithText; |
|
||||||
|
|
||||||
private Element elementWithComment; |
|
||||||
|
|
||||||
private Element elementWithEntityReference; |
|
||||||
|
|
||||||
private Element elementWithEmptyReference; |
|
||||||
|
|
||||||
private static final String CLASS = "class"; |
|
||||||
|
|
||||||
private static final String PRINCIPAL = "principal"; |
|
||||||
|
|
||||||
private static final String HEAD_MASTER = "headMaster"; |
|
||||||
|
|
||||||
@BeforeEach |
|
||||||
void setup() throws ParserConfigurationException, IOException, SAXException { |
|
||||||
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); |
|
||||||
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); |
|
||||||
Document documentWithText = documentBuilder.parse(new File("src/test/resources/scanned-resources/resource#element-with-text.xml")); |
|
||||||
Document documentWithComment = documentBuilder.parse(new File("src/test/resources/scanned-resources/resource#element-with-comment.xml")); |
|
||||||
Document documentWithEntityReference = documentBuilder.parse(new File("src/test/resources/scanned-resources/resource#element-with-entity-reference.xml")); |
|
||||||
Document documentWithEmptyValue = documentBuilder.parse(new File("src/test/resources/scanned-resources/resource#element-with-empty-reference.xml")); |
|
||||||
elementWithText = documentWithText.getDocumentElement(); |
|
||||||
elementWithComment = documentWithComment.getDocumentElement(); |
|
||||||
elementWithEntityReference = documentWithEntityReference.getDocumentElement(); |
|
||||||
elementWithEmptyReference = documentWithEmptyValue.getDocumentElement(); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
void getChildElementsByTagNameTestNodeInstanceOfElementAndDesiredElementsPresent() { |
|
||||||
List<Element> childElements = DomUtils.getChildElementsByTagName(elementWithText, CLASS, PRINCIPAL); |
|
||||||
assertAll( |
|
||||||
() -> assertEquals(3, childElements.size()), |
|
||||||
() -> assertEquals(CLASS, childElements.get(0).getNodeName()), |
|
||||||
() -> assertEquals(CLASS, childElements.get(1).getNodeName()), |
|
||||||
() -> assertEquals(PRINCIPAL, childElements.get(2).getNodeName()) |
|
||||||
); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
void getChildElementsByTagNameTestNodeInstanceOfElementAndDesiredElementsNotPresent() { |
|
||||||
List<Element> childElements = DomUtils.getChildElementsByTagName(elementWithText, HEAD_MASTER); |
|
||||||
assertEquals(0, childElements.size()); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
void getChildElementByTagNameTestElementPresentInChildNodeList() { |
|
||||||
Element childElement = DomUtils.getChildElementByTagName(elementWithText, PRINCIPAL); |
|
||||||
assertNotNull(childElement); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
void getChildElementByTagNameTestElementPresentInChildNodeListAndChildElementsDoNotHaveSampleTag() { |
|
||||||
Element childElement = DomUtils.getChildElementByTagName(elementWithText, HEAD_MASTER); |
|
||||||
assertNull(childElement); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
void getChildElementValueByTagNameTestElementPresentInChildNodeList() { |
|
||||||
assertEquals("Fox Test", DomUtils.getChildElementValueByTagName(elementWithText, "guard")); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
void getChildElementValueByTagNameTestElementWithoutChild() { |
|
||||||
assertNull(DomUtils.getChildElementValueByTagName(elementWithText, "math tutor")); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
void getChildElementsTestWithValidChildNodes() { |
|
||||||
List<Element> childElements = DomUtils.getChildElements(elementWithText); |
|
||||||
assertAll( |
|
||||||
() -> assertEquals(4, childElements.size()) |
|
||||||
); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
void getTextValueTestWithCharacterDataNode() { |
|
||||||
assertTrue(DomUtils.getTextValue(elementWithText).contains("TestSchool")); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
void getTextValueWithCommentInXml() { |
|
||||||
assertTrue(DomUtils.getTextValue(elementWithComment).isBlank()); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
void getTextValueWithEntityReferenceInXml() { |
|
||||||
assertTrue(DomUtils.getTextValue(elementWithEntityReference).contains("&")); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
void getTextValueWithEmptyReferenceInXml() { |
|
||||||
assertTrue(DomUtils.getTextValue(elementWithEmptyReference).isBlank()); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
void nodeNameTestTrueCondition() { |
|
||||||
assertTrue(DomUtils.nodeNameEquals(elementWithText, "school")); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
void nodeNameTestFalseCondition() { |
|
||||||
assertFalse(DomUtils.nodeNameEquals(elementWithText, "college")); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
void createContentHandlerTest() { |
|
||||||
assertNotNull(DomUtils.createContentHandler(elementWithText)); |
|
||||||
} |
|
||||||
} |
|
||||||
@ -0,0 +1,146 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2002-2024 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.util.xml; |
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import javax.xml.parsers.DocumentBuilder; |
||||||
|
import javax.xml.parsers.DocumentBuilderFactory; |
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test; |
||||||
|
import org.w3c.dom.Document; |
||||||
|
import org.w3c.dom.Element; |
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat; |
||||||
|
|
||||||
|
/** |
||||||
|
* Tests for {@link DomUtils}. |
||||||
|
* |
||||||
|
* @author Stephane Nicoll |
||||||
|
* @author Kunal Jani |
||||||
|
*/ |
||||||
|
class DomUtilsTests { |
||||||
|
|
||||||
|
private static final Element SCHOOL_ELEMENT = getDocumentElement(""" |
||||||
|
<?xml version="1.0"?> |
||||||
|
<school>TestSchool |
||||||
|
<class teacher="Happy Teacher">Test Teacher One</class> |
||||||
|
<class teacher="Sad Teacher">Test Teacher Two</class> |
||||||
|
<principal>Test Principal</principal> |
||||||
|
<guard>Fox Test</guard> |
||||||
|
</school>"""); |
||||||
|
|
||||||
|
|
||||||
|
@Test |
||||||
|
void getChildElementsByTagNameWithSeveralMatchingTags() { |
||||||
|
List<Element> childElements = DomUtils.getChildElementsByTagName(SCHOOL_ELEMENT, "class", "principal"); |
||||||
|
assertThat(childElements).map(Element::getNodeName).containsExactly("class", "class", "principal"); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void getChildElementsByTagNameWhenTagDoesNotExist() { |
||||||
|
assertThat(DomUtils.getChildElementsByTagName(SCHOOL_ELEMENT, "teacher")).isEmpty(); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void getChildElementByTagNameWithMatchingTag() { |
||||||
|
Element principalElement = DomUtils.getChildElementByTagName(SCHOOL_ELEMENT, "principal"); |
||||||
|
assertThat(principalElement).isNotNull(); |
||||||
|
assertThat(principalElement.getTextContent()).isEqualTo("Test Principal"); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void getChildElementByTagNameWithNonMatchingTag() { |
||||||
|
assertThat(DomUtils.getChildElementByTagName(SCHOOL_ELEMENT, "teacher")).isNull(); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void getChildElementValueByTagName() { |
||||||
|
assertThat(DomUtils.getChildElementValueByTagName(SCHOOL_ELEMENT, "guard")).isEqualTo("Fox Test"); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void getChildElementValueByTagNameWithNonMatchingTag() { |
||||||
|
assertThat(DomUtils.getChildElementValueByTagName(SCHOOL_ELEMENT, "math tutor")).isNull(); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void getChildElements() { |
||||||
|
List<Element> childElements = DomUtils.getChildElements(SCHOOL_ELEMENT); |
||||||
|
assertThat(childElements).map(Element::getNodeName).containsExactly("class", "class", "principal", "guard"); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void getTextValueWithCharacterDataNode() { |
||||||
|
assertThat(DomUtils.getTextValue(SCHOOL_ELEMENT)).isEqualToIgnoringWhitespace("TestSchool"); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void getTextValueWithCommentInXml() { |
||||||
|
Element elementWithComment = getDocumentElement(""" |
||||||
|
<?xml version="1.0"?> |
||||||
|
<state> |
||||||
|
<!-- This is a comment --> |
||||||
|
<person>Alice</person> |
||||||
|
</state>"""); |
||||||
|
assertThat(DomUtils.getTextValue(elementWithComment)).isBlank(); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void getTextValueWithEntityReference() { |
||||||
|
Element elementWithEntityReference = getDocumentElement(""" |
||||||
|
<?xml version="1.0"?> |
||||||
|
<state> |
||||||
|
& |
||||||
|
<person>Alice</person> |
||||||
|
</state>"""); |
||||||
|
assertThat(DomUtils.getTextValue(elementWithEntityReference)).contains("&"); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void getTextValueWithEmptyElement() { |
||||||
|
Element emptyElement = getDocumentElement(""" |
||||||
|
<?xml version="1.0"?> |
||||||
|
<person></person>"""); |
||||||
|
assertThat(DomUtils.getTextValue(emptyElement)).isBlank(); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void nodeNameEqualsWhenTrue() { |
||||||
|
assertThat(DomUtils.nodeNameEquals(SCHOOL_ELEMENT, "school")).isTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void nodeNameEqualsWhenFalse() { |
||||||
|
assertThat(DomUtils.nodeNameEquals(SCHOOL_ELEMENT, "college")).isFalse(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private static Element getDocumentElement(String xmlContent) { |
||||||
|
try { |
||||||
|
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); |
||||||
|
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); |
||||||
|
Document document = documentBuilder.parse(new ByteArrayInputStream(xmlContent.getBytes())); |
||||||
|
return document.getDocumentElement(); |
||||||
|
} |
||||||
|
catch (Exception ex) { |
||||||
|
throw new IllegalStateException("Failed to parse xml content:%n%s".formatted(xmlContent), ex); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -1,5 +0,0 @@ |
|||||||
<?xml version="1.0"?> |
|
||||||
<state> |
|
||||||
<!-- This is a comment --> |
|
||||||
<person>Alice</person> |
|
||||||
</state> |
|
||||||
@ -1 +0,0 @@ |
|||||||
<person></person> |
|
||||||
@ -1,5 +0,0 @@ |
|||||||
<?xml version="1.0"?> |
|
||||||
<state> |
|
||||||
& |
|
||||||
<person>Alice</person> |
|
||||||
</state> |
|
||||||
@ -1,18 +0,0 @@ |
|||||||
<?xml version="1.0"?> |
|
||||||
<school>TestSchool |
|
||||||
<class teacher = "Happy Teacher">Test Teacher One |
|
||||||
<unknownStudent>Abe Sample</unknownStudent> |
|
||||||
<maleStudent>Jane Doe</maleStudent> |
|
||||||
<femaleStudent>John Doe</femaleStudent> |
|
||||||
</class> |
|
||||||
<class teacher = "Sad Teacher">Test Teacher Two |
|
||||||
<unknownStudent>Def Sample</unknownStudent> |
|
||||||
<maleStudent>Jane Dane</maleStudent> |
|
||||||
<femaleStudent>John Dane</femaleStudent> |
|
||||||
</class> |
|
||||||
<principal>Test Principal |
|
||||||
<firstName>Head</firstName> |
|
||||||
<lastName>Master</lastName> |
|
||||||
</principal> |
|
||||||
<guard>Fox Test</guard> |
|
||||||
</school> |
|
||||||
Loading…
Reference in new issue