/*
* Hibernate Validator, declare and validate application constraints
*
* License: Apache License, Version 2.0
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package org.hibernate.validator.test.internal.cdi;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
import static org.easymock.EasyMock.isA;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import static org.testng.Assert.fail;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import javax.enterprise.inject.Default;
import javax.enterprise.inject.spi.AfterBeanDiscovery;
import javax.enterprise.inject.spi.Annotated;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.ProcessBean;
import javax.enterprise.util.AnnotationLiteral;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import org.easymock.EasyMock;
import org.easymock.IAnswer;
import org.hibernate.validator.internal.cdi.ValidationExtension;
import org.hibernate.validator.internal.cdi.ValidationProviderHelper;
import org.hibernate.validator.internal.cdi.ValidatorBean;
import org.hibernate.validator.internal.cdi.ValidatorFactoryBean;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
/**
* @author Hardy Ferentschik
*/
public class ValidationExtensionTest {
private ValidationExtension extension;
private AfterBeanDiscovery afterBeanDiscoveryMock;
private ProcessBean processBeanMock;
private Bean<ValidatorFactory> validatorFactoryBeanMock;
private Bean<Validator> validatorBeanMock;
private BeanManager beanManagerMock;
@SuppressWarnings("unchecked")
@BeforeMethod
public void setUp() {
extension = new ValidationExtension();
afterBeanDiscoveryMock = createMock( AfterBeanDiscovery.class );
processBeanMock = createMock( ProcessBean.class );
beanManagerMock = createMock( BeanManager.class );
validatorFactoryBeanMock = createMock( Bean.class );
validatorBeanMock = createMock( Bean.class );
}
@Test
public void testNullAfterBeanDiscovery() {
try {
extension.afterBeanDiscovery( afterBeanDiscoveryMock, null );
fail();
}
catch (IllegalArgumentException e) {
// success
}
}
@Test
public void testNullBeanManager() {
try {
extension.afterBeanDiscovery( null, beanManagerMock );
fail();
}
catch (IllegalArgumentException e) {
// success
}
}
@Test
public void testNullParameters() {
try {
extension.afterBeanDiscovery( null, null );
fail();
}
catch (IllegalArgumentException e) {
// success
}
}
@Test
public void testRegisterBeanWithDefaultQualifier() {
// setup the mocks
ValidationProviderHelper validationProviderHelper = ValidationProviderHelper.forHibernateValidator();
expect( processBeanMock.getBean() ).andReturn(
new ValidatorFactoryBean(
beanManagerMock,
validationProviderHelper
)
);
expect( processBeanMock.getBean() ).andReturn(
new ValidatorBean(
beanManagerMock,
validatorFactoryBeanMock,
validationProviderHelper
)
);
afterBeanDiscoveryMock.addBean( isA( ValidatorFactoryBean.class ) );
expectLastCall();
afterBeanDiscoveryMock.addBean( isA( ValidatorBean.class ) );
expectLastCall();
// get the mocks ready
replay( processBeanMock, afterBeanDiscoveryMock, beanManagerMock );
// run the code
extension.processBean( processBeanMock );
extension.processBean( processBeanMock );
extension.afterBeanDiscovery( afterBeanDiscoveryMock, beanManagerMock );
// verify the mocks
verify( processBeanMock, afterBeanDiscoveryMock, beanManagerMock );
}
@Test
public void testRegisterBeanWithCustomQualifier() {
afterBeanDiscoveryMock.addBean( isA( ValidatorFactoryBean.class ) );
expectLastCall().andAnswer(
new IAnswer<Object>() {
@Override
public Object answer() throws Throwable {
ProcessBean<?> event = getProcessBeanEvent( (Bean<ValidatorFactory>) EasyMock.getCurrentArguments()[0] );
extension.processBean( event );
return null;
}
}
);
afterBeanDiscoveryMock.addBean( isA( ValidatorBean.class ) );
expectLastCall().andAnswer(
new IAnswer<Object>() {
@Override
public Object answer() throws Throwable {
ProcessBean<?> event = getProcessBeanEvent( (Bean<ValidatorBean>) EasyMock.getCurrentArguments()[0] );
extension.processBean( event );
return null;
}
}
);
// get the mocks ready
replay( afterBeanDiscoveryMock, beanManagerMock );
// run the code
extension.afterBeanDiscovery( afterBeanDiscoveryMock, beanManagerMock );
// verify the mocks
verify( afterBeanDiscoveryMock, beanManagerMock );
}
@Test
public void testNoRegistrationRequired() {
// setup the mocks
Set<Type> validatorFactoryBeanTypes = new HashSet<Type>();
validatorFactoryBeanTypes.add( ValidatorFactory.class );
Set<Type> validatorBeanTypes = new HashSet<Type>();
validatorBeanTypes.add( Validator.class );
Set<Annotation> qualifiers = Collections.<Annotation>singleton(
new AnnotationLiteral<Default>() {
}
);
expect( processBeanMock.getBean() ).andReturn( validatorFactoryBeanMock );
expect( validatorFactoryBeanMock.getTypes() ).andReturn( validatorFactoryBeanTypes );
expect( validatorFactoryBeanMock.getQualifiers() ).andReturn( qualifiers );
expect( validatorFactoryBeanMock.getQualifiers() ).andReturn( qualifiers );
expect( processBeanMock.getBean() ).andReturn( validatorBeanMock );
expect( validatorBeanMock.getTypes() ).andReturn( validatorBeanTypes );
expect( validatorBeanMock.getTypes() ).andReturn( validatorBeanTypes );
expect( validatorBeanMock.getQualifiers() ).andReturn( qualifiers );
expect( validatorBeanMock.getQualifiers() ).andReturn( qualifiers );
// get the mocks ready
replay( processBeanMock, validatorFactoryBeanMock, validatorBeanMock, beanManagerMock );
// run the code
extension.processBean( processBeanMock );
extension.processBean( processBeanMock );
// verify the mocks
verify( processBeanMock, validatorFactoryBeanMock, validatorBeanMock, beanManagerMock );
}
@Test
public void testProcessAnnotatedTypeNullParameter() {
try {
extension.processAnnotatedType( null );
fail();
}
catch (IllegalArgumentException e) {
// success
}
}
private <T> ProcessBean<T> getProcessBeanEvent(final Bean<T> bean) {
return new ProcessBean<T>() {
@Override
public Annotated getAnnotated() {
return null;
}
@Override
public Bean<T> getBean() {
return bean;
}
@Override
public void addDefinitionError(Throwable t) {
}
};
}
}