/* (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.wms.legendgraphic; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.net.URL; import java.util.HashMap; import java.util.Locale; import java.util.Map; import org.geoserver.platform.ServiceException; import org.geoserver.wms.GetLegendGraphicRequest; import org.geoserver.wms.WMS; import org.geoserver.wms.WMSTestSupport; import org.geotools.feature.NameImpl; import org.geotools.styling.Style; import org.junit.Before; import org.opengis.feature.type.Name; import org.springframework.mock.web.MockHttpServletRequest; public class GetLegendGraphicKvpReaderTest extends WMSTestSupport { /** * request reader to test against, initialized by default with all parameters from * <code>requiredParameters</code> and <code>optionalParameters</code> */ GetLegendGraphicKvpReader requestReader; /** test values for required parameters */ Map<String, String> requiredParameters; /** test values for optional parameters */ Map<String, String> optionalParameters; /** both required and optional parameters joint up */ Map<String, String> allParameters; /** mock request */ MockHttpServletRequest httpRequest; /** mock config object */ WMS wms; /** * Remainder: * <ul> * <li>VERSION/Required * <li>REQUEST/Required * <li>LAYER/Required * <li>FORMAT/Required * <li>STYLE/Optional * <li>FEATURETYPE/Optional * <li>RULE/Optional * <li>SCALE/Optional * <li>SLD/Optional * <li>SLD_BODY/Optional * <li>WIDTH/Optional * <li>HEIGHT/Optional * <li>LANGUAGE/Optional * <li>EXCEPTIONS/Optional * </ul> */ @Before public void setParameters() throws Exception { requiredParameters = new HashMap<String, String>(); requiredParameters.put("VERSION", "1.0.0"); requiredParameters.put("REQUEST", "GetLegendGraphic"); requiredParameters.put("LAYER", "cite:Ponds"); requiredParameters.put("FORMAT", "image/png"); optionalParameters = new HashMap<String, String>(); optionalParameters.put("STYLE", "Ponds"); optionalParameters.put("FEATURETYPE", "fake_not_used"); // optionalParameters.put("RULE", "testRule"); optionalParameters.put("SCALE", "1000"); optionalParameters.put("WIDTH", "120"); optionalParameters.put("HEIGHT", "90"); optionalParameters.put("LANGUAGE", "en"); // ??optionalParameters.put("EXCEPTIONS", ""); allParameters = new HashMap<String, String>(requiredParameters); allParameters.putAll(optionalParameters); wms = getWMS(); this.requestReader = new GetLegendGraphicKvpReader(wms); this.httpRequest = createRequest("wms", allParameters); } /** * This test ensures that when a SLD parameter has been passed that refers to a SLD document * with multiple styles, the required one is choosed based on the LAYER parameter. * <p> * This is the case where a remote SLD document is used in "library" mode. * </p> * */ @org.junit.Test public void testRemoteSLDMultipleStyles() throws Exception { final URL remoteSldUrl = getClass().getResource("MultipleStyles.sld"); this.allParameters.put("SLD", remoteSldUrl.toExternalForm()); this.allParameters.put("LAYER", "cite:Ponds"); this.allParameters.put("STYLE", "Ponds"); GetLegendGraphicRequest request = requestReader.read(new GetLegendGraphicRequest(), allParameters, allParameters); // the style names Ponds is declared in third position on the sld doc Style selectedStyle = request.getStyles().get(0); assertNotNull(selectedStyle); assertEquals("Ponds", selectedStyle.getName()); this.allParameters.put("LAYER", "cite:Lakes"); this.allParameters.put("STYLE", "Lakes"); request = requestReader.read(new GetLegendGraphicRequest(), allParameters, allParameters); // the style names Ponds is declared in third position on the sld doc selectedStyle = request.getStyles().get(0); assertNotNull(selectedStyle); assertEquals("Lakes", selectedStyle.getName()); } @org.junit.Test public void testMissingLayerParameter() throws Exception { requiredParameters.remove("LAYER"); try { requestReader.read(new GetLegendGraphicRequest(), requiredParameters, requiredParameters); fail("Expected ServiceException"); } catch (ServiceException e) { assertEquals("LayerNotDefined", e.getCode()); } } @org.junit.Test public void testMissingFormatParameter() throws Exception { requiredParameters.remove("FORMAT"); try { requestReader.read(new GetLegendGraphicRequest(), requiredParameters, requiredParameters); fail("Expected ServiceException"); } catch (ServiceException e) { assertEquals("MissingFormat", e.getCode()); } } @org.junit.Test public void testStrictParameter() throws Exception { GetLegendGraphicRequest request; // default value request = requestReader.read(new GetLegendGraphicRequest(), allParameters, allParameters); assertTrue(request.isStrict()); allParameters.put("STRICT", "false"); allParameters.remove("LAYER"); request = requestReader.read(new GetLegendGraphicRequest(), allParameters, allParameters); assertFalse(request.isStrict()); } @org.junit.Test public void testLayerGroup() throws Exception { GetLegendGraphicRequest request; request = requestReader.read(new GetLegendGraphicRequest(), requiredParameters, requiredParameters); assertTrue(request.getLayers().size() == 1); requiredParameters.put("LAYER", NATURE_GROUP); request = requestReader.read(new GetLegendGraphicRequest(), requiredParameters, requiredParameters); assertTrue(request.getLayers().size() > 1); } @org.junit.Test public void testLanguage() throws Exception { GetLegendGraphicRequest request; request = requestReader.read(new GetLegendGraphicRequest(), requiredParameters, requiredParameters); assertNull(request.getLocale()); request = requestReader.read(new GetLegendGraphicRequest(), allParameters, allParameters); assertEquals(Locale.ENGLISH, request.getLocale()); } @org.junit.Test public void testStylesForLayerGroup() throws Exception { GetLegendGraphicRequest request; requiredParameters.put("LAYER", NATURE_GROUP); requiredParameters.put("STYLE", "style1,style2"); request = requestReader.read(new GetLegendGraphicRequest(), requiredParameters, requiredParameters); assertTrue(request.getStyles().size() == 2); } @org.junit.Test public void testRulesForLayerGroup() throws Exception { GetLegendGraphicRequest request; requiredParameters.put("LAYER", NATURE_GROUP); requiredParameters.put("RULE", "rule1,rule2"); request = requestReader.read(new GetLegendGraphicRequest(), requiredParameters, requiredParameters); assertTrue(request.getRules().size() == 2); } @org.junit.Test public void testLabelsForLayerGroup() throws Exception { GetLegendGraphicRequest request; requiredParameters.put("LAYER", NATURE_GROUP); request = requestReader.read(new GetLegendGraphicRequest(), requiredParameters, requiredParameters); assertNotNull(request.getTitle(new NameImpl("http://www.opengis.net/cite","Lakes"))); } }