Fix for bad association of errors generated by client-side JSR-303 when using nested, validated beans. Review at http://gwt-code-reviews.appspot.com/1644803 git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@10886 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/editor/client/impl/SimpleViolation.java b/user/src/com/google/gwt/editor/client/impl/SimpleViolation.java index 1293477..8835503 100644 --- a/user/src/com/google/gwt/editor/client/impl/SimpleViolation.java +++ b/user/src/com/google/gwt/editor/client/impl/SimpleViolation.java
@@ -75,7 +75,7 @@ @Override public Object getKey() { - return v.getLeafBean(); + return v.getRootBean(); } @Override
diff --git a/user/test/com/google/gwt/validation/example/ExampleValidationClientGwtSuite.java b/user/test/com/google/gwt/validation/example/ExampleValidationClientGwtSuite.java index c13ee78..8ec3640 100644 --- a/user/test/com/google/gwt/validation/example/ExampleValidationClientGwtSuite.java +++ b/user/test/com/google/gwt/validation/example/ExampleValidationClientGwtSuite.java
@@ -17,6 +17,7 @@ import com.google.gwt.junit.tools.GWTTestSuite; import com.google.gwt.validation.example.client.AuthorTest; +import com.google.gwt.validation.example.client.BookTest; import junit.framework.Test; @@ -28,6 +29,7 @@ GWTTestSuite suite = new GWTTestSuite( "Validation Example tests that require GWT"); suite.addTestSuite(AuthorTest.class); + suite.addTestSuite(BookTest.class); return suite; }
diff --git a/user/test/com/google/gwt/validation/example/ValidationExample.gwt.xml b/user/test/com/google/gwt/validation/example/ValidationExample.gwt.xml index a719210..fe7f629 100644 --- a/user/test/com/google/gwt/validation/example/ValidationExample.gwt.xml +++ b/user/test/com/google/gwt/validation/example/ValidationExample.gwt.xml
@@ -16,6 +16,7 @@ the License. --> <module> + <inherits name="com.google.gwt.editor.Editor" /> <inherits name="com.google.gwt.user.User" /> <inherits name="org.hibernate.validator.HibernateValidator" /> <source path="client"> @@ -24,4 +25,4 @@ class="com.google.gwt.validation.example.client.ExampleValidatorFactory"> <when-type-is class="javax.validation.ValidatorFactory" /> </replace-with> -</module> \ No newline at end of file +</module>
diff --git a/user/test/com/google/gwt/validation/example/client/BookTest.java b/user/test/com/google/gwt/validation/example/client/BookTest.java new file mode 100644 index 0000000..f954f00 --- /dev/null +++ b/user/test/com/google/gwt/validation/example/client/BookTest.java
@@ -0,0 +1,151 @@ +/* + * Copyright 2012 Google Inc. + * + * Licensed 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 com.google.gwt.validation.example.client; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.editor.client.Editor; +import com.google.gwt.editor.client.EditorError; +import com.google.gwt.editor.client.SimpleBeanEditorDriver; +import com.google.gwt.editor.ui.client.ValueBoxEditorDecorator; +import com.google.gwt.junit.client.GWTTestCase; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.TextBox; + +import java.util.List; +import java.util.Set; + +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; + +/** + * Tests for {@link Book}. + */ +public class BookTest extends GWTTestCase { + + private Author author; + private Book book; + private BookWidget bookWidget; + private Driver driver; + + private Validator validator; + + @Override + public String getModuleName() { + return "com.google.gwt.validation.example.ValidationExample"; + } + + public void testValidate_emptyAuthorLastName() { + initValidBook(); + author.setLastName(""); + Set<ConstraintViolation<Book>> violations = validator.validate(book); + assertEquals(1, violations.size()); + ConstraintViolation<Book> violation = violations.iterator().next(); + + assertEquals(author, violation.getLeafBean()); + assertEquals(book, violation.getRootBean()); + assertEquals("author.lastName", violation.getPropertyPath().toString()); + } + + public void testValidate_valid() { + initValidBook(); + Set<ConstraintViolation<Book>> violations = validator.validate(book); + assertTrue(violations.isEmpty()); + } + + public void testErrorDisplay_noErrors() { + initValidBook(); + driver.initialize(bookWidget); + driver.edit(book); + assertEquals("Smith", bookWidget.author.lastName.asEditor().getValue()); + + Set<ConstraintViolation<Book>> violations = validator.validate(book); + assertTrue(violations.isEmpty()); + + driver.setConstraintViolations(doHorribleCast(violations)); + } + + public void testErrorDisplay_lastNameError() { + initValidBook(); + driver.initialize(bookWidget); + driver.edit(book); + + bookWidget.author.lastName.asEditor().setValue(""); + driver.flush(); + assertEquals(null, author.getLastName()); + + Set<ConstraintViolation<Book>> violations = validator.validate(book); + assertEquals(1, violations.size()); + + driver.setConstraintViolations(doHorribleCast(violations)); + List<EditorError> errors = bookWidget.author.errors; + // Note: Is the fact that there are 2 errors here (rather than just one) also a bug? + assertEquals(2, errors.size()); + + EditorError error = errors.get(0); + assertEquals(bookWidget.author.lastName.asEditor(), error.getEditor()); + // There is a bug here - error.getPath() throws a StringIndexOutOfBoundsException. + // The pathPrefixLength is set in ErrorCollector line 63. It breaks the toString() method + // of SimpleError as well. + assertEquals("author.lastName", error.getAbsolutePath()); + } + + @Override + protected final void gwtSetUp() throws Exception { + super.gwtSetUp(); + author = new Author(); + book = new Book(); + validator = Validation.buildDefaultValidatorFactory().getValidator(); + bookWidget = new BookWidget(); + driver = GWT.create(Driver.class); + } + + protected void initValidBook() { + author.setFirstName("John"); + author.setLastName("Smith"); + author.setCompany("Google"); + book.setAuthor(author); + book.setTitle("JSR-303 Validation in GWT"); + } + + @SuppressWarnings("unchecked") + private Iterable<ConstraintViolation<?>> doHorribleCast(Object o) { + return (Iterable<ConstraintViolation<?>>) o; + } + + interface Driver extends SimpleBeanEditorDriver<Book, BookWidget> { } + + class BookWidget extends Composite implements Editor<Book> { + AuthorWidget author = new AuthorWidget(); + } + + class AuthorWidget extends Composite implements Editor<Author> { + ValueBoxEditorDecorator<String> lastName; + + List<EditorError> errors; + + AuthorWidget() { + lastName = new ValueBoxEditorDecorator<String>() { + @Override + public void showErrors(List<EditorError> errors) { + super.showErrors(errors); + AuthorWidget.this.errors = errors; + } + }; + lastName.setValueBox(new TextBox()); + } + } +}
diff --git a/user/test/com/google/gwt/validation/example/client/ExampleValidatorFactory.java b/user/test/com/google/gwt/validation/example/client/ExampleValidatorFactory.java index 05f1a70..4aae839 100644 --- a/user/test/com/google/gwt/validation/example/client/ExampleValidatorFactory.java +++ b/user/test/com/google/gwt/validation/example/client/ExampleValidatorFactory.java
@@ -41,7 +41,7 @@ * client. */ @GwtValidation( - value = {Author.class}, + value = {Author.class, Book.class}, groups = {Default.class, ClientGroup.class}) public interface GwtValidator extends Validator { }