/* (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.web.data.layergroup;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.Serializable;
import org.apache.wicket.Component;
import org.apache.wicket.feedback.FeedbackMessage;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.tester.FormTester;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.LayerGroupInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.data.test.MockData;
import org.geoserver.web.data.resource.MetadataLinkEditor;
import org.geoserver.web.wicket.DecimalTextField;
import org.geoserver.web.wicket.EnvelopePanel;
import org.geotools.factory.CommonFactoryFinder;
import org.junit.Before;
import org.junit.Test;
import org.opengis.filter.Filter;
import org.opengis.filter.FilterFactory;
public class LayerGroupEditPageTest extends LayerGroupBaseTest {
@Test
public void testComputeBounds() {
LayerGroupEditPage page = new LayerGroupEditPage(new PageParameters().add("group", "lakes"));
tester.startPage(page);
// print(page, true, false);
tester.assertRenderedPage(LayerGroupEditPage.class);
// remove the first and second elements
// tester.clickLink("form:layers:layers:listContainer:items:1:itemProperties:4:component:link");
// the regenerated list will have ids starting from 4
//tester.clickLink("form:layers:layers:listContainer:items:4:itemProperties:4:component:link");
// manually regenerate bounds
tester.clickLink("publishedinfo:tabs:panel:generateBounds");
// print(page, true, true);
// submit the form
tester.submitForm("publishedinfo");
// For the life of me I cannot get this test to work... and I know by direct UI inspection that
// the page works as expected...
// FeatureTypeInfo bridges = getCatalog().getResourceByName(MockData.BRIDGES.getLocalPart(), FeatureTypeInfo.class);
// assertEquals(getCatalog().getLayerGroupByName("lakes").getBounds(), bridges.getNativeBoundingBox());
}
@Test
public void testComputeBoundsFromCRS() {
LayerGroupEditPage page = new LayerGroupEditPage(new PageParameters().add("group", "lakes"));
tester.startPage(page);
tester.assertRenderedPage(LayerGroupEditPage.class);
FormTester form = tester.newFormTester("publishedinfo");
form.setValue("tabs:panel:bounds:crsContainer:crs:srs", "EPSG:4326");
tester.clickLink("publishedinfo:tabs:panel:generateBoundsFromCRS", true);
tester.assertComponentOnAjaxResponse("publishedinfo:tabs:panel:bounds");
Component ajaxComponent = tester.getComponentFromLastRenderedPage("publishedinfo:tabs:panel:bounds");
assert(ajaxComponent instanceof EnvelopePanel);
EnvelopePanel envPanel = (EnvelopePanel)ajaxComponent;
assertEquals(((DecimalTextField)envPanel.get("minX")).getModelObject(), new Double(-180.0));
assertEquals(((DecimalTextField)envPanel.get("minY")).getModelObject(), new Double(-90.0));
assertEquals(((DecimalTextField)envPanel.get("maxX")).getModelObject(), new Double(180.0));
assertEquals(((DecimalTextField)envPanel.get("maxY")).getModelObject(), new Double(90.0));
}
@Before
public void doLogin() {
login();
}
@Test
public void testMissingName() {
LayerGroupEditPage page = new LayerGroupEditPage();
// print(page, false, false);
tester.startPage(page);
tester.assertRenderedPage(LayerGroupEditPage.class);
FormTester form = tester.newFormTester("publishedinfo");
form.submit();
// should not work, no name provided, so we remain
// in the same page
tester.assertRenderedPage(LayerGroupEditPage.class);
tester.assertErrorMessages((Serializable[]) new String[] {"Field 'Name' is required.", "Field 'Bounds' is required."});
}
@Test
public void testMissingCRS() {
LayerGroupEditPage page = new LayerGroupEditPage();
// print(page, false, false);
tester.startPage(page);
tester.assertRenderedPage(LayerGroupEditPage.class);
FormTester form = tester.newFormTester("publishedinfo");
form.setValue("tabs:panel:name", "lakes");
form.setValue("tabs:panel:bounds:minX", "-180");
form.setValue("tabs:panel:bounds:minY", "-90");
form.setValue("tabs:panel:bounds:maxX", "180");
form.setValue("tabs:panel:bounds:maxY", "90");
page.lgEntryPanel.getEntries().add(
new LayerGroupEntry(getCatalog().getLayerByName(getLayerId(MockData.LAKES)), null));
form.submit("save");
// should not work, duplicate provided, so we remain
// in the same page
tester.assertRenderedPage(LayerGroupEditPage.class);
assertEquals(1, tester.getMessages(FeedbackMessage.ERROR).size());
String message = tester.getMessages(FeedbackMessage.ERROR).get(0).toString();
assertTrue(message.contains("Bounds"));
}
@Test
public void testDuplicateName() {
LayerGroupEditPage page = new LayerGroupEditPage();
// print(page, false, false);
tester.startPage(page);
tester.assertRenderedPage(LayerGroupEditPage.class);
FormTester form = tester.newFormTester("publishedinfo");
form.setValue("tabs:panel:name", "lakes");
form.setValue("tabs:panel:bounds:minX", "0");
form.setValue("tabs:panel:bounds:minY", "0");
form.setValue("tabs:panel:bounds:maxX", "0");
form.setValue("tabs:panel:bounds:maxY", "0");
form.setValue("tabs:panel:bounds:crsContainer:crs:srs", "EPSG:4326");
page.lgEntryPanel.getEntries().add(
new LayerGroupEntry(getCatalog().getLayerByName(getLayerId(MockData.LAKES)), null));
form.submit("save");
// should not work, duplicate provided, so we remain
// in the same page
tester.assertRenderedPage(LayerGroupEditPage.class);
assertEquals(1, tester.getMessages(FeedbackMessage.ERROR).size());
assertTrue(tester.getMessages(FeedbackMessage.ERROR).get(0).toString()
.endsWith("Layer group named 'lakes' already exists"));
}
@Test
public void testNewName() {
LayerGroupEditPage page = new LayerGroupEditPage();
// print(page, false, false);
tester.startPage(page);
tester.assertRenderedPage(LayerGroupEditPage.class);
FormTester form = tester.newFormTester("publishedinfo");
form.setValue("tabs:panel:name", "newGroup");
form.submit();
// should work, we switch to the edit page
tester.assertRenderedPage(LayerGroupEditPage.class);
tester.assertErrorMessages((Serializable[]) new String[] {"Field 'Bounds' is required."});
}
@Test
public void testLayerLink() {
LayerGroupEditPage page = new LayerGroupEditPage();
// Create the new page
tester.startPage(page);
tester.assertRenderedPage(LayerGroupEditPage.class);
// Click on the link
tester.clickLink("publishedinfo:tabs:panel:layers:addLayer");
tester.assertNoErrorMessage();
// Ensure that the Layer List page is rendered correctly
tester.assertComponent("publishedinfo:tabs:panel:layers:popup:content:listContainer:items", DataView.class);
// Get the DataView containing the Layer List
DataView<?> dataView = (DataView<?>) page.lgEntryPanel.get("popup:content:listContainer:items");
// Ensure that the Row count is equal to the Layers in the Catalog
Catalog catalog = getGeoServerApplication().getCatalog();
int layerCount = catalog.count(LayerInfo.class, Filter.INCLUDE);
int rowCount = (int) dataView.getRowCount();
assertEquals(layerCount, rowCount);
}
@Test
public void testLayerLinkWithWorkspace() {
LayerGroupEditPage page = new LayerGroupEditPage(
new PageParameters().add("workspace", "cite").add("group", "bridges"));
// Create the new page
tester.startPage(page);
tester.assertRenderedPage(LayerGroupEditPage.class);
// Click on the link
tester.clickLink("publishedinfo:tabs:panel:layers:addLayer");
tester.assertNoErrorMessage();
// Ensure that the Layer List page is rendered correctly
tester.assertComponent("publishedinfo:tabs:panel:layers:popup:content:listContainer:items", DataView.class);
// Get the DataView containing the Layer List
DataView<?> dataView = (DataView<?>) page.lgEntryPanel.get("popup:content:listContainer:items");
// Ensure that the Row count is equal to the Layers in the Catalog
Catalog catalog = getGeoServerApplication().getCatalog();
FilterFactory ff = CommonFactoryFinder.getFilterFactory2();
final Filter filter = ff.equal(ff.property("resource.store.workspace.id"),
ff.literal(catalog.getWorkspaceByName("cite").getId()),true);
int layerCount = catalog.count(LayerInfo.class, filter);
int rowCount = (int) dataView.getRowCount();
assertEquals(layerCount, rowCount);
}
@Test
public void testLayerGroupLinkWithWorkspace() {
LayerGroupEditPage page = new LayerGroupEditPage(
new PageParameters().add("workspace", "cite").add("group", "bridges"));
// Create the new page
tester.startPage(page);
tester.assertRenderedPage(LayerGroupEditPage.class);
// Click on the link
tester.clickLink("publishedinfo:tabs:panel:layers:addLayerGroup");
tester.assertNoErrorMessage();
// Ensure that the Layer List page is rendered correctly
tester.assertComponent("publishedinfo:tabs:panel:layers:popup:content:listContainer:items", DataView.class);
// Get the DataView containing the Layer List
DataView<?> dataView = (DataView<?>) page.lgEntryPanel.get("popup:content:listContainer:items");
// Ensure that the Row count is equal to the Layers in the Catalog
Catalog catalog = getGeoServerApplication().getCatalog();
int layerGroupCount = catalog.getLayerGroupsByWorkspace("cite").size();
int rowCount = (int) dataView.getRowCount();
assertEquals(layerGroupCount, rowCount);
}
@Test
public void testMetadataLinks() {
LayerGroupEditPage page = new LayerGroupEditPage();
// Create the new page
tester.startPage(page);
tester.assertRenderedPage(LayerGroupEditPage.class);
// Ensure that the Layer List page is rendered correctly
tester.assertComponent("publishedinfo:tabs:panel:metadataLinks", MetadataLinkEditor.class);
FormTester form = tester.newFormTester("publishedinfo");
form.setValue("tabs:panel:name", "lakes");
form.setValue("tabs:panel:bounds:minX", "0");
form.setValue("tabs:panel:bounds:minY", "0");
form.setValue("tabs:panel:bounds:maxX", "0");
form.setValue("tabs:panel:bounds:maxY", "0");
form.setValue("tabs:panel:bounds:crsContainer:crs:srs", "EPSG:4326");
tester.executeAjaxEvent("publishedinfo:tabs:panel:metadataLinks:addlink", "click");
form.setValue("tabs:panel:metadataLinks:container:table:links:0:urlBorder:urlBorder_body:metadataLinkURL", "http://test.me");
tester.executeAjaxEvent("publishedinfo:tabs:panel:metadataLinks:addlink", "click");
LayerGroupInfo info = page.getPublishedInfo();
assertEquals(2, info.getMetadataLinks().size());
assertEquals("http://test.me", info.getMetadataLinks().get(0).getContent());
}
}