/* (c) 2017 Open Source Geospatial Foundation - all rights reserved
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.rest.catalog;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.hasXPath;
import static org.junit.Assert.*;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.Collections;
import org.custommonkey.xmlunit.XMLUnit;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.SLDHandler;
import org.geoserver.catalog.StyleInfo;
import org.geoserver.catalog.Styles;
import org.geoserver.community.css.web.CssHandler;
import org.geoserver.data.test.SystemTestData;
import org.geoserver.data.test.SystemTestData.StyleProperty;
import org.geoserver.platform.GeoServerResourceLoader;
import org.geoserver.platform.resource.Resource;
import org.geoserver.rest.RestBaseController;
import org.geoserver.test.GeoServerSystemTestSupport;
import org.geotools.styling.Style;
import org.junit.Before;
import org.junit.Test;
import org.springframework.http.MediaType;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.util.xml.SimpleNamespaceContext;
import org.w3c.dom.Document;
public class CssStyleControllerTest extends GeoServerSystemTestSupport {
protected static Catalog catalog;
private static SimpleNamespaceContext namespaceContext;
@Override
protected void onSetUp(SystemTestData testData) throws Exception {
super.onSetUp(testData);
catalog = getCatalog();
namespaceContext = new org.springframework.util.xml.SimpleNamespaceContext();
namespaceContext.bindNamespaceUri("sld", "http://www.opengis.net/sld");
namespaceContext.bindNamespaceUri("ogc", "http://www.opengis.net/ogc");
testData.addStyle(catalog.getDefaultWorkspace(), "test", "test.css",
CssStyleControllerTest.class, catalog,
Collections.singletonMap(StyleProperty.FORMAT, "css"));
}
@Before
public void login() throws Exception {
login("admin", "geoserver", "ROLE_ADMINISTRATOR");
}
@Test
public void getGetAsCSS() throws Exception {
MockHttpServletResponse response = getAsServletResponse(
RestBaseController.ROOT_PATH + "/styles/test.css");
assertEquals(200, response.getStatus());
assertEquals(CssHandler.MIME_TYPE, response.getContentType());
String content = response.getContentAsString();
assertEquals("* {stroke: red}", content);
}
@Test
public void getGetAsSLD10() throws Exception {
MockHttpServletResponse response = getAsServletResponse(
RestBaseController.ROOT_PATH + "/styles/test.sld");
assertEquals(200, response.getStatus());
assertEquals(SLDHandler.MIMETYPE_10, response.getContentType());
Document dom = dom(new ByteArrayInputStream(response.getContentAsByteArray()));
assertThat(dom, hasXPath("//sld:LineSymbolizer/sld:Stroke/sld:CssParameter", namespaceContext, equalTo("#ff0000")));
}
@Test
public void getGetAsHTML() throws Exception {
MockHttpServletResponse response = getAsServletResponse(
RestBaseController.ROOT_PATH + "/styles/test.html");
assertEquals(200, response.getStatus());
assertEquals(MediaType.TEXT_HTML_VALUE, response.getContentType());
String content = response.getContentAsString();
assertThat(content, containsString("<a href=\"http://localhost:8080/geoserver/rest/styles/test.css\">test.css</a>"));
}
@Test
public void testRawPutCSS() throws Exception {
// step 1 create style info with correct format
Catalog cat = getCatalog();
assertNull("foo not available", cat.getStyleByName("foo"));
String xml = "<style>" + "<name>foo</name>" + "<format>css</format>"
+ "<filename>foo.css</filename>" + "</style>";
MockHttpServletResponse response = postAsServletResponse(
RestBaseController.ROOT_PATH + "/styles", xml);
assertEquals(201, response.getStatus());
assertNotNull(cat.getStyleByName("foo"));
// step 2 define css
String content = newCSS();
response = putAsServletResponse("/rest/styles/foo?raw=true", content, CssHandler.MIME_TYPE);
assertEquals(200, response.getStatus());
GeoServerResourceLoader resources = catalog.getResourceLoader();
Resource resource = resources.get("/styles/foo.css");
String definition = new String(resource.getContents());
assertTrue("is css", definition.contains("stroke: red"));
StyleInfo styleInfo = catalog.getStyleByName("foo");
Style s = styleInfo.getStyle();
ByteArrayOutputStream out = new ByteArrayOutputStream();
SLDHandler handler = new SLDHandler();
handler.encode(Styles.sld(s), SLDHandler.VERSION_10, false, out);
content = new String(out.toByteArray());
assertTrue(content.contains("<sld:Name>foo</sld:Name>"));
catalog.remove(styleInfo);
}
@Test
public void testPutCSS() throws Exception {
// step 1 create style info with correct format
Catalog cat = getCatalog();
assertNull(cat.getStyleByName("bar"));
String xml = "<style>" + "<name>bar</name>" + "<format>css</format>"
+ "<filename>bar.css</filename>" + "</style>";
MockHttpServletResponse response = postAsServletResponse(
RestBaseController.ROOT_PATH + "/styles", xml);
assertEquals(201, response.getStatus());
assertNotNull(cat.getStyleByName("bar"));
// step 2 define css
String content = newCSS();
response = putAsServletResponse("/rest/styles/bar", content, CssHandler.MIME_TYPE);
assertEquals(200, response.getStatus());
GeoServerResourceLoader resources = catalog.getResourceLoader();
Resource resource = resources.get("/styles/bar.css");
String definition = new String(resource.getContents());
assertTrue("is css", definition.contains("stroke: red"));
StyleInfo styleInfo = catalog.getStyleByName("bar");
Style s = styleInfo.getStyle();
ByteArrayOutputStream out = new ByteArrayOutputStream();
SLDHandler handler = new SLDHandler();
handler.encode(Styles.sld(s), SLDHandler.VERSION_10, false, out);
content = new String(out.toByteArray());
assertTrue(content.contains("<sld:Name>bar</sld:Name>"));
// step 3 validate css
content = "* { outline: red}";
response = putAsServletResponse("/rest/styles/bar", content, CssHandler.MIME_TYPE);
assertEquals(400, response.getStatus());
catalog.remove(styleInfo);
}
String newCSS() {
return "* { stroke: red}";
}
}