///////////////////////////////////////////////////////////////////////////// // // Project ProjectForge Community Edition // www.projectforge.org // // Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de) // // ProjectForge is dual-licensed. // // This community edition is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as published // by the Free Software Foundation; version 3 of the License. // // This community edition is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General // Public License for more details. // // You should have received a copy of the GNU General Public License along // with this program; if not, see http://www.gnu.org/licenses/. // ///////////////////////////////////////////////////////////////////////////// package org.projectforge.web.wicket; import org.apache.wicket.Component; import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable; import org.apache.wicket.util.tester.FormTester; import org.junit.Assert; import org.junit.Test; /** * Use-full super class for testing standard list pages (derived from AbstractListPage). * @author Kai Reinhard (k.reinhard@micromata.de) * */ public abstract class ListAndEditPagesTestBase extends WicketPageTestBase { protected final String KEY_EDITPAGE_BUTTON_CREATE = "create"; protected final String KEY_EDITPAGE_BUTTON_MARK_AS_DELETED = "markAsDeleted"; protected final String KEY_LISTPAGE_SEARCH_INPUT_FIELD = "searchFilter"; protected final String PATH_CONTENT_MENU_REPEATER = "body:breadcrumb:menuBar:repeater"; protected final String PATH_EDITPAGE_FORM = "body:form"; protected final String PATH_LISTPAGE_FORM = "body:form"; protected final String PATH_LISTPAGE_TABLE = "body:form:table"; @SuppressWarnings("unchecked") @Test public void baseTests() { loginTestAdmin(); startListPage(); if (getNumberOfExistingListElements() != null) { final DataTable< ?, String > table = (DataTable< ? ,String >) tester.getComponentFromLastRenderedPage(PATH_LISTPAGE_TABLE); Assert.assertEquals(getNumberOfExistingListElements().intValue(), table.getRowCount()); } // Now, add a new element: tester.clickLink(findComponentByAccessKey(tester, PATH_CONTENT_MENU_REPEATER, 'n')); tester.assertRenderedPage(getEditPageClass()); // Need new page to initialize model: final AbstractEditPage< ? , ? , ? > editPage = getEditPageWithPrefilledData(); tester.startPage(editPage); FormTester form = tester.newFormTester(PATH_EDITPAGE_FORM); form.submit(findComponentByLabel(form, KEY_EDITPAGE_BUTTON_CREATE)); final Integer id = (Integer) editPage.getData().getId(); // Now check list page tester.assertRenderedPage(getListPageClass()); if (getNumberOfExistingListElements() != null) { final DataTable< ? , String> table = (DataTable< ?, String >) tester.getComponentFromLastRenderedPage(PATH_LISTPAGE_TABLE); Assert.assertEquals(getNumberOfExistingListElements() + 1, table.getRowCount()); } startListPage("id:" + id); // Now re-enter edit page and mark object as deleted final Component link = findComponentByLabel(tester, PATH_LISTPAGE_TABLE, "select"); tester.clickLink(link); // Edit page tester.assertRenderedPage(getEditPageClass()); checkEditPage(); form = tester.newFormTester(PATH_EDITPAGE_FORM); form.submit(findComponentByLabel(form, KEY_EDITPAGE_BUTTON_MARK_AS_DELETED)); // Now check list page again after object was deleted: tester.assertRenderedPage(getListPageClass()); if (getNumberOfExistingListElements() != null) { final DataTable< ?, String > table = (DataTable< ? , String>) tester.getComponentFromLastRenderedPage(PATH_LISTPAGE_TABLE); Assert.assertEquals(getNumberOfExistingListElements().intValue(), table.getRowCount()); } } protected abstract Class< ? extends AbstractListPage< ? , ? , ? >> getListPageClass(); protected abstract Class< ? extends AbstractEditPage< ? , ? , ? >> getEditPageClass(); /** * Creates a new edit page and pre-fills all fields of the data model which are at least required to create a new data-base entry.<br> * Example:<br> * * <pre> * AddressEditPage editPage = new AddressEditPage(new PageParameters()); * final AddressDO data = editPage.getForm().getData(); * data.setName("Reinhard").setFirstName("Kai"))....; * return editPage. * </pre> * @return */ protected abstract AbstractEditPage< ? , ? , ? > getEditPageWithPrefilledData(); /** * Optional checks of the fields of the edit page after an object was inserted and clicked in the list page.<br> * Example:<br> * * <pre> * AddressEditPage editPage = (AddressEditPage) tester.getLastRenderedPage(); * AddressDO address = editPage.getForm().getData(); * Assert.assertEquals("Kai", address.getFirstName()); * </pre> */ protected void checkEditPage() { } /** * Override this method if any test object entries do exist in the list (default is 0). * @return number of existing elements expected in the list view or null if not to-be checked. */ protected Integer getNumberOfExistingListElements() { return 0; } /** * Starts list page with reseted filter. */ protected void startListPage() { startListPage(null); } /** * Starts list page with reseted filter and given search string as filter string. */ protected void startListPage(final String searchString) { tester.startPage(getListPageClass()); tester.assertRenderedPage(getListPageClass()); final FormTester form = tester.newFormTester(PATH_LISTPAGE_FORM); final Component comp = findComponentByLabel(form, KEY_LISTPAGE_SEARCH_INPUT_FIELD); form.setValue(comp, searchString != null ? searchString : ""); form.submit(); } }