package org.jooby.hbv; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.expectLastCall; import static org.junit.Assert.assertEquals; import java.io.Closeable; import java.io.IOException; import java.lang.annotation.Annotation; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import org.jooby.test.MockUnit; import org.junit.Test; import com.google.inject.Injector; public class HbvConstraintValidatorFactoryTest { @SuppressWarnings("rawtypes") private static class CloseableConstraintValidator implements ConstraintValidator, Closeable { private Closeable closeable; public CloseableConstraintValidator(final Closeable closeable) { this.closeable = closeable; } @Override public void initialize(final Annotation constraintAnnotation) { } @Override public boolean isValid(final Object value, final ConstraintValidatorContext context) { return false; } @Override public void close() throws IOException { closeable.close(); } } @Test public void defaults() throws Exception { new MockUnit(Injector.class) .run(unit -> { new HbvConstraintValidatorFactory(unit.get(Injector.class)); }); } @Test public void getInstance() throws Exception { new MockUnit(Injector.class, ConstraintValidator.class) .expect(unit -> { Injector injector = unit.get(Injector.class); expect(injector.getInstance(ConstraintValidator.class)).andReturn( unit.get(ConstraintValidator.class)); }) .run(unit -> { assertEquals(unit.get(ConstraintValidator.class), new HbvConstraintValidatorFactory(unit.get(Injector.class)) .getInstance(ConstraintValidator.class)); }); } @Test public void releaseInstance() throws Exception { new MockUnit(Injector.class, ConstraintValidator.class) .run(unit -> { new HbvConstraintValidatorFactory(unit.get(Injector.class)) .releaseInstance(unit.get(ConstraintValidator.class)); }); } @Test public void releaseCloseableInstance() throws Exception { new MockUnit(Injector.class, Closeable.class) .expect(unit -> { Closeable closeable = unit.get(Closeable.class); closeable.close(); }) .run(unit -> { new HbvConstraintValidatorFactory(unit.get(Injector.class)) .releaseInstance(new CloseableConstraintValidator(unit.get(Closeable.class))); }); } @Test public void releaseCloseableInstanceWithIOError() throws Exception { new MockUnit(Injector.class, Closeable.class) .expect(unit -> { Closeable closeable = unit.get(Closeable.class); closeable.close(); expectLastCall().andThrow(new IOException("intentional err")); }) .run(unit -> { new HbvConstraintValidatorFactory(unit.get(Injector.class)) .releaseInstance(new CloseableConstraintValidator(unit.get(Closeable.class))); }); } }