/*
* 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());
}
}
}