package io.graceland.filter; import org.junit.Test; import com.google.common.collect.Iterables; import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Injector; import io.graceland.inject.Keys; import io.graceland.testing.TestFilter; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; public class FilterBinderTest { private final TestFilter filter = new TestFilter(); private final int filterPriority = 999; private final String filterName = "my-filter-filterName"; @Test public void binds_from_instance() { AbstractModule abstractModule = new AbstractModule() { @Override protected void configure() { FilterBinder .forInstance(binder(), filter) .withPriority(filterPriority) .withName(filterName) .bind(); } }; verifyInjectedValue(abstractModule, filterPriority, filterName, FilterBinder.DEFAULT_PATTERN); } @Test public void binds_from_class() { AbstractModule abstractModule = new AbstractModule() { @Override protected void configure() { FilterBinder .forClass(binder(), TestFilter.class) .withPriority(filterPriority) .withName(filterName) .bind(); } }; verifyInjectedValue(abstractModule, filterPriority, filterName, FilterBinder.DEFAULT_PATTERN); } @Test public void uses_default_values() { AbstractModule abstractModule = new AbstractModule() { @Override protected void configure() { FilterBinder.forClass(binder(), TestFilter.class).bind(); } }; verifyInjectedValue( abstractModule, FilterBinder.DEFAULT_PRIORITY, TestFilter.class.getSimpleName(), FilterBinder.DEFAULT_PATTERN); } @Test public void can_add_more_than_one_patterns() { final FilterPattern pattern1 = mock(FilterPattern.class); final FilterPattern pattern2 = mock(FilterPattern.class); AbstractModule abstractModule = new AbstractModule() { @Override protected void configure() { FilterBinder .forClass(binder(), TestFilter.class) .withPriority(filterPriority) .addPattern(pattern1) .addPattern(pattern2) .withName(filterName) .bind(); } }; verifyInjectedValue(abstractModule, filterPriority, filterName, pattern1, pattern2); } private void verifyInjectedValue( AbstractModule abstractModule, int priority, String name, FilterPattern... patterns) { Injector injector = Guice.createInjector(abstractModule); FilterSpec filterSpec = Iterables.getFirst(injector.getInstance(Keys.FilterSpecs), null); assertThat(filterSpec, is(not(nullValue()))); assertThat(filterSpec.getPriority(), is(priority)); assertThat(filterSpec.getName(), is(name)); assertThat(filterSpec.getPatterns(), containsInAnyOrder(patterns)); } }