package org.mapfish.print.output; import org.json.JSONArray; import org.json.JSONObject; import org.junit.Test; import org.mapfish.print.AbstractMapfishSpringTest; import org.mapfish.print.TestHttpClientFactory; import org.mapfish.print.attribute.DataSourceAttribute; import org.mapfish.print.attribute.LegendAttribute; import org.mapfish.print.attribute.TableAttribute; import org.mapfish.print.config.Configuration; import org.mapfish.print.config.ConfigurationFactory; import org.mapfish.print.config.Template; import org.mapfish.print.parser.MapfishParser; import org.mapfish.print.wrapper.ObjectMissingException; import org.mapfish.print.wrapper.json.PJsonObject; import org.springframework.beans.factory.annotation.Autowired; import java.io.File; import java.util.Map; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; /** * Test creating values objects. */ public class ValuesTest extends AbstractMapfishSpringTest { public static final String BASE_DIR = "values/"; @Autowired private ConfigurationFactory configurationFactory; @Autowired private MapfishParser parser; @Autowired private TestHttpClientFactory httpRequestFactory; @Test public void testNoDefaults() throws Exception { configurationFactory.setDoValidation(false); PJsonObject requestData = parseJSONObjectFromFile(ValuesTest.class, BASE_DIR + "requestData.json"); final Configuration config = configurationFactory.getConfig(getFile(BASE_DIR + "config-no-defaults.yaml")); Template template = config.getTemplates().values().iterator().next(); final Values values = new Values(requestData, template, this.parser, new File("tmp"), this.httpRequestFactory, new File(".")); assertTrue(values.containsKey("title")); assertEquals("title", values.getString("title")); assertEquals(134, values.getInteger("count").intValue()); assertEquals(2.0, values.getObject("ratio", Double.class), 0.00001); assertTrue(values.containsKey("legend")); assertEquals("legendName", values.getObject("legend", LegendAttribute.LegendAttributeValue.class).name); assertTrue(values.containsKey("datasource")); final Map<String, Object>[] attributesValues = values.getObject("datasource", DataSourceAttribute.DataSourceAttributeValue.class) .attributesValues; assertEquals(1, attributesValues.length); assertEquals("requestDataName", attributesValues[0].get("name")); final TableAttribute.TableAttributeValue table = (TableAttribute.TableAttributeValue) attributesValues[0].get("table"); assertEquals("requestId", table.columns[0]); } @Test(expected = ObjectMissingException.class) public void testNoDefaults_Error_OnMissing_Attribute() throws Exception { configurationFactory.setDoValidation(false); final JSONObject obj = new JSONObject(); PJsonObject requestData = new PJsonObject(obj, ""); final JSONObject atts = new JSONObject(); obj.put("attributes", atts); final Configuration config = configurationFactory.getConfig(getFile(BASE_DIR + "config-no-defaults.yaml")); Template template = config.getTemplates().values().iterator().next(); new Values(requestData, template, this.parser, new File("tmp"), this.httpRequestFactory, new File(".")); } @Test public void testDefaults() throws Exception { configurationFactory.setDoValidation(false); final JSONObject obj = new JSONObject(); PJsonObject requestData = new PJsonObject(obj, ""); final JSONObject atts = new JSONObject(); obj.put("attributes", atts); final Configuration config = configurationFactory.getConfig(getFile(BASE_DIR + "config-defaults.yaml")); Template template = config.getTemplates().values().iterator().next(); final Values values = new Values(requestData, template, this.parser, new File("tmp"), this.httpRequestFactory, new File(".")); assertTrue(values.containsKey("title")); assertEquals("title", values.getString("title")); assertEquals(134, values.getInteger("count").intValue()); assertEquals(2.0, values.getObject("ratio", Double.class), 0.00001); assertTrue(values.containsKey("legend")); assertEquals("legendName", values.getObject("legend", LegendAttribute.LegendAttributeValue.class).name); assertTrue(values.containsKey("datasource")); final Map<String, Object>[] attributesValues = values.getObject("datasource", DataSourceAttribute.DataSourceAttributeValue.class) .attributesValues; assertEquals(1, attributesValues.length); assertEquals("name", attributesValues[0].get("name")); final TableAttribute.TableAttributeValue table = (TableAttribute.TableAttributeValue) attributesValues[0].get("table"); assertEquals("id", table.columns[0]); } @Test(expected = IllegalArgumentException.class) public void testExpectObjectGetArray() throws Exception { PJsonObject requestData = parseJSONObjectFromFile(ValuesTest.class, BASE_DIR + "requestData.json"); String badLegendConf = "[{\n" + " \"name\": \"\",\n" + " \"classes\": [{\n" + " \"name\": \"osm\",\n" + " \"icons\": [\"http://localhost:9876/e2egeoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0" + ".0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=topp:states\"]\n" + " }]\n" + "}]\n"; requestData.getInternalObj().getJSONObject("attributes").put("legend", new JSONArray(badLegendConf)); final Configuration config = configurationFactory.getConfig(getFile(BASE_DIR + "config-no-defaults.yaml")); Template template = config.getTemplates().values().iterator().next(); new Values(requestData, template, this.parser, new File("tmp"), this.httpRequestFactory, new File(".")); } }