/* (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.security.web; import static org.junit.Assert.*; import java.util.Arrays; import java.util.Iterator; import java.util.List; import org.apache.wicket.Component; import org.apache.wicket.MarkupContainer; import org.apache.wicket.ajax.AjaxRequestHandler; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow; import org.apache.wicket.extensions.ajax.markup.html.tabs.AjaxTabbedPanel; import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.FormComponent; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.markup.repeater.data.DataView; import org.apache.wicket.util.tester.FormTester; import org.apache.wicket.util.tester.WicketTester; import org.geoserver.security.GeoServerSecurityManager; import org.geoserver.security.config.SecurityNamedServiceConfig; import org.geoserver.web.ComponentBuilder; import org.geoserver.web.wicket.GeoServerDialog; import org.junit.Before; public abstract class AbstractSecurityNamedServicePanelTest extends AbstractSecurityWicketTestSupport { public static final String FIRST_COLUM_PATH="itemProperties:0:component:link"; public static final String CHECKBOX_PATH="selectItemContainer:selectItem"; protected AbstractSecurityPage basePage; protected String basePanelId; protected FormTester formTester; GeoServerSecurityManager manager; protected void newFormTester() { newFormTester("form"); } protected void newFormTester(String path) { //formTester = tester.newFormTester(getDetailsFormComponentId()); formTester = tester.newFormTester(path); } @Before public void init() throws Exception { manager= getSecurityManager(); } protected abstract AbstractSecurityPage getBasePage(); protected abstract String getBasePanelId(); protected abstract Integer getTabIndex(); protected abstract Class<? extends Component> getNamedServicesClass(); protected abstract String getDetailsFormComponentId(); protected void activatePanel() { basePage=getBasePage(); basePanelId=getBasePanelId(); tester.startPage(basePage); tester.assertRenderedPage(basePage.getPageClass()); //String linkId = getTabbedPanel().getId()+":tabs-container:tabs:"+getTabIndex()+":link"; //tester.clickLink(linkId,true); //assertEquals(getNamedServicesClass(), getNamedServicesPanel().getClass()); } // protected AjaxTabbedPanel getTabbedPanel() { // return (AjaxTabbedPanel) tabbedPage.get(AbstractSecurityPage.TabbedPanelId); // } // protected NamedServicesPanel getNamedServicesPanel() { // return (NamedServicesPanel) tabbedPage.get(getTabbedPanel().getId()+":panel"); // // } protected void clickAddNew() { tester.clickLink(basePanelId + ":add"); } protected void clickRemove() { tester.clickLink(basePanelId + ":remove"); } protected Component getRemoveLink() { Component result =tester.getLastRenderedPage().get("tabbedPanel:panel:removeSelected"); assertNotNull(result); return result; } protected DataView<SecurityNamedServiceConfig> getDataView() { return (DataView<SecurityNamedServiceConfig>) basePage.get(basePanelId + ":table:listContainer:items"); } protected long countItems() { tester.debugComponentTrees(); return getDataView().getItemCount(); } protected SecurityNamedServiceConfig getSecurityNamedServiceConfig(String name) { //<SecurityNamedServiceConfig> Iterator<Item<SecurityNamedServiceConfig>> it = getDataView().getItems(); while (it.hasNext()) { Item<SecurityNamedServiceConfig> item = it.next(); if (name.equals(item.getModelObject().getName())) return item.getModelObject(); } return null; } protected void clickNamedServiceConfig(String name) { //<SecurityNamedServiceConfig> Iterator<Item<SecurityNamedServiceConfig>> it = getDataView().getItems(); while (it.hasNext()) { Item<SecurityNamedServiceConfig> item = it.next(); if (name.equals(item.getModelObject().getName())) tester.clickLink(item.getPageRelativePath()+":"+FIRST_COLUM_PATH); } } protected void checkNamedServiceConfig(String name) { //<SecurityNamedServiceConfig> Iterator<Item<SecurityNamedServiceConfig>> it = getDataView().getItems(); while (it.hasNext()) { Item<SecurityNamedServiceConfig> item = it.next(); if (name.equals(item.getModelObject().getName())) tester.executeAjaxEvent(item.getPageRelativePath()+":"+CHECKBOX_PATH,"click"); } } protected void doRemove(String pathForLink, String ... serviceNames) throws Exception { AbstractSecurityPage testPage = (AbstractSecurityPage) tester.getLastRenderedPage(); if (serviceNames.length==0) { String selectAllPath = basePanelId + ":table:listContainer:selectAllContainer:selectAll"; tester.assertComponent(selectAllPath, CheckBox.class); FormComponent selectAllPathComponent = (FormComponent) tester.getComponentFromLastRenderedPage(selectAllPath); setFormComponentValue(selectAllPathComponent, "true"); tester.executeAjaxEvent(selectAllPath, "click"); } else { DataView<SecurityNamedServiceConfig> dataview = (DataView<SecurityNamedServiceConfig>) testPage.get(basePanelId + ":table:listContainer:items"); List<String> nameList = Arrays.asList(serviceNames); Iterator<Item<SecurityNamedServiceConfig>> it = getDataView().getItems(); while (it.hasNext()) { Item<SecurityNamedServiceConfig> item = it.next(); if (nameList.contains(item.getModelObject().getName())) { String checkBoxPath=item.getPageRelativePath()+":"+CHECKBOX_PATH; tester.assertComponent(checkBoxPath, CheckBox.class); FormComponent checkBoxPathComponent = (FormComponent) tester.getComponentFromLastRenderedPage(checkBoxPath); setFormComponentValue(checkBoxPathComponent, "true"); testPage.get(checkBoxPath).setDefaultModelObject(true); tester.executeAjaxEvent(checkBoxPath, "click"); } } } tester.assertNoErrorMessage(); tester.assertComponent(basePanelId + ":dialog:dialog", ModalWindow.class); ModalWindow w = (ModalWindow) testPage.get(basePanelId + ":dialog:dialog"); /*(ModalWindow) testPage.get( testPage.getWicketPath() + ":dialog:dialog");*/ assertFalse(w.isShown()); tester.clickLink(basePanelId + ":remove", true); assertTrue(w.isShown()); ((GeoServerDialog)w.getParent()).submit(new AjaxRequestHandler(tester.getLastRenderedPage())); //simulateDeleteSubmit(); //executeModalWindowCloseButtonCallback(w); } protected void simulateDeleteSubmit() throws Exception { //AjaxLink link = (AjaxLInk) tester.getLastRenderedPage().get(basePanelId + ":remove"); //link.on } protected void setSecurityConfigName(String aName) { formTester.setValue("panel:content:name", aName); } protected String getSecurityConfigName() { return formTester.getForm().get("config.name").getDefaultModelObjectAsString(); } protected String getSecurityConfigClassName() { return formTester.getForm().get("config.className").getDefaultModelObjectAsString(); } protected <T extends SecurityNamedServicePanelInfo> void setSecurityConfigClassName(Class<T> clazz) { ListView list = (ListView) tester.getLastRenderedPage().get("servicesContainer:services"); int toClick = -1; for (int i = 0; i < list.getList().size(); i++) { if (clazz.isInstance(list.getList().get(i))) { toClick = i; break; } } AjaxLink link = (AjaxLink) ((MarkupContainer)list.get(toClick)).get("link"); if(link.isEnabled()) { tester.executeAjaxEvent(link, "click"); } // formTester.select("config.className", index); // tester.executeAjaxEvent(formTester.getForm().getPageRelativePath()+":config.className", "change"); } protected void clickSave() { formTester.submit("save"); } protected void clickCancel() { formTester.submitLink("cancel",false); } }