package org.jooby.hbv; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.isA; import static org.junit.Assert.assertEquals; import java.util.function.BiConsumer; import java.util.function.Consumer; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.bootstrap.ProviderSpecificBootstrap; import org.hibernate.validator.HibernateValidator; import org.hibernate.validator.HibernateValidatorConfiguration; import org.jooby.Env; import org.jooby.Parser; import org.jooby.test.MockUnit; import org.jooby.test.MockUnit.Block; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import com.google.inject.Binder; import com.google.inject.binder.AnnotatedBindingBuilder; import com.google.inject.binder.LinkedBindingBuilder; import com.google.inject.binder.ScopedBindingBuilder; import com.google.inject.multibindings.Multibinder; import com.typesafe.config.Config; import com.typesafe.config.ConfigFactory; import com.typesafe.config.ConfigValueFactory; @RunWith(PowerMockRunner.class) @PrepareForTest({Hbv.class, Validation.class, Multibinder.class }) public class HbvTest { @SuppressWarnings("unchecked") private Block hibernateValiConf = unit -> { HibernateValidatorConfiguration hvc = unit.get(HibernateValidatorConfiguration.class); ProviderSpecificBootstrap<HibernateValidatorConfiguration> provider = unit .mock(ProviderSpecificBootstrap.class); expect(provider.configure()).andReturn(hvc); unit.mockStatic(Validation.class); expect(Validation.byProvider(HibernateValidator.class)).andReturn(provider); AnnotatedBindingBuilder<HibernateValidatorConfiguration> abbHVC = unit .mock(AnnotatedBindingBuilder.class); abbHVC.toInstance(hvc); Binder binder = unit.get(Binder.class); expect(binder.bind(HibernateValidatorConfiguration.class)).andReturn(abbHVC); }; @SuppressWarnings("unchecked") private Block validatorProvider = unit -> { ScopedBindingBuilder sbbHVF = unit.mock(ScopedBindingBuilder.class); sbbHVF.asEagerSingleton(); AnnotatedBindingBuilder<Validator> abbv = unit.mock(AnnotatedBindingBuilder.class); expect(abbv.toProvider(HbvFactory.class)).andReturn(sbbHVF); Binder binder = unit.get(Binder.class); expect(binder.bind(Validator.class)).andReturn(abbv); }; @SuppressWarnings("unchecked") private Block hvparser = unit -> { Binder binder = unit.get(Binder.class); LinkedBindingBuilder<Parser> lbbp = unit.mock(LinkedBindingBuilder.class); lbbp.toInstance(isA(HbvParser.class)); Multibinder<Parser> parsers = unit.mock(Multibinder.class); expect(parsers.addBinding()).andReturn(lbbp); unit.mockStatic(Multibinder.class); expect(Multibinder.newSetBinder(binder, Parser.class)).andReturn(parsers); }; private Block noproperties = unit -> { Config config = unit.get(Config.class); expect(config.hasPath("hibernate.validator")).andReturn(false); }; private Block properties = unit -> { Config config = unit.get(Config.class); expect(config.hasPath("hibernate.validator")).andReturn(true); Config props = ConfigFactory.empty() .withValue("fail_fast", ConfigValueFactory.fromAnyRef(true)); expect(config.getConfig("hibernate.validator")).andReturn(props); HibernateValidatorConfiguration hvc = unit.get(HibernateValidatorConfiguration.class); expect(hvc.addProperty("hibernate.validator.fail_fast", "true")).andReturn(hvc); }; private Block onStop = unit -> { Env env = unit.get(Env.class); expect(env.lifeCycle(HbvFactory.class)).andReturn(env); }; @Test public void defaults() throws Exception { new MockUnit(Env.class, Config.class, Binder.class, HibernateValidatorConfiguration.class) .expect(hibernateValiConf) .expect(noproperties) .expect(validatorProvider) .expect(hvparser) .expect(onStop) .run(unit -> { new Hbv() .configure(unit.get(Env.class), unit.get(Config.class), unit.get(Binder.class)); }); } @Test public void defaultsWithProperties() throws Exception { new MockUnit(Env.class, Config.class, Binder.class, HibernateValidatorConfiguration.class) .expect(hibernateValiConf) .expect(properties) .expect(validatorProvider) .expect(hvparser) .expect(onStop) .run(unit -> { new Hbv() .configure(unit.get(Env.class), unit.get(Config.class), unit.get(Binder.class)); }); } @Test public void conf() throws Exception { assertEquals(ConfigFactory.empty().withValue("err.javax.validation.ValidationException", ConfigValueFactory.fromAnyRef(400)), new Hbv().config()); } @SuppressWarnings("unchecked") @Test public void defaultsWithConfigurer() throws Exception { new MockUnit(Env.class, Config.class, Binder.class, HibernateValidatorConfiguration.class, Consumer.class) .expect(hibernateValiConf) .expect(noproperties) .expect(validatorProvider) .expect(hvparser) .expect(unit -> { Consumer<HibernateValidatorConfiguration> configurer = unit.get(Consumer.class); configurer.accept(unit.get(HibernateValidatorConfiguration.class)); }) .expect(onStop) .run(unit -> { new Hbv() .doWith(unit.get(Consumer.class)) .configure(unit.get(Env.class), unit.get(Config.class), unit.get(Binder.class)); }); } @SuppressWarnings("unchecked") @Test public void defaultsWithFulleConfigurer() throws Exception { new MockUnit(Env.class, Config.class, Binder.class, HibernateValidatorConfiguration.class, BiConsumer.class) .expect(hibernateValiConf) .expect(noproperties) .expect(validatorProvider) .expect(hvparser) .expect(unit -> { BiConsumer<HibernateValidatorConfiguration, Config> configurer = unit .get(BiConsumer.class); configurer.accept(unit.get(HibernateValidatorConfiguration.class), unit.get(Config.class)); }) .expect(onStop) .run(unit -> { new Hbv() .doWith(unit.get(BiConsumer.class)) .configure(unit.get(Env.class), unit.get(Config.class), unit.get(Binder.class)); }); } }