/* Copyright (c) 2001 - 2009 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, availible at the root
* application directory.
*/
package org.geoserver.catalog.rest;
import static org.custommonkey.xmlunit.XMLAssert.assertXpathEvaluatesTo;
import java.util.List;
import net.sf.json.JSON;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.geoserver.catalog.CascadeDeleteVisitor;
import org.geoserver.catalog.StoreInfo;
import org.geoserver.catalog.WorkspaceInfo;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import com.mockrunner.mock.web.MockHttpServletResponse;
public class WorkspaceTest extends CatalogRESTTestSupport {
public void testGetAllAsXML() throws Exception {
Document dom = getAsDOM( "/rest/workspaces.xml");
assertEquals( catalog.getNamespaces().size() ,
dom.getElementsByTagName( "workspace").getLength() );
}
public void testGetAllAsJSON() throws Exception {
JSON json = getAsJSON( "/rest/workspaces.json");
assertTrue( json instanceof JSONObject );
JSONArray workspaces = ((JSONObject)json).getJSONObject("workspaces").getJSONArray("workspace");
assertNotNull( workspaces );
assertEquals( catalog.getNamespaces().size() , workspaces.size() );
}
public void testGetAllAsHTML() throws Exception {
Document dom = getAsDOM( "/rest/workspaces.html" );
List<WorkspaceInfo> workspaces = catalog.getWorkspaces();
NodeList links = xp.getMatchingNodes("//html:a", dom );
assertEquals( workspaces.size(), links.getLength() );
for ( int i = 0; i < workspaces.size(); i++ ){
WorkspaceInfo ws = workspaces.get( i );
Element link = (Element) links.item( i );
assertTrue( link.getAttribute("href").endsWith( ws.getName() + ".html") );
}
}
public void testPutAllUnauthorized() throws Exception {
assertEquals( 405, putAsServletResponse( "/rest/workspaces" ).getStatusCode() );
}
public void testDeleteAllUnauthorized() throws Exception {
assertEquals( 405, deleteAsServletResponse( "/rest/workspaces").getStatusCode() );
}
public void testGetAsXML() throws Exception {
Document dom = getAsDOM( "/rest/workspaces/sf.xml");
assertEquals( "workspace", dom.getDocumentElement().getLocalName() );
assertEquals( 1, dom.getElementsByTagName( "name" ).getLength() );
Element name = (Element) dom.getElementsByTagName( "name" ).item(0);
assertEquals( "sf", name.getFirstChild().getTextContent() );
}
public void testGetAsHTML() throws Exception {
Document dom = getAsDOM( "/rest/workspaces/sf.html");
List<StoreInfo> stores = catalog.getStoresByWorkspace("sf",StoreInfo.class);
NodeList links = xp.getMatchingNodes("//html:a", dom );
assertEquals( stores.size(), links.getLength() );
for ( int i = 0; i < stores.size(); i++ ){
StoreInfo store = stores.get( i );
Element link = (Element) links.item( i );
assertTrue( link.getAttribute("href").endsWith( store.getName() + ".html") );
}
}
public void testGetNonExistant() throws Exception {
assertEquals( 404, getAsServletResponse( "/rest/workspaces/none").getStatusCode() );
}
public void testPostAsXML() throws Exception {
String xml =
"<workspace>" +
"<name>foo</name>" +
"</workspace>";
MockHttpServletResponse response = postAsServletResponse( "/rest/workspaces", xml, "text/xml" );
assertEquals( 201, response.getStatusCode() );
assertNotNull( response.getHeader( "Location") );
assertTrue( response.getHeader("Location").endsWith( "/workspaces/foo" ) );
WorkspaceInfo ws = getCatalog().getWorkspaceByName( "foo" );
assertNotNull(ws);
}
public void testGetAsJSON() throws Exception {
JSON json = getAsJSON( "/rest/workspaces/sf.json");
JSONObject workspace = ((JSONObject) json).getJSONObject( "workspace") ;
assertEquals( "sf", workspace.get( "name" ) );
}
public void testPostAsJSON() throws Exception {
String json = "{'workspace':{ 'name':'foo' }}";
MockHttpServletResponse response = postAsServletResponse( "/rest/workspaces", json, "text/json" );
assertEquals( 201, response.getStatusCode() );
assertNotNull( response.getHeader( "Location") );
assertTrue( response.getHeader("Location").endsWith( "/workspaces/foo" ) );
WorkspaceInfo ws = getCatalog().getWorkspaceByName( "foo" );
assertNotNull(ws);
}
public void testPostToResource() throws Exception {
String xml =
"<workspace>" +
"<name>changed</name>" +
"</workspace>";
MockHttpServletResponse response =
postAsServletResponse("/rest/workspaces/gs", xml, "text/xml" );
assertEquals( 405, response.getStatusCode() );
}
public void testDeleteNonExistant() throws Exception {
assertEquals( 404, deleteAsServletResponse("/rest/workspaces/newExistant").getStatusCode() );
}
public void testDelete() throws Exception {
String xml =
"<workspace>" +
"<name>foo</name>" +
"</workspace>";
post( "/rest/workspaces", xml);
Document dom = getAsDOM( "/rest/workspaces/foo.xml");
assertEquals( "workspace", dom.getDocumentElement().getNodeName() );
assertEquals( 200, deleteAsServletResponse( "/rest/workspaces/foo" ).getStatusCode() );
assertEquals( 404, getAsServletResponse( "/rest/workspaces/foo.xml" ).getStatusCode() );
}
public void testDeleteNonEmptyForbidden() throws Exception {
assertEquals( 403, deleteAsServletResponse("/rest/workspaces/sf").getStatusCode() );
}
public void testDeleteDefaultNotAllowed() throws Exception {
assertEquals( 405, deleteAsServletResponse("/rest/workspaces/default").getStatusCode() );
}
public void testDeleteAllOneByOne() throws Exception {
for(WorkspaceInfo ws : getCatalog().getWorkspaces()) {
// empty the workspace otherwise we can't remove it
CascadeDeleteVisitor visitor = new CascadeDeleteVisitor(getCatalog());
for(StoreInfo store : getCatalog().getStoresByWorkspace(ws, StoreInfo.class)) {
store.accept(visitor);
}
// actually go and remove the store
String resource = "/rest/workspaces/" + ws.getName();
System.out.println(resource);
assertEquals( 200, deleteAsServletResponse(resource).getStatusCode() );
assertEquals( 404, getAsServletResponse(resource).getStatusCode() );
}
Document dom = getAsDOM( "/rest/workspaces.xml");
assertEquals(0, dom.getElementsByTagName( "workspace").getLength() );
}
public void testDeleteRecursive() throws Exception {
List<StoreInfo> stores = catalog.getStoresByWorkspace("sf", StoreInfo.class);
assertFalse(stores.isEmpty());
MockHttpServletResponse response =
deleteAsServletResponse("/rest/workspaces/sf?recurse=true");
assertEquals(200, response.getStatusCode());
assertNull(catalog.getWorkspaceByName("sf"));
assertNull(catalog.getNamespaceByPrefix("sf"));
for (StoreInfo s : stores) {
assertNull(catalog.getStoreByName(s.getName(), StoreInfo.class));
}
}
public void testPut() throws Exception {
String xml =
"<workspace>" +
"<metadata>" +
"<foo>" +
"<string>bar</string>" +
"</foo>" +
"</metadata>" +
"</workspace>";
MockHttpServletResponse response =
putAsServletResponse("/rest/workspaces/gs", xml, "text/xml" );
assertEquals( 200, response.getStatusCode() );
Document dom = getAsDOM( "/rest/workspaces/gs.xml" );
assertXpathEvaluatesTo("1", "count(//name[text()='gs'])", dom );
assertXpathEvaluatesTo("1", "count(//entry[@key='foo' and text()='bar'])", dom );
}
public void testPutNameChangeForbidden() throws Exception {
String xml =
"<workspace>" +
"<name>changed</name>" +
"</workspace>";
MockHttpServletResponse response =
putAsServletResponse("/rest/workspaces/gs", xml, "text/xml" );
assertEquals( 403, response.getStatusCode() );
}
public void testPutNonExistant() throws Exception {
String xml =
"<workspace>" +
"<metadata>" +
"<entry>" +
"<string>foo</string>" +
"<string>bar</string>" +
"</entry>" +
"</metadata>" +
"</workspace>";
MockHttpServletResponse response =
putAsServletResponse("/rest/workspaces/nonExistant", xml, "text/xml" );
assertEquals( 404, response.getStatusCode() );
}
public void testGetDefaultWorkspace() throws Exception {
Document dom = getAsDOM( "/rest/workspaces/default.xml");
assertEquals( "workspace", dom.getDocumentElement().getLocalName() );
assertEquals( 1, dom.getElementsByTagName( "name" ).getLength() );
}
public void testPutDefaultWorkspace() throws Exception {
WorkspaceInfo def = getCatalog().getDefaultWorkspace();
assertEquals( "gs", def.getName() );
String json = "{'workspace':{ 'name':'sf' }}";
put( "/rest/workspaces/default", json, "text/json");
def = getCatalog().getDefaultWorkspace();
assertEquals( "sf", def.getName() );
}
}