/* (c) 2014 - 2015 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.test; import static org.junit.Assert.assertEquals; import java.io.ByteArrayOutputStream; import java.io.OutputStream; import java.util.HashMap; import java.util.Map; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.custommonkey.xmlunit.SimpleNamespaceContext; import org.custommonkey.xmlunit.XMLAssert; import org.custommonkey.xmlunit.XMLUnit; import org.custommonkey.xmlunit.XpathEngine; import org.geoserver.data.test.SystemTestData; import org.geotools.data.SampleDataAccess; import org.geotools.data.SampleDataAccessData; import org.junit.Test; import org.w3c.dom.Document; import org.w3c.dom.NodeList; /** * WFS GetFeature to test integration of {@link SampleDataAccess} with GeoServer. * * @author Ben Caradoc-Davies, CSIRO Exploration and Mining */ public class SampleDataAccessWfsTest extends SampleDataAccessTestSupport { @Override protected void onSetUp(SystemTestData testData) throws Exception { // Setup XMLUnit namespaces Map<String, String> namespaces = new HashMap<String, String>(); namespaces.put("wfs", "http://www.opengis.net/wfs"); namespaces.put("ows", "http://www.opengis.net/ows"); namespaces.put("ogc", "http://www.opengis.net/ogc"); namespaces.put("xs", "http://www.w3.org/2001/XMLSchema"); namespaces.put("xsd", "http://www.w3.org/2001/XMLSchema"); namespaces.put("gml", "http://www.opengis.net/gml"); namespaces.put(SampleDataAccessData.NAMESPACE_PREFIX, SampleDataAccessData.NAMESPACE_URI); XMLUnit.setXpathNamespaceContext(new SimpleNamespaceContext(namespaces)); } @Override protected void onTearDown(SystemTestData testData) throws Exception { } /** * Test whether GetCapabilities returns wfs:WFS_Capabilities. * */ @Test public void testGetCapabilities() throws Exception { Document doc = getAsDOM("wfs?request=GetCapabilities&version=1.1.0"); LOGGER.info("WFS GetCapabilities response:\n" + prettyString(doc)); assertEquals("wfs:WFS_Capabilities", doc.getDocumentElement().getNodeName()); } /** * Test whether DescribeFeatureType returns xsd:schema. * */ @Test public void testDescribeFeatureType() throws Exception { Document doc = getAsDOM("wfs?request=DescribeFeatureType&version=1.1.0&typename=gsml:MappedFeature"); LOGGER.info("WFS DescribeFeatureType response:\n" + prettyString(doc)); assertEquals("xsd:schema", doc.getDocumentElement().getNodeName()); } /** * Test whether GetFeature returns wfs:FeatureCollection. * */ @Test public void testGetFeature() throws Exception { Document doc = getAsDOM("wfs?request=GetFeature&version=1.1.0&typename=gsml:MappedFeature"); LOGGER.info("WFS GetFeature response:\n" + prettyString(doc)); assertEquals("wfs:FeatureCollection", doc.getDocumentElement().getNodeName()); } /** * Test content of GetFeature response. * */ @Test public void testGetFeatureContent() throws Exception { Document doc = getAsDOM("wfs?request=GetFeature&version=1.1.0&typename=gsml:MappedFeature"); assertXpathCount(2, "//gsml:MappedFeature", doc); // mf1 XMLAssert.assertXpathEvaluatesTo("GUNTHORPE FORMATION", "//gsml:MappedFeature[@gml:id='mf1']/gml:description", doc); XMLAssert.assertXpathEvaluatesTo("mf1.spec", "//gsml:MappedFeature[@gml:id='mf1']/gsml:specification" + "/gsml:GeologicUnit/@gml:id", doc); XMLAssert.assertXpathEvaluatesTo("Gunthorpe specification description", "//gsml:MappedFeature[@gml:id='mf1']/gsml:specification" + "/gsml:GeologicUnit/gml:description", doc); XMLAssert.assertXpathEvaluatesTo("-1.2 52.5 -1.2 52.6 -1.1 52.6 -1.1 52.5 -1.2 52.5", "//gsml:MappedFeature[@gml:id='mf1']/gsml:shape//gml:posList", doc); // mf2 XMLAssert.assertXpathEvaluatesTo("MERCIA MUDSTONE GROUP", "//gsml:MappedFeature[@gml:id='mf2']/gml:description", doc); XMLAssert.assertXpathEvaluatesTo("mf2.spec", "//gsml:MappedFeature[@gml:id='mf2']/gsml:specification" + "/gsml:GeologicUnit/@gml:id", doc); XMLAssert.assertXpathEvaluatesTo("Mercia specification description", "//gsml:MappedFeature[@gml:id='mf2']/gsml:specification" + "/gsml:GeologicUnit/gml:description", doc); XMLAssert.assertXpathEvaluatesTo("-1.3 52.5 -1.3 52.6 -1.2 52.6 -1.2 52.5 -1.3 52.5", "//gsml:MappedFeature[@gml:id='mf2']/gsml:shape//gml:posList", doc); } /** * Assert that there are count matches of xpath in doc. * * @param count * expected number of matches * @param xpath * xpath expression * @param doc * document under test */ public void assertXpathCount(int count, String xpath, Document doc) throws Exception { XpathEngine engine = XMLUnit.newXpathEngine(); NodeList nodes = engine.getMatchingNodes(xpath, doc); assertEquals(count, nodes.getLength()); } /** * Return {@link Document} as a pretty-printed string. * * @param doc * */ public String prettyString(Document doc) throws Exception { OutputStream out = new ByteArrayOutputStream(); prettyPrint(doc, out); return out.toString(); } /** * Pretty-print a {@link Document} to an {@link OutputStream}. * * @param doc * @param out */ public void prettyPrint(Document doc, OutputStream out) throws Exception { Transformer tx = TransformerFactory.newInstance().newTransformer(); tx.setOutputProperty(OutputKeys.INDENT, "yes"); tx.transform(new DOMSource(doc), new StreamResult(out)); } @Override protected void setUpTestData(SystemTestData testData) throws Exception { testData.setUpSecurity(); } }