package org.geoserver.geosearch.rest;
import static org.custommonkey.xmlunit.XMLAssert.assertXpathEvaluatesTo;
import static org.custommonkey.xmlunit.XMLAssert.assertXpathExists;
import static org.geoserver.data.test.MockData.BASIC_POLYGONS;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.xml.namespace.QName;
import junit.framework.Test;
import org.custommonkey.xmlunit.SimpleNamespaceContext;
import org.custommonkey.xmlunit.XMLUnit;
import org.custommonkey.xmlunit.XpathEngine;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.config.GeoServerInfo;
import org.geoserver.data.test.MockData;
import org.geoserver.test.GeoServerTestSupport;
import org.w3c.dom.Document;
import com.mockrunner.mock.web.MockHttpServletResponse;
public class GeoSearchIntegrationTest extends GeoServerTestSupport {
static QName[] indexed = { MockData.BASIC_POLYGONS, MockData.BRIDGES };
/**
* This is a READ ONLY TEST so we can use one time setup
*/
public static Test suite() {
return new OneTimeTestSetup(new GeoSearchIntegrationTest());
}
@Override
protected void oneTimeSetUp() throws Exception {
super.oneTimeSetUp();
Catalog catalog = getCatalog();
for (QName name : indexed) {
String namespaceURI = name.getNamespaceURI();
String localPart = name.getLocalPart();
FeatureTypeInfo typeInfo = catalog.getFeatureTypeByName(namespaceURI, localPart);
LayerInfo layer = catalog.getLayerByName(typeInfo.getPrefixedName());
layer.getMetadata().put(Properties.INDEXING_ENABLED, Boolean.TRUE);
catalog.save(layer);
}
Map<String, String> namespaces = new HashMap<String, String>();
namespaces.put("atom", "http://www.w3.org/2005/Atom");
namespaces.put("geo", "http://www.google.com/geo/schemas/sitemap/1.0");
namespaces.put("sm", "http://www.sitemaps.org/schemas/sitemap/0.9");
namespaces.put("kml", "http://www.opengis.net/kml/2.2");
XMLUnit.setXpathNamespaceContext(new SimpleNamespaceContext(namespaces));
}
public void testSiteMap() throws Exception {
Document dom = getAsDOM("/geosearch/sitemap.xml");
// print(dom);
assertXpathExists("/sm:urlset", dom);
assertXpathEvaluatesTo(String.valueOf(indexed.length), "count(/sm:urlset/sm:url/sm:loc)",
dom);
assertXpathEvaluatesTo(String.valueOf(indexed.length),
"count(/sm:urlset/sm:url/geo:geo/geo:format)", dom);
assertXpathEvaluatesTo("kml", "/sm:urlset/sm:url/geo:geo/geo:format", dom);
}
public void testKmlUrls() throws Exception {
Document sitemap = getAsDOM("/geosearch/sitemap.xml");
// print(sitemap);
Set<String> expected = new HashSet<String>();
expected.add("http://localhost/geoserver/geosearch/cite%3ABasicPolygons.kml");
expected.add("http://localhost/geoserver/geosearch/cite%3ABridges.kml");
XpathEngine xp = XMLUnit.newXpathEngine();
String kmlUrl1 = xp.evaluate("/sm:urlset/sm:url[1]/sm:loc", sitemap);
String kmlUrl2 = xp.evaluate("/sm:urlset/sm:url[2]/sm:loc", sitemap);
Set<String> actual = new HashSet<String>();
actual.add(kmlUrl1);
actual.add(kmlUrl2);
assertEquals(expected, actual);
}
public void testKml() throws Exception {
Document kml = getAsDOM("/geosearch/cite%3ABasicPolygons.kml");
print(kml);
FeatureTypeInfo ft = getCatalog().getFeatureTypeByName(BASIC_POLYGONS.getNamespaceURI(),
BASIC_POLYGONS.getLocalPart());
assertXpathEvaluatesTo(ft.getTitle(), "/kml:kml/kml:Document/kml:name", kml);
GeoServerInfo global = getGeoServer().getGlobal();
assertXpathEvaluatesTo(global.getContact().getContactPerson(),
"/kml:kml/kml:Document/atom:author", kml);
assertXpathEvaluatesTo(global.getOnlineResource(), "/kml:kml/kml:Document/atom:link/@href",
kml);
assertXpathExists("/kml:kml/kml:Document/kml:description", kml);
assertXpathEvaluatesTo("cite:BasicPolygons",
"/kml:kml/kml:Document/kml:NetworkLink/kml:name", kml);
}
public void testKmlResponseHeaders() throws Exception {
MockHttpServletResponse response = getAsServletResponse("/geosearch/cite%3ABasicPolygons.kml");
assertEquals(200, response.getStatusCode());
assertEquals("application/vnd.google-earth.kml+xml", response.getContentType());
}
}