package com.englishtown.vertx.guice;
import com.englishtown.vertx.jersey.JerseyHandler;
import com.englishtown.vertx.jersey.JerseyServerOptions;
import com.englishtown.vertx.jersey.VertxContainer;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.TypeLiteral;
import org.glassfish.hk2.api.DynamicConfiguration;
import org.glassfish.hk2.api.DynamicConfigurationService;
import org.glassfish.hk2.api.ServiceLocator;
import org.glassfish.jersey.server.model.ModelProcessor;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.jvnet.hk2.guice.bridge.api.GuiceIntoHK2Bridge;
import org.mockito.Matchers;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.ReaderInterceptor;
import javax.ws.rs.ext.WriterInterceptor;
import java.util.LinkedHashSet;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class GuiceJerseyServerTest {
GuiceJerseyServer server;
@Mock
JerseyHandler handler;
@Mock
VertxContainer container;
@Mock
JerseyServerOptions options;
@Mock
ServiceLocator locator;
@Mock
DynamicConfigurationService dcs;
@Mock
DynamicConfiguration dc;
@Mock
Injector injector;
@Mock
GuiceIntoHK2Bridge bridge;
@Before
public void setUp() throws Exception {
when(locator.getService(eq(GuiceIntoHK2Bridge.class))).thenReturn(bridge);
when(locator.getService(eq(DynamicConfigurationService.class))).thenReturn(dcs);
when(dcs.createDynamicConfiguration()).thenReturn(dc);
Key<Set<ContainerRequestFilter>> key = Key.get(new TypeLiteral<Set<ContainerRequestFilter>>() {
});
Set<ContainerRequestFilter> set = new LinkedHashSet<>();
set.add(mock(ContainerRequestFilter.class));
when(injector.getInstance(Matchers.any(key.getClass()))).thenReturn(set);
server = new GuiceJerseyServer(handler, container, () -> options, locator, injector);
}
@Test
@SuppressWarnings("unchecked")
public void testInjectMultiBindings() throws Exception {
Key<?> key;
key = Key.get(new TypeLiteral<Set<ContainerRequestFilter>>() {
});
Set<ContainerRequestFilter> requestFilters = (Set<ContainerRequestFilter>) injector.getInstance(key);
assertEquals(1, requestFilters.size());
verify(injector, times(2)).getInstance(eq(key));
key = Key.get(new TypeLiteral<Set<ContainerResponseFilter>>() {
});
verify(injector).getInstance(eq(key));
key = Key.get(new TypeLiteral<Set<ReaderInterceptor>>() {
});
verify(injector).getInstance(eq(key));
key = Key.get(new TypeLiteral<Set<WriterInterceptor>>() {
});
verify(injector).getInstance(eq(key));
key = Key.get(new TypeLiteral<Set<ModelProcessor>>() {
});
verify(injector).getInstance(eq(key));
}
}