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>");
+               }
+       }
+
+}

Reply via email to