/* 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.NamespaceInfo;
import org.geoserver.catalog.ResourceInfo;
import org.geoserver.data.test.MockData;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import com.mockrunner.mock.web.MockHttpServletResponse;
public class NamespaceTest extends CatalogRESTTestSupport {
public void testGetAllAsXML() throws Exception {
Document dom = getAsDOM( "/rest/namespaces.xml");
assertEquals( catalog.getNamespaces().size() ,
dom.getElementsByTagName( "namespace").getLength() );
}
public void testGetAllAsJSON() throws Exception {
JSON json = getAsJSON( "/rest/namespaces.json");
assertTrue( json instanceof JSONObject );
JSONArray namespaces = ((JSONObject)json).getJSONObject("namespaces").getJSONArray("namespace");
assertNotNull( namespaces );
assertEquals( catalog.getNamespaces().size() , namespaces.size() );
}
public void testGetAllAsHTML() throws Exception {
Document dom = getAsDOM( "/rest/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") );
}
}
public void testPutAllUnauthorized() throws Exception {
assertEquals( 405, putAsServletResponse( "/rest/namespaces" ).getStatusCode() );
}
public void testDeleteAllUnauthorized() throws Exception {
assertEquals( 405, deleteAsServletResponse( "/rest/namespaces").getStatusCode() );
}
public void testGetAsXML() throws Exception {
Document dom = getAsDOM( "/rest/namespaces/sf.xml");
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() );
}
public void testGetAsHTML() throws Exception {
Document dom = getAsDOM( "/rest/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() ) );
}
}
public void testGetNonExistant() throws Exception {
assertEquals( 404, getAsServletResponse( "/rest/namespaces/none").getStatusCode() );
}
public void testPostAsXML() throws Exception {
String xml =
"<namespace>" +
"<prefix>foo</prefix>" +
"<uri>http://foo.com</uri>" +
"</namespace>";
MockHttpServletResponse response = postAsServletResponse( "/rest/namespaces", xml, "text/xml" );
assertEquals( 201, response.getStatusCode() );
assertNotNull( response.getHeader( "Location") );
assertTrue( response.getHeader("Location").endsWith( "/namespaces/foo" ) );
NamespaceInfo ws = getCatalog().getNamespaceByPrefix( "foo" );
assertNotNull(ws);
}
public void testGetAsJSON() throws Exception {
JSON json = getAsJSON( "/rest/namespaces/sf.json");
JSONObject namespace = ((JSONObject) json).getJSONObject( "namespace") ;
assertEquals( "sf", namespace.get( "prefix" ) );
assertEquals( MockData.SF_URI, namespace.get( "uri" ) );
}
public void testPostAsJSON() throws Exception {
String json = "{'namespace':{ 'prefix':'foo', 'uri':'http://foo.com' }}";
MockHttpServletResponse response = postAsServletResponse( "/rest/namespaces", json, "text/json" );
assertEquals( 201, response.getStatusCode() );
assertNotNull( response.getHeader( "Location") );
assertTrue( response.getHeader("Location").endsWith( "/namespaces/foo" ) );
NamespaceInfo ws = getCatalog().getNamespaceByPrefix( "foo" );
assertNotNull(ws);
}
public void testPostToResource() throws Exception {
String xml =
"<namespace>" +
"<name>changed</name>" +
"</namespace>";
MockHttpServletResponse response =
postAsServletResponse("/rest/namespaces/gs", xml, "text/xml" );
assertEquals( 405, response.getStatusCode() );
}
public void testDeleteNonExistant() throws Exception {
assertEquals( 404, deleteAsServletResponse("/rest/namespaces/newExistant").getStatusCode() );
}
public void testDelete() throws Exception {
String xml =
"<namespace>" +
"<prefix>foo</prefix>" +
"<uri>http://foo.com</uri>" +
"</namespace>";
post( "/rest/namespaces", xml );
Document dom = getAsDOM( "/rest/namespaces/foo.xml");
assertEquals( "namespace", dom.getDocumentElement().getNodeName() );
assertEquals( 200, deleteAsServletResponse( "/rest/namespaces/foo" ).getStatusCode() );
assertEquals( 404, getAsServletResponse( "/rest/namespaces/foo.xml" ).getStatusCode() );
}
public void testDeleteNonEmpty() throws Exception {
assertEquals( 401, deleteAsServletResponse("/rest/namespaces/sf").getStatusCode() );
}
public void testPut() throws Exception {
String xml =
"<namespace>" +
"<uri>http://changed</uri>" +
"</namespace>";
MockHttpServletResponse response =
putAsServletResponse("/rest/namespaces/gs", xml, "text/xml" );
assertEquals( 200, response.getStatusCode() );
Document dom = getAsDOM( "/rest/namespaces/gs.xml" );
assertXpathEvaluatesTo("1", "count(//namespace/uri[text()='http://changed'])", dom );
}
public void testPutNonExistant() throws Exception {
String xml =
"<namespace>" +
"<name>changed</name>" +
"</namespace>";
MockHttpServletResponse response =
putAsServletResponse("/rest/namespaces/nonExistant", xml, "text/xml" );
assertEquals( 404, response.getStatusCode() );
}
public void testGetDefaultNamespace() throws Exception {
Document dom = getAsDOM( "/rest/namespaces/default.xml");
assertEquals( "namespace", dom.getDocumentElement().getLocalName() );
assertEquals( 1, dom.getElementsByTagName( "prefix" ).getLength() );
assertEquals( 1, dom.getElementsByTagName( "uri" ).getLength() );
}
public void testPutDefaultNamespace() throws Exception {
NamespaceInfo def = getCatalog().getDefaultNamespace();
assertEquals( "gs", def.getPrefix() );
String json = "{'namespace':{ 'prefix':'sf' }}";
put( "/rest/namespaces/default", json, "text/json");
def = getCatalog().getDefaultNamespace();
assertEquals( "sf", def.getPrefix() );
}
}