/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.wicket.markup.html.form;
import org.apache.wicket.Component;
import org.apache.wicket.core.request.handler.ListenerInvocationNotAllowedException;
import org.apache.wicket.markup.html.form.NestedFormsPage.NestableForm;
import org.apache.wicket.util.tester.FormTester;
import org.apache.wicket.util.tester.WicketTestCase;
import org.junit.Before;
import org.junit.Test;
/**
* Please see <a href="http://cwiki.apache.org/WICKET/nested-forms.html">"Nested Forms"</a> for more
* details on nested forms
*
* @author Gerolf Seitz
*/
public class FormSubmitTest extends WicketTestCase
{
private NestedFormsPage page;
private NestableForm outerForm;
private NestableForm middleForm;
private NestableForm innerForm;
/**
*
*/
@Before
public void before()
{
tester.startPage(new NestedFormsPage());
page = (NestedFormsPage)tester.getLastRenderedPage();
outerForm = (NestableForm)page.get("outerForm");
middleForm = (NestableForm)page.get("outerForm:middleForm");
innerForm = (NestableForm)page.get("outerForm:middleForm:innerForm");
}
/**
*
*/
@Test
public void allFormsEnabledSubmitOuterForm()
{
assertEnabledState(true, true, true);
FormTester formTester = tester.newFormTester("outerForm");
formTester.submit("submit");
assertOnSubmitCalled(true, true, true);
assertOnErrorCalled(false, false, false);
assertSubmitOrder(innerForm, middleForm, outerForm);
}
private void assertSubmitOrder(NestableForm... forms)
{
assertEquals("not submitted in expected order!", joinIds(forms), page.submitOrder);
}
private String joinIds(Component[] comps)
{
String result = "";
for (Component component : comps)
{
result += component.getId();
}
return result;
}
private void assertErrorOrder(NestableForm... forms)
{
assertEquals("not onError'd in expected order!", joinIds(forms), page.errorOrder);
}
/**
*
*/
@Test
public void allFormsEnabledSubmitMiddleForm()
{
assertEnabledState(true, true, true);
FormTester formTester = tester.newFormTester("outerForm:middleForm");
formTester.submit("submit");
assertOnSubmitCalled(false, true, true);
assertOnErrorCalled(false, false, false);
assertSubmitOrder(innerForm, middleForm);
}
/**
*
*/
@Test
public void allFormsEnabledSubmitInnerForm()
{
assertEnabledState(true, true, true);
FormTester formTester = tester.newFormTester("outerForm:middleForm:innerForm");
formTester.submit("submit");
assertOnSubmitCalled(false, false, true);
assertOnErrorCalled(false, false, false);
assertSubmitOrder(innerForm);
}
/**
*
*/
@Test
public void middleFormDisabledSubmitOuterForm()
{
// disable middle form
middleForm.setEnabled(false);
assertEnabledState(true, false, true);
// submit outer form
FormTester formTester = tester.newFormTester("outerForm");
formTester.submit("submit");
assertOnSubmitCalled(true, false, false);
assertOnErrorCalled(false, false, false);
assertSubmitOrder(outerForm);
}
/**
*
*/
@Test
public void innerFormDisabledSubmitOuterForm()
{
// disable middle form
innerForm.setEnabled(false);
assertEnabledState(true, true, false);
// submit outer form
FormTester formTester = tester.newFormTester("outerForm");
formTester.submit("submit");
assertOnSubmitCalled(true, true, false);
assertOnErrorCalled(false, false, false);
assertSubmitOrder(middleForm, outerForm);
}
/**
*
*/
@Test
public void submitDisabledOuterForm()
{
outerForm.setEnabled(false);
assertEnabledState(false, true, true);
FormTester formTester = tester.newFormTester("outerForm");
try
{
formTester.submit("submit");
fail("Executing the listener on disabled component is not allowed.");
}
catch (ListenerInvocationNotAllowedException expected)
{
;
}
assertOnSubmitCalled(false, false, false);
assertOnErrorCalled(false, false, false);
}
/**
*
*/
@Test
public void errorOnInnerFormSubmitOuterForm()
{
assertEnabledState(true, true, true);
causeValidationErrorAndSubmit("outerForm", "middleForm:innerForm:first");
assertOnSubmitCalled(false, false, false);
assertOnErrorCalled(true, true, true);
assertErrorOrder(innerForm, middleForm, outerForm);
}
/**
*
*/
@Test
public void errorOnMiddleFormSubmitOuterForm()
{
assertEnabledState(true, true, true);
causeValidationErrorAndSubmit("outerForm", "middleForm:first");
assertOnSubmitCalled(false, false, false);
assertOnErrorCalled(true, true, false);
assertErrorOrder(middleForm, outerForm);
}
/**
*
*/
@Test
public void errorOnMiddleFormSubmitMiddleForm()
{
assertEnabledState(true, true, true);
causeValidationErrorAndSubmit("outerForm:middleForm", "first");
assertOnSubmitCalled(false, false, false);
assertOnErrorCalled(false, true, false);
assertErrorOrder(middleForm);
}
/**
*
*/
@Test
public void errorOnInnerFormSubmitMiddleForm()
{
assertEnabledState(true, true, true);
causeValidationErrorAndSubmit("outerForm:middleForm", "innerForm:first");
assertOnSubmitCalled(false, false, false);
assertOnErrorCalled(false, true, true);
assertErrorOrder(innerForm, middleForm);
}
/**
*
*/
@Test
public void middleFormDisabledErrorOnOuterFormSubmitOuterForm()
{
middleForm.setEnabled(false);
assertEnabledState(true, false, true);
causeValidationErrorAndSubmit("outerForm", "first");
assertOnSubmitCalled(false, false, false);
assertOnErrorCalled(true, false, false);
assertErrorOrder(outerForm);
}
/**
*
*/
@Test
public void errorOnInnerFormDisabledMiddleFormSubmitOuterForm()
{
middleForm.setEnabled(false);
assertEnabledState(true, false, true);
causeValidationErrorAndSubmit("outerForm", "middleForm:innerForm:first");
assertOnSubmitCalled(true, false, false);
assertOnErrorCalled(false, false, false);
}
/**
*
* @param isOuterFormEnabled
* @param isMiddleFormEnabled
* @param isInnerFormEnabled
*/
private void assertEnabledState(boolean isOuterFormEnabled, boolean isMiddleFormEnabled,
boolean isInnerFormEnabled)
{
assertEquals(isOuterFormEnabled, outerForm.isEnabled());
assertEquals(isMiddleFormEnabled, middleForm.isEnabled());
assertEquals(isInnerFormEnabled, innerForm.isEnabled());
}
/**
*
* @param isOuterFormOnErrorCalled
* @param isMiddleFormOnErrorCalled
* @param isInnerFormOnErrorCalled
*/
private void assertOnErrorCalled(boolean isOuterFormOnErrorCalled,
boolean isMiddleFormOnErrorCalled, boolean isInnerFormOnErrorCalled)
{
assertEquals(isOuterFormOnErrorCalled, outerForm.onErrorCalled);
assertEquals(isMiddleFormOnErrorCalled, middleForm.onErrorCalled);
assertEquals(isInnerFormOnErrorCalled, innerForm.onErrorCalled);
}
/**
*
* @param isOuterFormOnSubmitCalled
* @param isMiddleFormOnSubmitCalled
* @param isInnerFormOnSubmitCalled
*/
private void assertOnSubmitCalled(boolean isOuterFormOnSubmitCalled,
boolean isMiddleFormOnSubmitCalled, boolean isInnerFormOnSubmitCalled)
{
assertEquals(isOuterFormOnSubmitCalled, outerForm.onSubmitCalled);
assertEquals(isMiddleFormOnSubmitCalled, middleForm.onSubmitCalled);
assertEquals(isInnerFormOnSubmitCalled, innerForm.onSubmitCalled);
}
/**
* @param formToBeSubmitted
* absolute path of the form to be submitted
* @param componentToGetError
* relative path to <code>formToBeSumitted</code> of the component to be changed
* @return a {@link FormTester} instance
*/
private FormTester causeValidationErrorAndSubmit(String formToBeSubmitted,
String componentToGetError)
{
FormTester formTester;
formTester = tester.newFormTester(formToBeSubmitted);
formTester.setValue(componentToGetError, "");
formTester.submit("submit");
return formTester;
}
}