gr.interamerican.wicket.markup.html.panel.crud.picker.TestCrudPickerPanel.java Source code

Java tutorial

Introduction

Here is the source code for gr.interamerican.wicket.markup.html.panel.crud.picker.TestCrudPickerPanel.java

Source

/*******************************************************************************
 * Copyright (c) 2013 INTERAMERICAN PROPERTY AND CASUALTY INSURANCE COMPANY S.A. 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Lesser Public License v3
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/copyleft/lesser.html
 * 
 * This library 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 Lesser General Public License for more details.
 ******************************************************************************/
package gr.interamerican.wicket.markup.html.panel.crud.picker;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import gr.interamerican.bo2.samples.bean.BeanWithOrderedFields;
import gr.interamerican.bo2.samples.collections.BeanCollections;
import gr.interamerican.wicket.ajax.markup.html.form.CallbackAjaxButton;
import gr.interamerican.wicket.callback.AbstractCallbackAction;
import gr.interamerican.wicket.creators.DataTableCreator;
import gr.interamerican.wicket.markup.html.TestPage;
import gr.interamerican.wicket.samples.creators.DataTableCreatorForBeanWithOrderedFieldsWithRadios;
import gr.interamerican.wicket.samples.creators.FieldsPanelCreatorForBeanWithOrderedFields;
import gr.interamerican.wicket.test.WicketTest;

import java.util.List;
import java.util.Map;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.RadioGroup;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.serialize.java.JavaSerializer;
import org.apache.wicket.util.tester.FormTester;
import org.junit.Before;
import org.junit.Test;

/**
 * Unit tests for {@link CrudPickerPanel}.
 */
@SuppressWarnings({ "nls", "unchecked" })
public class TestCrudPickerPanel extends WicketTest {

    /**
     * Error message.
     */
    private static final String ERROR_MSG = "error";

    /**
     * Panel under testing.
     */
    private static CrudPickerPanel<BeanWithOrderedFields> panel;

    /**
     * Tests setup.
     */
    @Before
    public void setup() {
        definition = createDef();
        panel = new CrudPickerPanel<BeanWithOrderedFields>(definition) {
            /**
             * serialVersionUID.
             */
            private static final long serialVersionUID = 1L;

            @Override
            protected BeanWithOrderedFields newBean() {
                return new BeanWithOrderedFields();
            }
        };
        new JavaSerializer(tester.getApplication().getApplicationKey()).serialize(panel);
    }

    /**
     * Tests creation of {@link CrudPickerPanel}.
     */
    @Test
    public void testCreation() {
        tester.startPage(getTestPage(panel));

        tester.assertComponent(path("tableForm"), Form.class);
        tester.assertComponent(path("tableForm:radioGroup"), RadioGroup.class);
        tester.assertComponent(path("tableForm:radioGroup:listTable"), DataTable.class);

        tester.assertComponent(path("tableForm:selectButton"), CallbackAjaxButton.class);
        tester.assertComponent(path("tableForm:editButton"), AjaxButton.class);
        tester.assertComponent(path("tableForm:newButton"), AjaxButton.class);
        tester.assertComponent(path("tableForm:deleteButton"), CallbackAjaxButton.class);

        tester.assertInvisible(path("beanPanel"));
        tester.assertInvisible(path("tableForm:backButton"));

    }

    /**
     * Tests pressing delete button.
     */
    @Test
    public void testDelete() {
        tester.startPage(getTestPage(panel));

        assertEquals(7, definition.getList().size());

        tester.assertComponent(path("tableForm:radioGroup:listTable"), DataTable.class);
        DataTable<BeanWithOrderedFields> table = (DataTable<BeanWithOrderedFields>) tester
                .getComponentFromLastRenderedPage(path("tableForm:radioGroup:listTable"));
        assertEquals(7, table.getDataProvider().size());

        tester.assertComponent(path("tableForm:radioGroup"), RadioGroup.class);
        RadioGroup<BeanWithOrderedFields> radioGroup = (RadioGroup<BeanWithOrderedFields>) tester
                .getComponentFromLastRenderedPage(path("tableForm:radioGroup"));
        radioGroup.setModelObject(definition.getList().get(0));

        tester.assertComponent(path("tableForm:deleteButton"), CallbackAjaxButton.class);
        CallbackAjaxButton deleteButton = (CallbackAjaxButton) tester
                .getComponentFromLastRenderedPage(path("tableForm:deleteButton"));

        Map<String, String[]> map = tester.getRequest().getParameterMap();
        map.put("testId:tableForm:radioGroup", new String[] { "radio0" });
        tester.executeAjaxEvent(deleteButton, "onclick");

        assertEquals(6, list.size());

        tester.assertComponent(path("tableForm:radioGroup:listTable"), DataTable.class);
        table = (DataTable<BeanWithOrderedFields>) tester
                .getComponentFromLastRenderedPage(path("tableForm:radioGroup:listTable"));

        assertEquals(6, table.getDataProvider().size());
    }

    /**
     * Tests pressing the new button and storing
     * a new bean.
     */
    @Test
    public void testNew() {
        tester.startPage(getTestPage(panel));

        assertEquals(7, definition.getList().size());

        tester.assertComponent(path("tableForm:radioGroup:listTable"), DataTable.class);
        DataTable<BeanWithOrderedFields> table = (DataTable<BeanWithOrderedFields>) tester
                .getComponentFromLastRenderedPage(path("tableForm:radioGroup:listTable"));
        assertEquals(7, table.getDataProvider().size());

        tester.assertComponent(path("tableForm:radioGroup"), RadioGroup.class);
        RadioGroup<BeanWithOrderedFields> radioGroup = (RadioGroup<BeanWithOrderedFields>) tester
                .getComponentFromLastRenderedPage(path("tableForm:radioGroup"));
        radioGroup.setModelObject(definition.getList().get(0));

        tester.assertComponent(path("tableForm:newButton"), AjaxButton.class);
        AjaxButton newButton = (AjaxButton) tester.getComponentFromLastRenderedPage(path("tableForm:newButton"));

        tester.executeAjaxEvent(newButton, "onclick");

        tester.assertComponent(path("beanPanel:beanForm"), Form.class);
        tester.assertComponent(path("beanPanel:beanForm:beanFormFieldsPanel"), Panel.class);
        tester.assertComponent(path("beanPanel:beanForm:executeButton"), CallbackAjaxButton.class);

        CallbackAjaxButton execButton = (CallbackAjaxButton) tester
                .getComponentFromLastRenderedPage(path("beanPanel:beanForm:executeButton"));

        userInput = new BeanWithOrderedFields("11", "22", 33, 44L, 5.5d);
        FormTester formTester = tester.newFormTester(path("beanPanel:beanForm"));
        formTester.setValue("beanFormFieldsPanel:first", String.valueOf(userInput.getFirst()));
        formTester.setValue("beanFormFieldsPanel:second", String.valueOf(userInput.getSecond()));
        formTester.setValue("beanFormFieldsPanel:third", String.valueOf(userInput.getThird()));
        formTester.setValue("beanFormFieldsPanel:fourth", String.valueOf(userInput.getFourth()));
        formTester.setValue("beanFormFieldsPanel:fifth", String.valueOf(userInput.getFifth()));
        formTester.submit();
        tester.executeAjaxEvent(execButton, "onclick");

        tester.assertComponent(path("tableForm:radioGroup:listTable"), DataTable.class);
        table = (DataTable<BeanWithOrderedFields>) tester
                .getComponentFromLastRenderedPage(path("tableForm:radioGroup:listTable"));

        assertEquals(8, table.getDataProvider().size());

        tester.assertInvisible(path("beanPanel"));
    }

    /**
     * Tests pressing the new button and then canceling
     * the insertion of the new bean.
     */
    @Test
    public void testNewThenBack() {
        tester.startPage(getTestPage(panel));

        tester.assertComponent(path("tableForm:newButton"), AjaxButton.class);
        AjaxButton newButton = (AjaxButton) tester.getComponentFromLastRenderedPage(path("tableForm:newButton"));

        tester.executeAjaxEvent(newButton, "onclick");

        tester.assertComponent(path("beanPanel:beanForm:backButton"), CallbackAjaxButton.class);
        CallbackAjaxButton backButton = (CallbackAjaxButton) tester
                .getComponentFromLastRenderedPage(path("beanPanel:beanForm:backButton"));

        tester.executeAjaxEvent(backButton, "onclick");

        tester.assertInvisible(path("beanPanel"));

    }

    /**
     * Tests pressing the update button and updating a bean.
     */
    @Test
    public void testUpdate() {
        tester.startPage(getTestPage(panel));

        assertEquals(7, definition.getList().size());

        tester.assertComponent(path("tableForm:radioGroup:listTable"), DataTable.class);
        DataTable<BeanWithOrderedFields> table = (DataTable<BeanWithOrderedFields>) tester
                .getComponentFromLastRenderedPage(path("tableForm:radioGroup:listTable"));
        assertEquals(7, table.getDataProvider().size());

        tester.assertComponent(path("tableForm:radioGroup"), RadioGroup.class);
        RadioGroup<BeanWithOrderedFields> radioGroup = (RadioGroup<BeanWithOrderedFields>) tester
                .getComponentFromLastRenderedPage(path("tableForm:radioGroup"));
        radioGroup.setModelObject(definition.getList().get(0));

        tester.assertComponent(path("tableForm:editButton"), AjaxButton.class);
        AjaxButton editButton = (AjaxButton) tester.getComponentFromLastRenderedPage(path("tableForm:editButton"));

        Map<String, String[]> map = tester.getRequest().getParameterMap();
        map.put("testId:tableForm:radioGroup", new String[] { "radio0" });
        tester.executeAjaxEvent(editButton, "onclick");

        tester.assertVisible(path("beanPanel:beanForm:beanFormFieldsPanel"));
        Panel beanPanel = (Panel) tester
                .getComponentFromLastRenderedPage(path("beanPanel:beanForm:beanFormFieldsPanel"));
        assertEquals(definition.getList().get(0), beanPanel.getDefaultModelObject());

        /*
         * Will leave first two fields intact and modify the third
         */
        userInput = (BeanWithOrderedFields) beanPanel.getDefaultModelObject();
        FormTester formTester = tester.newFormTester(path("beanPanel:beanForm"));
        formTester.setValue("beanFormFieldsPanel:first", String.valueOf(userInput.getFirst()));
        formTester.setValue("beanFormFieldsPanel:second", String.valueOf(userInput.getSecond()));
        formTester.setValue("beanFormFieldsPanel:third", String.valueOf(editInt));
        formTester.setValue("beanFormFieldsPanel:fourth", String.valueOf(userInput.getFourth()));
        formTester.setValue("beanFormFieldsPanel:fifth", String.valueOf(userInput.getFifth()));
        formTester.submit();

        Integer changed = ((BeanWithOrderedFields) beanPanel.getDefaultModelObject()).getThird();
        assertEquals(changed, editInt);

        tester.assertComponent(path("beanPanel:beanForm:executeButton"), CallbackAjaxButton.class);
        CallbackAjaxButton updateButton = (CallbackAjaxButton) tester
                .getComponentFromLastRenderedPage(path("beanPanel:beanForm:executeButton"));

        tester.executeAjaxEvent(updateButton, "onclick");

        tester.assertComponent(path("tableForm:radioGroup:listTable"), DataTable.class);
        table = (DataTable<BeanWithOrderedFields>) tester
                .getComponentFromLastRenderedPage(path("tableForm:radioGroup:listTable"));
        assertEquals(7, table.getDataProvider().size());

        tester.assertInvisible(path("beanPanel"));
    }

    /**********************************************************
     * SAMPLE SETUP GOES ON BELOW THIS POINT...
     **********************************************************/

    /**
     * Integer for editing a bean. 
     */
    private static final Integer editInt = 333;

    /**
     * sample bean.
     */
    BeanWithOrderedFields bean = new BeanWithOrderedFields("", "", 0, 0L, 0.0);

    /**
     * user input.
     */
    BeanWithOrderedFields userInput = new BeanWithOrderedFields("", "", 0, 0L, 0.0);

    /**
     * table creator.
     */
    DataTableCreatorForBeanWithOrderedFieldsWithRadios tableCreator = createCreator();

    /**
     * Panel definition.
     */
    CrudPickerPanelDef<BeanWithOrderedFields> definition;

    /**
     * list with results.
     */
    List<BeanWithOrderedFields> list = BeanCollections.listOfBeanWithOrderedFields();

    /**
     * Creates the {@link DataTableCreator}.
     * 
     * @return Returns a DataTableCreatorForBeanWithOrderedFields.
     */
    DataTableCreatorForBeanWithOrderedFieldsWithRadios createCreator() {
        DataTableCreatorForBeanWithOrderedFieldsWithRadios cr = new DataTableCreatorForBeanWithOrderedFieldsWithRadios();
        cr.setRowsPerPage(5);
        return cr;
    }

    /**
     * Creates the {@link CrudPickerPanelDef}.
     * 
     * @return a CrudPickerPanelDef definition.
     */
    CrudPickerPanelDef<BeanWithOrderedFields> createDef() {

        FieldsPanelCreatorForBeanWithOrderedFields panelCreator = new FieldsPanelCreatorForBeanWithOrderedFields();

        CrudPickerPanelDef<BeanWithOrderedFields> def = new CrudPickerPanelDefImpl<BeanWithOrderedFields>();

        def.setBackAction(null);
        def.setList(list);
        def.setBeanFieldsPanelCreator(panelCreator);
        def.setDataTableCreator(tableCreator);
        def.setDeleteAction(new DeleteAction());
        def.setItemSelectedAction(new PickAction());
        def.setBeanModel(new CompoundPropertyModel<BeanWithOrderedFields>(new BeanWithOrderedFields()));
        def.setSaveAction(new SaveAction());
        def.setUpdateAction(new UpdateAction());
        def.setWicketId(TestPage.TEST_ID);

        return def;
    }

    /**
     * Abstract action.
     */
    static abstract class AbstractAction extends AbstractCallbackAction {

        /**
         * serialVersionUID
         */
        private static final long serialVersionUID = 1L;

        public void callBack(AjaxRequestTarget target) {
            target.add(panel);
            work();
        }

        public void callBack(AjaxRequestTarget target, Form<?> form) {
            target.add(panel);
            work();
        }

        /**
         * update method.
         */
        abstract protected void work();

    }

    /**
     * Save action.
     */
    static class SaveAction extends AbstractAction {
        /**
         * 
         */
        private static final long serialVersionUID = 1L;

        @Override
        protected void work() {
            //         BeanWithOrderedFields bwof = panel.getDefinition().getBeanModel().getObject();
            //         assertNotNull(bwof);
            //         assertEquals(bwof, userInput);
            /* store the bean to the database here */
        }
    }

    /**
     * Update action.
     */
    static class UpdateAction extends AbstractAction {
        /**
         * 
         */
        private static final long serialVersionUID = 1L;

        @Override
        protected void work() {
            BeanWithOrderedFields bwof = panel.getDefinition().getBeanModel().getObject();
            assertNotNull(bwof);
            //         assertEquals(bwof, userInput);
            /* update the bean to the database here */
        }
    }

    /**
     * Delete action.
     */
    static class DeleteAction extends AbstractAction {
        /**
         * 
         */
        private static final long serialVersionUID = 1L;

        @Override
        protected void work() {
            /* delete from the database here */
        }
    }

    /**
     * Delete action that simulates that a rule exception is thrown
     * somewhere in its work(). This will normally be caught by the
     * wicket block performing the action and registered to the
     * calling Component as an error.
     */
    static class PickAction extends AbstractAction {
        /**
         * 
         */
        private static final long serialVersionUID = 1L;

        @Override
        protected void work() {
            getCaller().error(ERROR_MSG);
        }
    }

}