/*
* Copyright 2011 Martin Grotzke
*
* 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 de.hashcode.validation;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
import java.util.Set;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import org.hibernate.validator.constraints.impl.NotNullValidator;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Provides;
import com.google.inject.Singleton;
import de.hashcode.validation.GuiceConstraintValidatorFactory;
import de.hashcode.validation.UniqueKeyValidator;
/**
* Test for {@link GuiceConstraintValidatorFactory}.
*
* @author <a href="mailto:martin.grotzke@googlemail.com">Martin Grotzke</a>
*/
public class GuiceConstraintValidatorFactoryTest {
@SuppressWarnings("unused")
private final class TestModule extends AbstractModule {
@Override
protected void configure() {
}
@Provides
@Singleton
public ValidatorFactory getValidatorFactory(final Injector injector) {
return Validation.byDefaultProvider().configure()
.constraintValidatorFactory(new GuiceConstraintValidatorFactory(injector)).buildValidatorFactory();
}
@Provides
@Singleton
public Validator getValidator(final ValidatorFactory validatorFactory) {
return validatorFactory.getValidator();
}
@Provides
@Singleton
public UniqueKeyValidator getUniqueKeyValidator(final EntityManagerFactory entityManagerFactory) {
return new UniqueKeyValidator(entityManagerFactory.createEntityManager());
}
@Provides
@Singleton
public EntityManagerFactory getEntityManagerFactory() {
return Persistence.createEntityManagerFactory("test");
}
}
private static final Logger LOG = LoggerFactory.getLogger(UniqueKeyValidatorTest.class);
private Validator validator;
private Injector injector;
@Before
public void beforeMethod() {
injector = Guice.createInjector(new TestModule());
validator = injector.getInstance(Validator.class);
}
@Test
public void testUniqueKeyValidatorHasEntityManagerSet() {
final UniqueKeyValidator uniqueKeyValidator = injector.getInstance(UniqueKeyValidator.class);
assertNotNull(uniqueKeyValidator.getEntityManager());
}
@Test
public void testStandardValidatorIsFound() {
final NotNullValidator validator = injector.getInstance(NotNullValidator.class);
assertNotNull(validator);
}
@Test
public void testUniqueKey() {
final Entity1 obj1 = new Entity1("val1", "someValue");
// The validation already invokes the UniqueKeyValidator, so if this
// does not throw an
// error the setup is fine
final Set<? extends ConstraintViolation<?>> violations = validator.validate(obj1);
assertEquals("Unexpected violations: " + violations + ".", 0, violations.size());
}
}