/* * 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.markup.html.WebPage; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.util.tester.FormTester; import org.apache.wicket.util.tester.WicketTestCase; import org.junit.After; import org.junit.Before; import org.junit.Test; public class NestedFormSubmitTest extends WicketTestCase { public class TestForm<S> extends Form<S> { private final IModel<Boolean> submitted; private final Button submit; private final boolean wantInclusion; private final boolean wantExclusion; TestForm(String id, IModel<Boolean> submitted, boolean wantInclusion, boolean wantExclusion) { super(id); this.submitted = submitted; this.wantInclusion = wantInclusion; this.wantExclusion = wantExclusion; submit = new Button("submit"); add(submit); } @Override protected void onSubmit() { super.onSubmit(); submitted.setObject(Boolean.TRUE); } @Override public boolean wantSubmitOnNestedFormSubmit() { return wantInclusion; } @Override public boolean wantSubmitOnParentFormSubmit() { return wantExclusion; } } public class TestPage extends WebPage { private final TestForm<?> outer; private final TestForm<?> middle; private final TestForm<?> inner; public TestPage(IModel<Boolean> submittedOuter, boolean outerWantsInclusion, IModel<Boolean> submittedMiddle, boolean middleWantsInclusion, boolean middleWantsExclusion, IModel<Boolean> submittedInner) { outer = new TestForm<Void>("outer", submittedOuter, outerWantsInclusion, true); this.add(outer); middle = new TestForm<Void>("middle", submittedMiddle, middleWantsInclusion, middleWantsExclusion); outer.add(middle); inner = new TestForm<Void>("inner", submittedInner, false, true); middle.add(inner); } } private Model<Boolean> submittedOuter; private Model<Boolean> submittedMiddle; private Model<Boolean> submittedInner; private TestPage page; @Before public void setUp() throws Exception { submittedOuter = Model.of(false); submittedMiddle = Model.of(false); submittedInner = Model.of(false); } @After public void tearDown() throws Exception { submittedInner.setObject(false); submittedMiddle.setObject(false); submittedOuter.setObject(false); } private void assertFormSubmitOuter(boolean expectSubmittedOuter, boolean expectSubmittedMiddle, boolean expectSubmittedInner) { FormTester form = tester.newFormTester(page.outer.getPageRelativePath()); form.submit("submit"); assertFormsAreSubmitted(expectSubmittedOuter, expectSubmittedMiddle, expectSubmittedInner); } private void assertFormSubmitMiddle(boolean expectSubmittedOuter, boolean expectSubmittedMiddle, boolean expectSubmittedInner) { FormTester form = tester.newFormTester(page.outer.getPageRelativePath()); form.submit("middle:submit"); assertFormsAreSubmitted(expectSubmittedOuter, expectSubmittedMiddle, expectSubmittedInner); } private void assertFormSubmitInner(boolean expectSubmittedOuter, boolean expectSubmittedMiddle, boolean expectSubmittedInner) { FormTester form = tester.newFormTester(page.outer.getPageRelativePath()); form.submit("middle:inner:submit"); assertFormsAreSubmitted(expectSubmittedOuter, expectSubmittedMiddle, expectSubmittedInner); } private void assertFormsAreSubmitted(boolean expectSubmittedOuter, boolean expectSubmittedMiddle, boolean expectSubmittedInner) { assertEquals("outer", expectSubmittedOuter, submittedOuter.getObject().booleanValue()); assertEquals("middle", expectSubmittedMiddle, submittedMiddle.getObject().booleanValue()); assertEquals("inner", expectSubmittedInner, submittedInner.getObject().booleanValue()); } @Test public void testDefaultOuterSubmitShouldSubmitAll() throws Exception { startPage(false, false, true); assertFormSubmitOuter(true, true, true); } @Test public void testDefaultMiddleSubmitShouldSubmitMiddleAndInner() throws Exception { startPage(false, false, true); assertFormSubmitMiddle(false, true, true); } @Test public void testDefaultInnerSubmitShouldSubmitOnlyInner() throws Exception { startPage(false, false, true); assertFormSubmitInner(false, false, true); } @Test public void testWithOuterInclusionOuterIsSubmittedOnMiddleSubmit() throws Exception { startPage(true, false, true); assertFormSubmitMiddle(true, true, true); } @Test public void testWithOuterInclusionOuterIsSubmittedOnInnerSubmit() throws Exception { startPage(true, false, true); assertFormSubmitInner(true, true, true); } @Test public void testWithMiddleInclusionMiddleIsSubmittedOnInnerSubmit() throws Exception { startPage(false, true, true); assertFormSubmitInner(false, true, true); } @Test public void testWithMiddleAndOuterInclusionMiddleAndOuterIsSubmittedOnInnerSubmit() throws Exception { startPage(true, true, true); assertFormSubmitInner(true, true, true); } @Test public void testWithMiddleExclusionAndOuterIsSubmitted() throws Exception { startPage(false, false, false); assertFormSubmitOuter(true, false, false); } private void startPage(boolean outerWantsInclusion, boolean middleWantsInclusion, boolean middleWantsExclusion) { page = (TestPage)tester.startPage(new TestPage(submittedOuter, outerWantsInclusion, submittedMiddle, middleWantsInclusion, middleWantsExclusion, submittedInner)); } }