/* (c) 2014 - 2016 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.wfs.xslt;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.custommonkey.xmlunit.XMLAssert;
import org.geoserver.data.test.MockData;
import org.geoserver.data.test.SystemTestData;
import org.geoserver.platform.ServiceException;
import org.junit.Before;
import org.junit.Test;
import org.w3c.dom.Document;
import org.springframework.mock.web.MockHttpServletResponse;
public class GetFeatureXSLTTest extends XSLTTestSupport {
@Override
protected void setUpTestData(SystemTestData testData) throws Exception {
// TODO Auto-generated method stub
super.setUpTestData(testData);
}
@Override
protected void onSetUp(SystemTestData testData) throws Exception {
super.onSetUp(testData);
}
@Before
public void setupXSLT() throws IOException {
File dd = getTestData().getDataDirectoryRoot().getCanonicalFile();
File wfs = new File(dd, "wfs");
File transform = new File(wfs, "transform");
deleteDirectory(transform);
assertTrue(transform.mkdirs());
FileUtils.copyDirectory(new File("src/test/resources/org/geoserver/wfs/xslt"), transform);
// makes sure the output format list is updated
XSLTOutputFormatUpdater updater = applicationContext.getBean(XSLTOutputFormatUpdater.class);
updater.run();
}
@Test
public void testGetCapabilities() throws Exception {
// force the list of output formats provided by the xslt output format to be updated
XSLTOutputFormatUpdater updater = (XSLTOutputFormatUpdater) applicationContext.getBean("xsltOutputFormatUpdater");
updater.run();
// now we can run the request
Document dom = getAsDOM("wfs?service=wfs&version=1.1.0&request=GetCapabilities");
// print(dom);
XMLAssert.assertXpathEvaluatesTo("1",
"count(//ows:Operation[@name='GetFeature']/ows:Parameter[@name = 'outputFormat']/ows:Value[text() = 'HTML'])", dom);
XMLAssert.assertXpathEvaluatesTo("1",
"count(//ows:Operation[@name='GetFeature']/ows:Parameter[@name = 'outputFormat' and ows:Value = 'text/html; subtype=xslt'])", dom);
}
@Test
public void testOutputFormatWrongCase() throws Exception {
Document d = getAsDOM("wfs?request=GetFeature&typename=" + getLayerId(MockData.BUILDINGS)
+ "&version=1.1.0&service=wfs&outputFormat=" + "text/html; subtype=xslt".toUpperCase());
// print(d);
checkOws10Exception(d, ServiceException.INVALID_PARAMETER_VALUE, "outputFormat");
}
@Test
public void testGeneralOutput() throws Exception {
Document d = getAsDOM("wfs?request=GetFeature&typename=" + getLayerId(MockData.BUILDINGS)
+ "&version=1.0.0&service=wfs&outputFormat=text/html; subtype=xslt");
// print(d);
// two features
XMLAssert.assertXpathEvaluatesTo("2", "count(//h2)", d);
XMLAssert.assertXpathEvaluatesTo("1", "count(//h2[text() = 'Buildings.1107531701010'])", d);
XMLAssert.assertXpathEvaluatesTo("1", "count(//h2[text() = 'Buildings.1107531701011'])", d);
// check the first
XMLAssert
.assertXpathEvaluatesTo(
"113",
"//h2[text() = 'Buildings.1107531701010']/following-sibling::table/tr[td='cite:FID']/td[2]",
d);
XMLAssert
.assertXpathEvaluatesTo(
"123 Main Street",
"//h2[text() = 'Buildings.1107531701010']/following-sibling::table/tr[td='cite:ADDRESS']/td[2]",
d);
}
@Test
public void testHeaders() throws Exception {
MockHttpServletResponse response = getAsServletResponse("wfs?request=GetFeature&typename=" + getLayerId(MockData.BUILDINGS)
+ "&version=1.0.0&service=wfs&outputFormat=text/html; subtype=xslt");
assertEquals("text/html; subtype=xslt", response.getContentType());
assertEquals("inline; filename=Buildings.html", response.getHeader("Content-Disposition"));
}
@Test
public void testHeadersTwoLayers() throws Exception {
MockHttpServletResponse response = getAsServletResponse("wfs?request=GetFeature&typename=" + getLayerId(MockData.BUILDINGS)
+ "," + getLayerId(MockData.LAKES)
+ "&version=1.0.0&service=wfs&outputFormat=text/html; subtype=xslt");
assertEquals("text/html; subtype=xslt", response.getContentType());
assertEquals("inline; filename=Buildings_Lakes.html", response.getHeader("Content-Disposition"));
}
@Test
public void testLayerSpecific() throws Exception {
Document d = getAsDOM("wfs?request=GetFeature&typename=" + getLayerId(MockData.BRIDGES)
+ "&version=1.0.0&service=wfs&outputFormat=text/html; subtype=xslt");
// print(d);
// just one features
XMLAssert.assertXpathEvaluatesTo("1", "count(//ul)", d);
XMLAssert.assertXpathEvaluatesTo("1", "count(//ul[li = 'ID: Bridges.1107531599613'])", d);
XMLAssert.assertXpathEvaluatesTo("1", "count(//ul[li = 'FID: 110'])", d);
XMLAssert.assertXpathEvaluatesTo("1", "count(//ul[li = 'Name: Cam Bridge'])", d);
}
@Test
public void testMimeType() throws Exception {
MockHttpServletResponse response = getAsServletResponse("wfs?request=GetFeature&typename=" + getLayerId(MockData.BRIDGES)
+ "&version=1.0.0&service=wfs&outputFormat=HTML");
assertEquals("text/html", response.getContentType());
Document d = dom(new ByteArrayInputStream(response.getContentAsString().getBytes()));
// just one features
XMLAssert.assertXpathEvaluatesTo("1", "count(//ul)", d);
XMLAssert.assertXpathEvaluatesTo("1", "count(//ul[li = 'ID: Bridges.1107531599613'])", d);
XMLAssert.assertXpathEvaluatesTo("1", "count(//ul[li = 'FID: 110'])", d);
XMLAssert.assertXpathEvaluatesTo("1", "count(//ul[li = 'Name: Cam Bridge'])", d);
}
@Test
public void testLayerSpecificOnOtherLayer() throws Exception {
Document d = getAsDOM("wfs?request=GetFeature&typename=" + getLayerId(MockData.BASIC_POLYGONS)
+ "&version=1.1.0&service=wfs&outputFormat=HTML");
print(d);
checkOws10Exception(d, ServiceException.INVALID_PARAMETER_VALUE, "typeName");
}
@Test
public void testIncompatibleMix() throws Exception {
Document d = getAsDOM("wfs?request=GetFeature&typename=" + getLayerId(MockData.BRIDGES)
+ "," + getLayerId(MockData.BUILDINGS)
+ "&version=1.1.0&service=wfs&outputFormat=text/html; subtype=xslt");
// print(d);
checkOws10Exception(d, ServiceException.INVALID_PARAMETER_VALUE, "typeName");
}
@Test
public void testNoOutputFormats() throws Exception {
// clean up the config
File dd = getTestData().getDataDirectoryRoot();
File wfs = new File(dd, "wfs");
File transform = new File(wfs, "transform");
if (transform.exists()) {
deleteDirectory(transform);
}
// makes sure the output format list is updated
XSLTOutputFormatUpdater updater = applicationContext.getBean(XSLTOutputFormatUpdater.class);
updater.run();
// now run a GML2 request, it should work fine (GEOS-5804)
Document d = getAsDOM("wfs?request=GetFeature&typename=" + getLayerId(MockData.BRIDGES)
+ "," + getLayerId(MockData.BUILDINGS)
+ "&version=1.0.0&service=wfs");
XMLAssert.assertXpathEvaluatesTo("1", "count(/wfs:FeatureCollection)", d);
}
}