org.geoserver.web.admin.AbstractAdminPrivilegeTest.java Source code

Java tutorial

Introduction

Here is the source code for org.geoserver.web.admin.AbstractAdminPrivilegeTest.java

Source

/* (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.admin;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

import java.io.IOException;
import java.util.Arrays;
import java.util.Iterator;

import org.apache.wicket.core.request.handler.PageProvider;
import org.apache.wicket.core.request.handler.RenderPageRequestHandler;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.request.IRequestHandler;
import org.apache.wicket.request.Response;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.CatalogBuilder;
import org.geoserver.catalog.LayerGroupInfo;
import org.geoserver.catalog.ResourceInfo;
import org.geoserver.catalog.StoreInfo;
import org.geoserver.catalog.WorkspaceInfo;
import org.geoserver.data.test.MockData;
import org.geoserver.data.test.SystemTestData;
import org.geoserver.security.AdminRequest;
import org.geoserver.web.GeoServerWicketTestSupport;
import org.geoserver.web.UnauthorizedPage;
import org.geoserver.web.data.layer.LayerPage;
import org.geoserver.web.data.layer.NewFeatureTypePage;
import org.geoserver.web.data.layer.SQLViewNewPage;
import org.geoserver.web.data.layergroup.LayerGroupEditPage;
import org.geoserver.web.data.layergroup.LayerGroupPage;
import org.geoserver.web.data.store.DataAccessEditPage;
import org.geoserver.web.data.store.DataAccessNewPage;
import org.geoserver.web.data.store.StorePage;
import org.geoserver.web.data.workspace.WorkspaceEditPage;
import org.geoserver.web.data.workspace.WorkspaceNewPage;
import org.geoserver.web.data.workspace.WorkspacePage;
import org.geotools.data.property.PropertyDataStoreFactory;
import org.junit.After;
import org.junit.Test;

public abstract class AbstractAdminPrivilegeTest extends GeoServerWicketTestSupport {

    @Override
    protected void onSetUp(SystemTestData testData) throws Exception {
        super.onSetUp(testData);

        addUser("cite", "cite", null, Arrays.asList("ROLE_CITE_ADMIN"));
        addUser("sf", "sf", null, Arrays.asList("ROLE_SF_ADMIN"));

        setupAccessRules();

        Catalog cat = getCatalog();

        //add two workspace local layer group
        LayerGroupInfo lg = cat.getFactory().createLayerGroup();
        lg.setName("cite_local");
        lg.setWorkspace(cat.getWorkspaceByName("cite"));
        lg.getLayers().add(cat.getLayerByName(getLayerId(MockData.LAKES)));
        lg.getLayers().add(cat.getLayerByName(getLayerId(MockData.FORESTS)));
        new CatalogBuilder(cat).calculateLayerGroupBounds(lg);
        cat.add(lg);

        lg = cat.getFactory().createLayerGroup();
        lg.setName("sf_local");
        lg.setWorkspace(cat.getWorkspaceByName("sf"));
        lg.getLayers().add(cat.getLayerByName(getLayerId(MockData.PRIMITIVEGEOFEATURE)));
        lg.getLayers().add(cat.getLayerByName(getLayerId(MockData.AGGREGATEGEOFEATURE)));
        new CatalogBuilder(cat).calculateLayerGroupBounds(lg);
        cat.add(lg);

        // add two global layer group
        lg = cat.getFactory().createLayerGroup();
        lg.setName("cite_global");
        lg.getLayers().add(cat.getLayerByName(getLayerId(MockData.LAKES)));
        lg.getLayers().add(cat.getLayerByName(getLayerId(MockData.FORESTS)));
        new CatalogBuilder(cat).calculateLayerGroupBounds(lg);
        cat.add(lg);

        lg = cat.getFactory().createLayerGroup();
        lg.setName("sf_global");
        lg.getLayers().add(cat.getLayerByName(getLayerId(MockData.PRIMITIVEGEOFEATURE)));
        lg.getLayers().add(cat.getLayerByName(getLayerId(MockData.AGGREGATEGEOFEATURE)));
        new CatalogBuilder(cat).calculateLayerGroupBounds(lg);
        cat.add(lg);
    }

    protected abstract void setupAccessRules() throws IOException;

    @After
    public void finishAdminRequest() {
        AdminRequest.finish();
    }

    void loginAsCite() {
        login("cite", "cite", "ROLE_CITE_ADMIN");
    }

    void loginAsSf() {
        login("sf", "sf", "ROLE_SF_ADMIN");
    }

    @Test
    public void testWorkspaceAllPage() throws Exception {
        loginAsCite();

        tester.startPage(WorkspacePage.class);
        tester.assertRenderedPage(WorkspacePage.class);
        tester.assertNoErrorMessage();

        //assert only cite workspace visible
        DataView dv = (DataView) tester.getComponentFromLastRenderedPage("table:listContainer:items");
        assertEquals(1, dv.size());

        //the actual web request is finished, so we need to fake another one
        AdminRequest.start(new Object());
        assertEquals(1, dv.getDataProvider().size());

        WorkspaceInfo ws = (WorkspaceInfo) dv.getDataProvider().iterator(0, 1).next();
        assertEquals("cite", ws.getName());
    }

    @Test
    public void testWorkspaceNewPage() throws Exception {
        loginAsCite();

        tester.startPage(WorkspaceNewPage.class);
        tester.assertRenderedPage(UnauthorizedPage.class);
    }

    @Test
    public void testWorkspaceEditPage() throws Exception {
        loginAsCite();

        tester.startPage(WorkspaceEditPage.class, new PageParameters().add("name", "cite"));
        tester.assertRenderedPage(WorkspaceEditPage.class);
        tester.assertNoErrorMessage();
    }

    @Test
    public void testWorkspaceEditPageUnauthorized() throws Exception {
        loginAsCite();
        tester.startPage(WorkspaceEditPage.class, new PageParameters().add("name", "cdf"));
        tester.assertErrorMessages(new String[] { "Could not find workspace \"cdf\"" });
    }

    @Test
    public void testLayerAllPage() throws Exception {
        loginAsCite();
        tester.startPage(LayerPage.class);
        tester.assertRenderedPage(LayerPage.class);
        print(tester.getLastRenderedPage(), true, true, true);

        DataView dv = (DataView) tester.getComponentFromLastRenderedPage("table:listContainer:items");
        assertEquals(getCatalog().getResourcesByNamespace("cite", ResourceInfo.class).size(), dv.size());
    }

    @Test
    public void testStoreAllPage() throws Exception {
        loginAsCite();

        tester.startPage(StorePage.class);
        tester.assertRenderedPage(StorePage.class);
        tester.assertNoErrorMessage();

        DataView dv = (DataView) tester.getComponentFromLastRenderedPage("table:listContainer:items");
        assertEquals(getCatalog().getStoresByWorkspace("cite", StoreInfo.class).size(), dv.size());
    }

    @Test
    public void testStoreNewPage() throws Exception {
        loginAsCite();

        final String dataStoreFactoryDisplayName = new PropertyDataStoreFactory().getDisplayName();
        tester.startPage(new DataAccessNewPage(dataStoreFactoryDisplayName));
        tester.assertRenderedPage(DataAccessNewPage.class);
        tester.assertNoErrorMessage();

        //the actual web request is finished, so we need to fake another one
        AdminRequest.start(new Object());

        DropDownChoice<WorkspaceInfo> wsChoice = (DropDownChoice<WorkspaceInfo>) tester
                .getComponentFromLastRenderedPage("dataStoreForm:workspacePanel:border:border_body:paramValue");

        assertEquals(1, wsChoice.getChoices().size());
        assertEquals("cite", wsChoice.getChoices().get(0).getName());
    }

    @Test
    public void testStoreEditPage() throws Exception {
        loginAsCite();

        tester.startPage(DataAccessEditPage.class,
                new PageParameters().add("wsName", "cite").add("storeName", "cite"));
        tester.assertRenderedPage(DataAccessEditPage.class);
        tester.assertNoErrorMessage();
    }

    @Test
    public void testStoreEditPageUnauthorized() throws Exception {
        loginAsCite();

        tester.startPage(DataAccessEditPage.class,
                new PageParameters().add("wsName", "cdf").add("storeName", "cdf"));
        tester.assertRenderedPage(StorePage.class);
        tester.assertErrorMessages(new String[] { "Could not find data store \"cdf\" in workspace \"cdf\"" });
    }

    @Test
    public void testLayerGroupAllPageAsAdmin() throws Exception {
        login();
        tester.startPage(LayerGroupPage.class);
        tester.assertRenderedPage(LayerGroupPage.class);

        Catalog cat = getCatalog();

        DataView view = (DataView) tester.getComponentFromLastRenderedPage("table:listContainer:items");
        assertEquals(cat.getLayerGroups().size(), view.getItemCount());
    }

    @Test
    public void testLayerGroupAllPage() throws Exception {
        loginAsCite();

        tester.startPage(LayerGroupPage.class);
        tester.assertRenderedPage(LayerGroupPage.class);

        Catalog cat = getCatalog();

        DataView view = (DataView) tester.getComponentFromLastRenderedPage("table:listContainer:items");

        AdminRequest.start(new Object());
        assertEquals(cat.getLayerGroups().size(), view.getItemCount());

        for (Iterator<Item> it = view.getItems(); it.hasNext();) {
            String name = it.next().get("itemProperties:0:component:link:label").getDefaultModelObjectAsString();
            assertFalse("sf_local".equals(name));
        }
    }

    @Test
    public void testLayerGroupEditPageAsAdmin() throws Exception {
        login();

        tester.startPage(LayerGroupEditPage.class);
        tester.assertRenderedPage(LayerGroupEditPage.class);
        tester.assertModelValue("publishedinfo:tabs:panel:workspace", null);

        DropDownChoice choice = (DropDownChoice) tester
                .getComponentFromLastRenderedPage("publishedinfo:tabs:panel:workspace");
        assertTrue(choice.isNullValid());
        assertFalse(choice.isRequired());
    }

    @Test
    public void testLayerGroupEditPage() throws Exception {
        loginAsCite();

        tester.startPage(LayerGroupEditPage.class);
        tester.assertRenderedPage(LayerGroupEditPage.class);

        Catalog cat = getCatalog();
        tester.assertModelValue("publishedinfo:tabs:panel:workspace", cat.getWorkspaceByName("cite"));

        DropDownChoice choice = (DropDownChoice) tester
                .getComponentFromLastRenderedPage("publishedinfo:tabs:panel:workspace");
        assertFalse(choice.isNullValid());
        assertTrue(choice.isRequired());
    }

    @Test
    public void testLayerGroupEditPageGlobal() throws Exception {
        loginAsCite();

        tester.startPage(LayerGroupEditPage.class,
                new PageParameters().add(LayerGroupEditPage.GROUP, "cite_global"));
        tester.assertRenderedPage(LayerGroupEditPage.class);

        //assert all form components disabled except for cancel
        assertFalse(tester.getComponentFromLastRenderedPage("publishedinfo:tabs:panel:name").isEnabled());
        assertFalse(tester.getComponentFromLastRenderedPage("publishedinfo:tabs:panel:workspace").isEnabled());
        assertNull(tester.getComponentFromLastRenderedPage("publishedinfo:save"));
        assertTrue(tester.getComponentFromLastRenderedPage("publishedinfo:cancel").isEnabled());
    }

    public void testSqlViewNewPageAsWorkspaceAdmin() throws Exception {
        loginAsCite();

        PageParameters pp = new PageParameters();
        pp.add(SQLViewNewPage.WORKSPACE, "cite");

        //not a jdbc datastore obviously but we don't need one to simply test that the 
        // page will render with worksapce admin privilieges
        pp.add(SQLViewNewPage.DATASTORE, "cite");

        new SQLViewNewPage(pp);

        RequestCycle cycle = RequestCycle.get();
        RenderPageRequestHandler handler = (RenderPageRequestHandler) cycle
                .getRequestHandlerScheduledAfterCurrent();
        assertFalse(UnauthorizedPage.class.equals(handler.getPageClass()));
    }

    public void testCreateNewFeatureTypePageAsWorkspaceAdmin() throws Exception {
        loginAsCite();

        PageParameters pp = new PageParameters();
        pp.add(NewFeatureTypePage.WORKSPACE, "cite");

        //not a jdbc datastore obviously but we don't need one to simply test that the 
        // page will render with worksapce admin privilieges
        pp.add(NewFeatureTypePage.DATASTORE, "cite");

        new NewFeatureTypePage(pp);

        RequestCycle cycle = RequestCycle.get();
        RenderPageRequestHandler handler = (RenderPageRequestHandler) cycle
                .getRequestHandlerScheduledAfterCurrent();
        assertFalse(UnauthorizedPage.class.equals(handler.getPageClass()));
    }
}