Updated Branches: refs/heads/master d6e110345 -> fd910746d
WICKET-4757 fix form validation bug where form components would remain invalid until their error messages were rendered Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/fd910746 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/fd910746 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/fd910746 Branch: refs/heads/master Commit: fd910746d7c1ed83f49eb58c63c6249439b9a0cd Parents: ed2b021 Author: Igor Vaynberg <igor.vaynb...@gmail.com> Authored: Mon Sep 10 22:44:16 2012 -0700 Committer: Igor Vaynberg <igor.vaynb...@gmail.com> Committed: Mon Sep 10 22:44:16 2012 -0700 ---------------------------------------------------------------------- .../org/apache/wicket/markup/html/form/Form.java | 3 +- .../markup/html/form/FormValidationTest.java | 148 +++++++++++++++ 2 files changed, 149 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/fd910746/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java index 9d46baf..d3c9b8b 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java @@ -170,8 +170,7 @@ public class Form<T> extends WebMarkupContainer implements IFormSubmitListener return; } - if (formComponent.isVisibleInHierarchy() && formComponent.isValid() && - formComponent.isEnabledInHierarchy()) + if (formComponent.isVisibleInHierarchy() && formComponent.isEnabledInHierarchy()) { validate(formComponent); } http://git-wip-us.apache.org/repos/asf/wicket/blob/fd910746/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormValidationTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormValidationTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormValidationTest.java new file mode 100644 index 0000000..b3dede8 --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormValidationTest.java @@ -0,0 +1,148 @@ +/* + * 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 static org.junit.Assert.*; + +import org.apache.wicket.MarkupContainer; +import org.apache.wicket.markup.IMarkupResourceStreamProvider; +import org.apache.wicket.markup.html.WebPage; +import org.apache.wicket.model.Model; +import org.apache.wicket.util.resource.IResourceStream; +import org.apache.wicket.util.resource.StringResourceStream; +import org.apache.wicket.util.tester.FormTester; +import org.apache.wicket.util.tester.WicketTesterScope; +import org.junit.Rule; +import org.junit.Test; + +/** + * Form validation related tests + * + * @author igor + */ +public class FormValidationTest +{ + @Rule + public WicketTesterScope scope = new WicketTesterScope(); + + /** + * Tests validation of form components when all errors are rendered using a feedback panel. + * + * Validation status depends on whether or not a form component has error messages, here we test + * submission roundtrip in a usecase where all error messages are rendered and cleared at the + * end of the request. + */ + @Test + public void renderedFeedbackMessages() + { + // start the page + + TestPage page = new TestPage(); + scope.getTester().startPage(page); + + // submit the form without filling out any values + + FormTester formTester = scope.getTester().newFormTester(page.form.getPageRelativePath()); + formTester.setClearFeedbackMessagesBeforeSubmit(true); + formTester.submit(); + + // the first required form component should fail and so should the form + + assertTrue(page.form.hasError()); + assertFalse(page.field1.isValid()); + + // fill out a value and submit again + + formTester = scope.getTester().newFormTester(page.form.getPageRelativePath()); + formTester.setValue(page.field1, "hi"); + formTester.setClearFeedbackMessagesBeforeSubmit(true); + formTester.submit(); + + // now the form and the form component should be valid + + assertFalse(page.form.hasError()); + assertTrue(page.field1.isValid()); + } + + /** + * Tests validation of form components when not all errors are rendered (maybe a missing + * feedback panel, maybe a feedback panel with a filter). + * + * Validation status depends on whether or not a form component has error messages, here we test + * submission roundtrip in a usecase where not all error messages are rendered and cleared at + * the end of the request. + * + * Even though a form component has error messages not rendered from the previous submission + * they should not block the component from re-validating. + */ + @Test + public void unrenderedFeedbackMessages() + { + // start the page + + TestPage page = new TestPage(); + scope.getTester().startPage(page); + + // submit the form without filling out any values + + FormTester formTester = scope.getTester().newFormTester(page.form.getPageRelativePath()); + formTester.setClearFeedbackMessagesBeforeSubmit(false); + formTester.submit(); + + // the first required form component should fail and so should the form + + assertTrue(page.form.hasError()); + assertFalse(page.field1.isValid()); + + // fill out a value and submit again + + formTester = scope.getTester().newFormTester(page.form.getPageRelativePath()); + formTester.setValue(page.field1, "hi"); + formTester.setClearFeedbackMessagesBeforeSubmit(false); + formTester.submit(); + + // now the form and the form component should be valid + + assertFalse(page.form.hasError()); + assertTrue(page.field1.isValid()); + } + + + public static class TestPage extends WebPage implements IMarkupResourceStreamProvider + { + public final TextField field1; + public final Form form; + + public TestPage() + { + form = new Form("form"); + add(form); + form.add(field1 = new TextField("field1", Model.of(""))); + field1.setRequired(true); + } + + @Override + public IResourceStream getMarkupResourceStream(MarkupContainer container, + Class<?> containerClass) + { + return new StringResourceStream("<html><body>"// + + "<form wicket:id='form'><input wicket:id='field1' type='text'/></form>" // + + "</body></html>"); + } + } + +}