All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.xmlunit.assertj.MultipleNodeAssert Maven / Gradle / Ivy

There is a newer version: 2.10.0
Show newest version
/*
  This file is licensed to You 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

  http://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.xmlunit.assertj;

import org.assertj.core.api.AbstractListAssert;
import org.assertj.core.api.FactoryBasedNavigableIterableAssert;
import org.assertj.core.api.ObjectAssert;
import org.assertj.core.description.Description;
import org.w3c.dom.Node;
import org.xmlunit.builder.Input;
import org.xmlunit.util.Convert;
import org.xmlunit.xpath.JAXPXPathEngine;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Source;
import javax.xml.xpath.XPathFactory;

import static org.xmlunit.assertj.error.ShouldAnyNodeHaveXPath.shouldAnyNodeHaveXPath;

/**
 * Assertion methods for {@link Iterable} of {@link Node}.
 *
 * 

Simple Example

* *
 * import static org.xmlunit.assertj.XmlAssert.assertThat;
 *
 * final String xml = "<a><b attr=\"abc\"></b></a>";
 *
 * assertThat(xml).nodesByXPath("//a/b").haveAttribute("attr").
 * 
* * @since XMLUnit 2.6.1 */ public class MultipleNodeAssert extends FactoryBasedNavigableIterableAssert, Node, SingleNodeAssert> { interface SingleNodeAssertConsumer { void accept(SingleNodeAssert t); } private static final AssertFactoryProvider ASSERT_FACTORY_PROVIDER = new AssertFactoryProvider(); private MultipleNodeAssert(Iterable nodes, JAXPXPathEngine engine) { super(nodes, MultipleNodeAssert.class, ASSERT_FACTORY_PROVIDER.create(engine)); } static MultipleNodeAssert create(Object xmlSource, Map prefix2Uri, DocumentBuilderFactory dbf, XPathFactory xpf, String xPath) { AssertionsAdapter.assertThat(xPath).isNotBlank(); final JAXPXPathEngine engine = xpf == null ? new JAXPXPathEngine() : new JAXPXPathEngine(xpf); if (prefix2Uri != null) { engine.setNamespaceContext(prefix2Uri); } Source s = Input.from(xmlSource).build(); Node root = dbf != null ? Convert.toNode(s, dbf) : Convert.toNode(s); Iterable nodes = engine.selectNodes(xPath, root); return new MultipleNodeAssert(nodes, engine) .describedAs("XPath \"%s\" evaluated to node set", xPath); } /** * Equivalent for {@link #isNotEmpty()}. */ public MultipleNodeAssert exist() { return isNotEmpty(); } /** * Equivalent for {@link #isEmpty()}. */ public void doNotExist() { isEmpty(); } /** * Verifies that all the actual nodes have attribute with given name. *

* If the actual nodes iterable is empty, this assertion succeeds as there is no elements to check. * * @throws AssertionError if the actual nodes iterable is {@code null}. * @throws AssertionError if one or more nodes don't have attribute with given name. */ public MultipleNodeAssert haveAttribute(final String attributeName) { isNotNull(); allSatisfy(new SingleNodeAssertConsumer() { @Override public void accept(SingleNodeAssert singleNodeAssert) { singleNodeAssert.hasAttribute(attributeName); } }); return this; } /** * Verifies that all the actual nodes have attribute with given name and value. *

* If the actual nodes iterable is empty, this assertion succeeds as there is no elements to check. * * @throws AssertionError if the actual nodes iterable is {@code null}. * @throws AssertionError if one or more nodes don't have attribute with given name and value. */ public MultipleNodeAssert haveAttribute(final String attributeName, final String attributeValue) { isNotNull(); allSatisfy(new SingleNodeAssertConsumer() { @Override public void accept(SingleNodeAssert singleNodeAssert) { singleNodeAssert.hasAttribute(attributeName, attributeValue); } }); return this; } /** * Verifies that all the actual nodes don't have attribute with given name. *

* If the actual nodes iterable is empty, this assertion succeeds as there is no elements to check. * * @throws AssertionError if the actual nodes iterable is {@code null}. * @throws AssertionError if any node has attribute with given name. */ public MultipleNodeAssert doNotHaveAttribute(final String attributeName) { isNotNull(); allSatisfy(new SingleNodeAssertConsumer() { @Override public void accept(SingleNodeAssert singleNodeAssert) { singleNodeAssert.doesNotHaveAttribute(attributeName); } }); return this; } /** * Verifies that all the actual nodes don't have attribute with given name and value. *

* If the actual nodes iterable is empty, this assertion succeeds as there is no elements to check. * * @throws AssertionError if the actual nodes iterable is {@code null}. * @throws AssertionError if any node has attribute with given name and value. */ public MultipleNodeAssert doNotHaveAttribute(final String attributeName, final String attributeValue) { isNotNull(); allSatisfy(new SingleNodeAssertConsumer() { @Override public void accept(SingleNodeAssert singleNodeAssert) { singleNodeAssert.doesNotHaveAttribute(attributeName, attributeValue); } }); return this; } /** * Verifies that any of actual nodes has given {@code xPath}. * * @throws AssertionError if the actual nodes iterable is {@code null}. * @throws AssertionError if all nodes don't have xpath. * @since XMLUnit 2.6.4 */ public MultipleNodeAssert containsAnyNodeHavingXPath(String xPath) { isNotNull(); int index = 0; for (Node node : actual) { final SingleNodeAssert singleNodeAssert = toAssert(node, navigationDescription("check node at index " + index)); if (!singleNodeAssert.isNodeSetEmpty(xPath)) { return this; } index++; } throwAssertionError(shouldAnyNodeHaveXPath(xPath)); return null; //fix compile issue } /** * Verifies that all of actual nodes have given {@code xPath}. * * @throws AssertionError if the actual nodes iterable is {@code null}. * @throws AssertionError if some node doesn't have xpath. * @since XMLUnit 2.6.4 */ public MultipleNodeAssert containsAllNodesHavingXPath(final String xPath) { isNotNull(); allSatisfy(new SingleNodeAssertConsumer() { @Override public void accept(SingleNodeAssert singleNodeAssert) { singleNodeAssert.hasXPath(xPath); } }); return this; } /** * Extracting values of given node's attribute. * If a node doesn't have the attribute then {@code null} value is return. * * @throws AssertionError if the actual nodes iterable is {@code null}. * @since XMLUnit 2.6.4 */ public AbstractListAssert, String, ObjectAssert> extractingAttribute(String attribute) { isNotNull(); List values = new ArrayList<>(); for (Node node : actual) { values.add(NodeUtils.attributeValue(node, attribute)); } String extractedDescription = String.format("Extracted attribute: %s", attribute); String description = Description.mostRelevantDescription(this.info.description(), extractedDescription); return newListAssertInstance(values).as(description); } /** * Extracting text content of given nodes. * If a node doesn't have the text then an empty string is returned. * * @throws AssertionError if the actual nodes iterable is {@code null}. * @since XMLUnit 2.8.0 */ public AbstractListAssert, String, ObjectAssert> extractingText() { isNotNull(); List values = new ArrayList<>(); for (Node node : actual) { String textContent = node.getTextContent(); if (textContent != null) { textContent = textContent.trim(); } values.add(textContent); } String extractedDescription = "Extracted text content"; String description = Description.mostRelevantDescription(this.info.description(), extractedDescription); return newListAssertInstance(values).as(description); } private void allSatisfy(SingleNodeAssertConsumer consumer) { int index = 0; for (Node node : actual) { final SingleNodeAssert singleNodeAssert = toAssert(node, navigationDescription("check node at index " + index)); consumer.accept(singleNodeAssert); index++; } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy