Browse Source

Polish "Add test coverage for DomUtils"

See gh-33768
pull/33850/head
Stéphane Nicoll 1 year ago
parent
commit
d43126705f
  1. 129
      spring-core/src/test/java/org/springframework/util/xml/DomUtilsTest.java
  2. 146
      spring-core/src/test/java/org/springframework/util/xml/DomUtilsTests.java
  3. 5
      spring-core/src/test/resources/scanned-resources/resource#element-with-comment.xml
  4. 1
      spring-core/src/test/resources/scanned-resources/resource#element-with-empty-reference.xml
  5. 5
      spring-core/src/test/resources/scanned-resources/resource#element-with-entity-reference.xml
  6. 18
      spring-core/src/test/resources/scanned-resources/resource#element-with-text.xml

129
spring-core/src/test/java/org/springframework/util/xml/DomUtilsTest.java

@ -1,129 +0,0 @@ @@ -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));
}
}

146
spring-core/src/test/java/org/springframework/util/xml/DomUtilsTests.java

@ -0,0 +1,146 @@ @@ -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>
&amp;
<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);
}
}
}

5
spring-core/src/test/resources/scanned-resources/resource#element-with-comment.xml

@ -1,5 +0,0 @@ @@ -1,5 +0,0 @@
<?xml version="1.0"?>
<state>
<!-- This is a comment -->
<person>Alice</person>
</state>

1
spring-core/src/test/resources/scanned-resources/resource#element-with-empty-reference.xml

@ -1 +0,0 @@ @@ -1 +0,0 @@
<person></person>

5
spring-core/src/test/resources/scanned-resources/resource#element-with-entity-reference.xml

@ -1,5 +0,0 @@ @@ -1,5 +0,0 @@
<?xml version="1.0"?>
<state>
&amp;
<person>Alice</person>
</state>

18
spring-core/src/test/resources/scanned-resources/resource#element-with-text.xml

@ -1,18 +0,0 @@ @@ -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…
Cancel
Save