/* (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.featureinfo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.geoserver.catalog.FeatureTypeInfo; import org.geoserver.data.test.MockData; import org.geoserver.wfs.json.JSONType; import org.geoserver.wms.wms_1_1_1.GetFeatureInfoTest; import org.geotools.util.NumberRange; import org.junit.Test; import org.springframework.mock.web.MockHttpServletResponse; public class GetFeatureInfoJSONTest extends GetFeatureInfoTest { /** * Tests JSONP outside of expected polygon * */ @Test public void testSimpleJSONP() throws Exception { String layer = getLayerId(MockData.FORESTS); String request = "wms?version=1.1.1&bbox=-0.002,-0.002,0.002,0.002&styles=&format=jpeg" + "&request=GetFeatureInfo&layers=" + layer + "&query_layers=" + layer + "&width=20&height=20&x=10&y=10" + "&info_format=" + JSONType.jsonp; // JSONP JSONType.setJsonpEnabled(true); MockHttpServletResponse response = getAsServletResponse(request,""); JSONType.setJsonpEnabled(false); // MimeType assertEquals(JSONType.jsonp, response.getContentType()); // Check if the character encoding is the one expected assertTrue("UTF-8".equals(response.getCharacterEncoding())); // Content String result = response.getContentAsString(); assertNotNull(result); assertTrue(result.startsWith(JSONType.CALLBACK_FUNCTION)); assertTrue(result.endsWith(")")); assertTrue(result.indexOf("Green Forest") > 0); result = result.substring(0, result.length() - 1); result = result.substring(JSONType.CALLBACK_FUNCTION.length() + 1, result.length()); JSONObject rootObject = JSONObject.fromObject(result); assertEquals(rootObject.get("type"), "FeatureCollection"); JSONArray featureCol = rootObject.getJSONArray("features"); JSONObject aFeature = featureCol.getJSONObject(0); assertEquals(aFeature.getString("geometry_name"), "the_geom"); } /** * Tests jsonp with custom callback function * */ @Test public void testCustomJSONP() throws Exception { String layer = getLayerId(MockData.FORESTS); String request = "wms?version=1.1.1&bbox=-0.002,-0.002,0.002,0.002&styles=&format=jpeg" + "&request=GetFeatureInfo&layers=" + layer + "&query_layers=" + layer + "&width=20&height=20&x=10&y=10" + "&info_format=" + JSONType.jsonp + "&format_options=" + JSONType.CALLBACK_FUNCTION_KEY + ":custom"; // JSONP JSONType.setJsonpEnabled(true); MockHttpServletResponse response = getAsServletResponse(request,""); JSONType.setJsonpEnabled(false); // MimeType assertEquals(JSONType.jsonp, response.getContentType()); // Check if the character encoding is the one expected assertTrue("UTF-8".equals(response.getCharacterEncoding())); // Content String result = response.getContentAsString(); // System.out.println(result); assertNotNull(result); assertTrue(result.startsWith("custom(")); assertTrue(result.endsWith(")")); assertTrue(result.indexOf("Green Forest") > 0); result = result.substring(0, result.length() - 1); result = result.substring("custom".length() + 1, result.length()); JSONObject rootObject = JSONObject.fromObject(result); assertEquals(rootObject.get("type"), "FeatureCollection"); JSONArray featureCol = rootObject.getJSONArray("features"); JSONObject aFeature = featureCol.getJSONObject(0); assertEquals(aFeature.getString("geometry_name"), "the_geom"); } /** * Tests JSON outside of expected polygon * */ @Test public void testSimpleJSON() throws Exception { String layer = getLayerId(MockData.FORESTS); String request = "wms?version=1.1.1&bbox=-0.002,-0.002,0.002,0.002&styles=&format=jpeg" + "&request=GetFeatureInfo&layers=" + layer + "&query_layers=" + layer + "&width=20&height=20&x=10&y=10" + "&info_format=" + JSONType.json; // JSON MockHttpServletResponse response = getAsServletResponse(request,""); // MimeType assertEquals(JSONType.json, response.getContentType()); // Check if the character encoding is the one expected assertTrue("UTF-8".equals(response.getCharacterEncoding())); // Content String result = response.getContentAsString(); assertNotNull(result); JSONObject rootObject = JSONObject.fromObject(result); assertEquals(rootObject.get("type"), "FeatureCollection"); JSONArray featureCol = rootObject.getJSONArray("features"); JSONObject aFeature = featureCol.getJSONObject(0); assertEquals(aFeature.getString("geometry_name"), "the_geom"); } @Test public void testPropertySelection() throws Exception { String layer = getLayerId(MockData.FORESTS); String request = "wms?service=wms&version=1.1.1&bbox=-0.002,-0.002,0.002,0.002&styles=&format=jpeg" + "&request=GetFeatureInfo&layers=" + layer + "&query_layers=" + layer + "&width=20&height=20&x=10&y=10" + "&info_format=" + JSONType.json + "&propertyName=NAME"; // JSON MockHttpServletResponse response = getAsServletResponse(request,""); // MimeType assertEquals(JSONType.json, response.getContentType()); // Check if the character encoding is the one expected assertTrue("UTF-8".equals(response.getCharacterEncoding())); // Content String result = response.getContentAsString(); assertNotNull(result); JSONObject rootObject = JSONObject.fromObject(result); print(rootObject); assertEquals(rootObject.get("type"), "FeatureCollection"); JSONArray featureCol = rootObject.getJSONArray("features"); JSONObject aFeature = featureCol.getJSONObject(0); assertTrue(aFeature.getJSONObject("geometry").isNullObject()); JSONObject properties = aFeature.getJSONObject("properties"); assertTrue(properties.getJSONObject("FID").isNullObject()); assertEquals("Green Forest", properties.get("NAME")); } @Test public void testReprojectedLayer() throws Exception { String layer = getLayerId(MockData.MPOLYGONS); String request = "wms?version=1.1.1&bbox=500525,500025,500575,500050&styles=&format=jpeg" + "&request=GetFeatureInfo&layers=" + layer + "&query_layers=" + layer + "&width=20&height=20&x=10&y=10" + "&info_format=" + JSONType.json; // JSON JSONObject json = (JSONObject) getAsJSON(request); JSONObject feature = (JSONObject) json.getJSONArray("features").get(0); JSONObject geom = feature.getJSONObject("geometry"); // unroll the geometry and get the first coordinate JSONArray coords = geom.getJSONArray("coordinates").getJSONArray(0).getJSONArray(0).getJSONArray(0); assertTrue(new NumberRange<Double>(Double.class, 500525d, 500575d).contains((Number) coords .getDouble(0))); assertTrue(new NumberRange<Double>(Double.class, 500025d, 500050d).contains((Number) coords .getDouble(1))); } /** * Tests CQL filter * */ @Test public void testCQLFilter() throws Exception { String layer = getLayerId(MockData.FORESTS); String request = "wms?version=1.1.1&bbox=-0.002,-0.002,0.002,0.002&styles=&format=jpeg" + "&request=GetFeatureInfo&layers=" + layer + "&query_layers=" + layer + "&width=20&height=20&x=10&y=10" + "&info_format=" + JSONType.json; JSONObject json = (JSONObject) getAsJSON(request); JSONArray features = json.getJSONArray("features"); assertTrue(features.size() > 0); // Add CQL filter FeatureTypeInfo info = getCatalog().getFeatureTypeByName(layer); try { info.setCqlFilter("NAME LIKE 'Red%'"); getCatalog().save(info); json = (JSONObject) getAsJSON(request); features = json.getJSONArray("features"); assertEquals(0, features.size()); } finally { info = getCatalog().getFeatureTypeByName(layer); info.setCqlFilter(null); getCatalog().save(info); } } }