package com.hubspot.dropwizard.guice;
import com.codahale.metrics.MetricRegistry;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.hubspot.dropwizard.guice.objects.*;
import io.dropwizard.Bundle;
import io.dropwizard.jackson.Jackson;
import io.dropwizard.lifecycle.Managed;
import io.dropwizard.lifecycle.setup.LifecycleEnvironment;
import io.dropwizard.servlets.tasks.Task;
import io.dropwizard.setup.AdminEnvironment;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Spy;
import org.mockito.runners.MockitoJUnitRunner;
import java.util.Set;
import java.util.SortedSet;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class AutoConfigTest {
private final Injector injector = Guice.createInjector(new TestModule());
@Spy
private Environment environment = new Environment("test env", Jackson.newObjectMapper(), null, new MetricRegistry(), null);
private AutoConfig autoConfig;
@Before
public void setUp() {
//when
autoConfig = new AutoConfig(getClass().getPackage().getName());
}
@Test
public void addBundlesDuringBootStrap() {
//given
final Bootstrap bootstrap = mock(Bootstrap.class);
Bundle singletonBundle = injector.getInstance(InjectedBundle.class);
//when
autoConfig.initialize(bootstrap, injector);
verify(bootstrap).addBundle(singletonBundle);
}
@Test
public void addInjectableHealthChecks() {
//when
autoConfig.run(environment, injector);
// then
SortedSet<String> healthChecks = environment.healthChecks().getNames();
assertThat(healthChecks).contains(new InjectedHealthCheck().getName());
}
@Test
public void addProviders() {
// when
autoConfig.run(environment, injector);
//then
Set<Class<?>> components = environment.jersey().getResourceConfig().getClasses();
assertThat(components).containsOnlyOnce(InjectedProvider.class);
}
@Test
public void addResources() {
//when
autoConfig.run(environment, injector);
//then
Set<Class<?>> components = environment.jersey().getResourceConfig().getClasses();
assertThat(components).containsOnlyOnce(ExplicitResource.class);
}
@Test
public void interfaceResourcesNotAdded() {
//when
autoConfig.run(environment, injector);
//then
Set<Class<?>> components = environment.jersey().getResourceConfig().getClasses();
assertThat(components).doesNotContain(ResourceInterface.class);
}
@Test
public void addTasks() throws Exception {
//given
when(environment.admin()).thenReturn(mock(AdminEnvironment.class));
//when
autoConfig.run(environment, injector);
//then
Task task = injector.getInstance(InjectedTask.class);
assertThat(task.getName()).isEqualTo("test task");
verify(environment.admin()).addTask(task);
}
@Test
public void addManaged() {
//given
Managed managed = injector.getInstance(InjectedManaged.class);
when(environment.lifecycle()).thenReturn(mock(LifecycleEnvironment.class));
//when
autoConfig.run(environment, injector);
//then
verify(environment.lifecycle()).manage(managed);
}
}