/* (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.rest.catalog;
import static org.custommonkey.xmlunit.XMLAssert.assertXpathEvaluatesTo;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.List;
import org.geoserver.catalog.NamespaceInfo;
import org.geoserver.catalog.ResourceInfo;
import org.geoserver.catalog.WorkspaceInfo;
import org.geoserver.data.test.MockData;
import org.geoserver.rest.RestBaseController;
import org.junit.Before;
import org.junit.Test;
import org.springframework.mock.web.MockHttpServletResponse;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import net.sf.json.JSON;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class NamespaceTest extends CatalogRESTTestSupport {
@Before
public void cleanNamespaces() {
removeWorkspace("foo");
}
@Test
public void testGetAllAsXML() throws Exception {
Document dom = getAsDOM( RestBaseController.ROOT_PATH + "/namespaces.xml",200);
assertEquals( catalog.getNamespaces().size() ,
dom.getElementsByTagName( "namespace").getLength() );
}
@Test
public void testGetAllAsJSON() throws Exception {
JSON json = getAsJSON( RestBaseController.ROOT_PATH + "/namespaces.json");
assertTrue( json instanceof JSONObject );
JSONArray namespaces = ((JSONObject)json).getJSONObject("namespaces").getJSONArray("namespace");
assertNotNull( namespaces );
assertEquals( catalog.getNamespaces().size() , namespaces.size() );
}
@Test
public void testGetAllAsHTML() throws Exception {
Document dom = getAsDOM( RestBaseController.ROOT_PATH + "/namespaces.html" );
List<NamespaceInfo> namespaces = catalog.getNamespaces();
NodeList links = xp.getMatchingNodes("//html:a", dom );
assertEquals( namespaces.size(), links.getLength() );
for ( int i = 0; i < namespaces.size(); i++ ){
NamespaceInfo ws = namespaces.get( i );
Element link = (Element) links.item( i );
assertTrue( link.getAttribute("href").endsWith( ws.getPrefix() + ".html") );
}
}
@Test
public void testPutAllUnauthorized() throws Exception {
assertEquals( 405, putAsServletResponse( RestBaseController.ROOT_PATH + "/namespaces" ).getStatus() );
}
@Test
public void testDeleteAllUnauthorized() throws Exception {
assertEquals( 405, deleteAsServletResponse( RestBaseController.ROOT_PATH + "/namespaces").getStatus() );
}
@Test
public void testGetAsXML() throws Exception {
Document dom = getAsDOM( RestBaseController.ROOT_PATH + "/namespaces/sf.xml",200);
assertEquals( "namespace", dom.getDocumentElement().getLocalName() );
assertEquals( 1, dom.getElementsByTagName( "prefix" ).getLength() );
Element prefix = (Element) dom.getElementsByTagName( "prefix" ).item(0);
assertEquals( "sf", prefix.getFirstChild().getTextContent() );
Element name = (Element) dom.getElementsByTagName( "uri" ).item(0);
assertEquals( MockData.SF_URI, name.getFirstChild().getTextContent() );
}
@Test
public void testRoundTripXMLSerialization() throws Exception {
removeNamespace("ian");
String xml =
"<namespace>" +
"<prefix>ian</prefix>" +
"<uri>http://ian.com</uri>" +
"</namespace>";
MockHttpServletResponse response = postAsServletResponse( RestBaseController.ROOT_PATH + "/namespaces", xml, "text/xml" );
assertEquals( 201, response.getStatus() );
assertNotNull( response.getHeader( "Location") );
assertTrue( response.getHeader("Location").endsWith( "/namespaces/ian" ) );
NamespaceInfo ws = getCatalog().getNamespaceByPrefix( "ian" );
assertNotNull(ws);
Document dom = getAsDOM( RestBaseController.ROOT_PATH + "/namespaces/ian.xml");
assertEquals( "namespace", dom.getDocumentElement().getLocalName() );
assertEquals( 1, dom.getElementsByTagName( "prefix" ).getLength() );
Element prefix = (Element) dom.getElementsByTagName( "prefix" ).item(0);
assertEquals( "ian", prefix.getFirstChild().getTextContent() );
Element name = (Element) dom.getElementsByTagName( "uri" ).item(0);
assertEquals( "http://ian.com", name.getFirstChild().getTextContent() );
}
@Test
public void testGetAsHTML() throws Exception {
Document dom = getAsDOM( RestBaseController.ROOT_PATH + "/namespaces/sf.html");
List<ResourceInfo> resources = catalog.getResourcesByNamespace("sf",ResourceInfo.class);
NodeList listItems = xp.getMatchingNodes("//html:li", dom );
assertEquals( resources.size(), listItems.getLength() );
for ( int i = 0; i < resources.size(); i++ ){
ResourceInfo resource = resources.get( i );
Element listItem = (Element) listItems.item( i );
assertTrue( listItem.getFirstChild().getNodeValue().endsWith( resource.getName() ) );
}
}
@Test
public void testGetWrongNamespace() throws Exception {
// Parameters for the request
String namespace = "sfsssss";
// Request path
String requestPath = RestBaseController.ROOT_PATH + "/namespaces/" + namespace + ".html";
// Exception path
String exception = "No such namespace: '" + namespace+"'";
// First request should thrown an exception
MockHttpServletResponse response = getAsServletResponse(requestPath);
assertEquals(404, response.getStatus());
assertTrue(response.getContentAsString().contains(
exception));
// Same request with ?quietOnNotFound should not throw an exception
response = getAsServletResponse(requestPath + "?quietOnNotFound=true");
assertEquals(404, response.getStatus());
assertFalse(response.getContentAsString().contains(
exception));
}
@Test
public void testGetNonExistant() throws Exception {
assertEquals( 404, getAsServletResponse( RestBaseController.ROOT_PATH + "/namespaces/none").getStatus() );
}
@Test
public void testPostAsXML() throws Exception {
String xml =
"<namespace>" +
"<prefix>foo</prefix>" +
"<uri>http://foo.com</uri>" +
"</namespace>";
MockHttpServletResponse response = postAsServletResponse( RestBaseController.ROOT_PATH + "/namespaces", xml, "text/xml" );
assertEquals( 201, response.getStatus() );
assertNotNull( response.getHeader( "Location") );
assertTrue( response.getHeader("Location").endsWith( "/namespaces/foo" ) );
NamespaceInfo ns = getCatalog().getNamespaceByPrefix( "foo" );
assertNotNull(ns);
// check the corresponding workspace has been created
WorkspaceInfo ws = getCatalog().getWorkspaceByName("foo");
assertNotNull(ws);
}
@Test
public void testGetAsJSON() throws Exception {
JSON json = getAsJSON( RestBaseController.ROOT_PATH + "/namespaces/sf.json");
JSONObject namespace = ((JSONObject) json).getJSONObject( "namespace") ;
assertEquals( "sf", namespace.get( "prefix" ) );
assertEquals( MockData.SF_URI, namespace.get( "uri" ) );
}
@Test
public void testPostAsJSON() throws Exception {
removeNamespace("foo");
String json = "{'namespace':{ 'prefix':'foo', 'uri':'http://foo.com' }}";
MockHttpServletResponse response = postAsServletResponse( RestBaseController.ROOT_PATH + "/namespaces", json, "text/json" );
assertEquals( 201, response.getStatus() );
assertNotNull( response.getHeader( "Location") );
assertTrue( response.getHeader("Location").endsWith( "/namespaces/foo" ) );
NamespaceInfo ws = getCatalog().getNamespaceByPrefix( "foo" );
assertNotNull(ws);
}
@Test
public void testPostToResource() throws Exception {
String xml =
"<namespace>" +
"<name>changed</name>" +
"</namespace>";
MockHttpServletResponse response =
postAsServletResponse(RestBaseController.ROOT_PATH + "/namespaces/gs", xml, "text/xml" );
assertEquals( 405, response.getStatus() );
}
@Test
public void testDeleteNonExistant() throws Exception {
assertEquals( 404, deleteAsServletResponse(RestBaseController.ROOT_PATH + "/namespaces/newExistant").getStatus() );
}
@Test
public void testDelete() throws Exception {
String xml =
"<namespace>" +
"<prefix>foo</prefix>" +
"<uri>http://foo.com</uri>" +
"</namespace>";
post( RestBaseController.ROOT_PATH + "/namespaces", xml );
Document dom = getAsDOM( RestBaseController.ROOT_PATH + "/namespaces/foo.xml");
assertEquals( "namespace", dom.getDocumentElement().getNodeName() );
assertEquals( 200, deleteAsServletResponse( RestBaseController.ROOT_PATH + "/namespaces/foo" ).getStatus() );
assertEquals( 404, getAsServletResponse( RestBaseController.ROOT_PATH + "/namespaces/foo.xml" ).getStatus() );
// verify associated workspace was deleted
assertEquals( 404, getAsServletResponse( RestBaseController.ROOT_PATH + "/workspaces/foo.xml" ).getStatus() );
}
@Test
public void testDeleteNonEmpty() throws Exception {
assertEquals( 401, deleteAsServletResponse(RestBaseController.ROOT_PATH + "/namespaces/sf").getStatus() );
}
@Test
public void testPut() throws Exception {
String xml =
"<namespace>" +
"<uri>http://changed</uri>" +
"</namespace>";
MockHttpServletResponse response =
putAsServletResponse(RestBaseController.ROOT_PATH + "/namespaces/gs", xml, "text/xml" );
assertEquals( 200, response.getStatus() );
Document dom = getAsDOM( RestBaseController.ROOT_PATH + "/namespaces/gs.xml" );
assertXpathEvaluatesTo("1", "count(//namespace/uri[text()='http://changed'])", dom );
}
@Test
public void testPutNonExistant() throws Exception {
String xml =
"<namespace>" +
"<name>changed</name>" +
"</namespace>";
MockHttpServletResponse response =
putAsServletResponse(RestBaseController.ROOT_PATH + "/namespaces/nonExistant", xml, "text/xml" );
assertEquals( 404, response.getStatus() );
}
@Test
public void testGetDefaultNamespace() throws Exception {
Document dom = getAsDOM( RestBaseController.ROOT_PATH + "/namespaces/default.xml");
assertEquals( "namespace", dom.getDocumentElement().getLocalName() );
assertEquals( 1, dom.getElementsByTagName( "prefix" ).getLength() );
assertEquals( 1, dom.getElementsByTagName( "uri" ).getLength() );
}
@Test
public void testPutDefaultNamespace() throws Exception {
NamespaceInfo def = getCatalog().getDefaultNamespace();
assertEquals( "gs", def.getPrefix() );
String json = "{'namespace':{ 'prefix':'sf' }}";
MockHttpServletResponse response = putAsServletResponse( RestBaseController.ROOT_PATH + "/namespaces/default", json, "text/json");
assertEquals(200, response.getStatus());
def = getCatalog().getDefaultNamespace();
assertEquals( "sf", def.getPrefix() );
}
}