package org.geoserver.geosync; import java.io.File; import java.net.URI; import javax.xml.transform.Result; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.geoserver.data.test.MockData; import org.geoserver.test.GeoServerTestSupport; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; public class GeoSyncControllerTest extends GeoServerTestSupport { protected void oneTimeSetUp() throws Exception { super.oneTimeSetUp(); String insert = "<wfs:Transaction service=\"WFS\" version=\"1.1.0\" " + "xmlns:cgf=\"http://www.opengis.net/cite/geometry\" " + "xmlns:ogc=\"http://www.opengis.net/ogc\" " + "xmlns:wfs=\"http://www.opengis.net/wfs\" " + "xmlns:gml=\"http://www.opengis.net/gml\"> " + "<wfs:Insert srsName=\"EPSG:4326\"> " + "<cgf:Points>" + "<cgf:pointProperty>" + "<gml:Point>" + "<gml:pos>1 1</gml:pos>" + "</gml:Point>" + "</cgf:pointProperty>" + "<cgf:id>t0001</cgf:id>" + "</cgf:Points>" + "</wfs:Insert>" + "<wfs:Insert srsName=\"EPSG:4326\"> " + "<cgf:Points>" + "<cgf:pointProperty>" + "<gml:Point>" + "<gml:pos>2 2</gml:pos>" + "</gml:Point>" + "</cgf:pointProperty>" + "<cgf:id>t0002</cgf:id>" + "</cgf:Points>" + "</wfs:Insert>" + "<wfs:Insert srsName=\"EPSG:4326\"> " + "<cgf:Points>" + "<cgf:pointProperty>" + "<gml:Point>" + "<gml:pos>3 3</gml:pos>" + "</gml:Point>" + "</cgf:pointProperty>" + "<cgf:id>t0003</cgf:id>" + "</cgf:Points>" + "</wfs:Insert>" + "</wfs:Transaction>"; postAsDOM( "wfs", insert ); } public void testEmptyFeed() throws Exception { Document d = getAsDOM( "history/Points" ); assertEquals( "feed", d.getDocumentElement().getNodeName() ); Element link = getFirstElementByTagName( d, "link" ); assertNotNull( link ); String href = link.getAttribute( "href" ); assertTrue( href.endsWith( "Points/opensearch.xml" ) ); assertEquals( "search", link.getAttribute( "rel" ) ); assertEquals( "application/opensearchdescription+xml", link.getAttribute( "type" ) ); } public void testSearchTemplate() throws Exception { Document d = getAsDOM( "history/Points/opensearch.xml" ); assertEquals( "OpenSearchDescription", d.getDocumentElement().getNodeName() ); Element url = getFirstElementByTagName(d, "Url"); assertNotNull( url ); } public void testFeed() throws Exception { String layer = MockData.POINTS.getLocalPart(); Document d = getAsDOM( "history/" + layer + "?bbox=-180,-90,180,90" ); print ( d ); assertEquals( "feed", d.getDocumentElement().getNodeName() ); assertEquals( 3, d.getElementsByTagName( "entry" ).getLength() ); } public void testFilterBBOX() throws Exception { Document d = getAsDOM( "history/Points?bbox=-180,-90,180,90" ); print( d ); assertEquals( "feed", d.getDocumentElement().getNodeName() ); assertEquals( 3, d.getElementsByTagName( "entry" ).getLength() ); d = getAsDOM( "history/Points?bbox=2,2,180,90" ); assertEquals( "feed", d.getDocumentElement().getNodeName() ); assertEquals( 2, d.getElementsByTagName( "entry" ).getLength() ); d = getAsDOM( "history/Points?bbox=10,10,180,90" ); assertEquals( "feed", d.getDocumentElement().getNodeName() ); assertEquals( 0, d.getElementsByTagName( "entry" ).getLength() ); } public void testFilterIndex() throws Exception { Document d = getAsDOM( "history/Points?startIndex=1" ); assertEquals( "feed", d.getDocumentElement().getNodeName() ); assertEquals( 3, d.getElementsByTagName( "entry" ).getLength() ); d = getAsDOM( "history/Points?startIndex=2" ); assertEquals( "feed", d.getDocumentElement().getNodeName() ); assertEquals( 2, d.getElementsByTagName( "entry" ).getLength() ); d = getAsDOM( "history/Points?startIndex=3" ); assertEquals( "feed", d.getDocumentElement().getNodeName() ); assertEquals( 1, d.getElementsByTagName( "entry" ).getLength() ); } public void testFilterDate() throws Exception { Document d = getAsDOM( "history/Points?bbox=-180,-90,180,90" ); NodeList nodes = d.getElementsByTagName( "updated" ); assertEquals(3, nodes.getLength() ); Element e = (Element) nodes.item( 0 ); e.getFirstChild().setTextContent( "2008-03-19T12:00:00Z" ); e = (Element) nodes.item( 1 ); e.getFirstChild().setTextContent( "2008-03-20T12:00:00Z" ); e = (Element) nodes.item( 2 ); e.getFirstChild().setTextContent( "2008-03-21T12:00:00Z" ); File data = getTestData().getDataDirectoryRoot(); File feed = new File( new File( data, "geosync"), "Points-history.xml" ); assertTrue( feed.exists() ); TransformerFactory.newInstance().newTransformer() .transform( new DOMSource( d ), new StreamResult( feed ) ); d = getAsDOM( "history/Points?dtstart=2008-03-19T12:00:00Z" ); assertEquals( 2, d.getElementsByTagName( "entry").getLength() ); d = getAsDOM( "history/Points?dtstart=2008-03-20T12:00:00Z" ); assertEquals( 1, d.getElementsByTagName( "entry").getLength() ); d = getAsDOM( "history/Points?dtstart=2008-03-20T11:00:00Z" ); assertEquals( 2, d.getElementsByTagName( "entry").getLength() ); d = getAsDOM( "history/Points?dtstart=2008-03-20T11:00:00Z&dtend=2008-03-20T12:39:00Z" ); assertEquals( 1, d.getElementsByTagName( "entry").getLength() ); } }