package io.graceland.plugin;
import java.util.Set;
import javax.servlet.Filter;
import org.junit.Test;
import com.codahale.metrics.health.HealthCheck;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Key;
import io.dropwizard.Bundle;
import io.dropwizard.cli.Command;
import io.dropwizard.lifecycle.Managed;
import io.dropwizard.servlets.tasks.Task;
import io.graceland.filter.FilterSpec;
import io.graceland.inject.Keys;
import io.graceland.testing.TestBundle;
import io.graceland.testing.TestCommand;
import io.graceland.testing.TestConfiguration;
import io.graceland.testing.TestFilter;
import io.graceland.testing.TestHealthCheck;
import io.graceland.testing.TestManaged;
import io.graceland.testing.TestResource;
import io.graceland.testing.TestTask;
import static org.hamcrest.Matchers.hasItem;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
public class AbstractPluginTest {
@Test
public void jersey_binds_work() {
final Object jerseyComponent = new Object();
final Class<TestResource> jerseyComponentClass = TestResource.class;
Injector injector = Guice.createInjector(new AbstractPlugin() {
@Override
protected void configure() {
bindJerseyComponent(jerseyComponent);
bindJerseyComponent(jerseyComponentClass);
}
});
Set<Object> jerseySet = injector.getInstance(Keys.JerseyComponents);
assertThat(jerseySet, hasSize(2));
assertThat(jerseySet, hasItem(jerseyComponent));
assertThat(jerseySet, hasItem(TestResource.class));
}
@Test
public void managed_binds_work() {
final Managed managed = mock(Managed.class);
final Class<TestManaged> managedClass = TestManaged.class;
Injector injector = Guice.createInjector(new AbstractPlugin() {
@Override
protected void configure() {
bindManaged(managed);
bindManaged(managedClass);
}
});
Set<Managed> managedSet = injector.getInstance(Keys.ManagedObjects);
Set<Class<? extends Managed>> managedClassSet = injector.getInstance(Keys.ManagedObjectClasses);
assertThat(managedSet, hasSize(1));
assertThat(managedSet, hasItem(managed));
assertThat(managedClassSet, hasSize(1));
assertThat(managedClassSet, hasItem(TestManaged.class));
}
@Test
public void healthcheck_binds_work() {
final HealthCheck healthCheck = mock(HealthCheck.class);
final Class<TestHealthCheck> healthCheckClass = TestHealthCheck.class;
Injector injector = Guice.createInjector(new AbstractPlugin() {
@Override
protected void configure() {
bindHealthCheck(healthCheck);
bindHealthCheck(healthCheckClass);
}
});
Set<HealthCheck> healthCheckSet = injector.getInstance(Keys.HealthChecks);
Set<Class<? extends HealthCheck>> healthCheckClassSet = injector.getInstance(Keys.HealthCheckClasses);
assertThat(healthCheckSet, hasSize(1));
assertThat(healthCheckSet, hasItem(healthCheck));
assertThat(healthCheckClassSet, hasSize(1));
assertThat(healthCheckClassSet, hasItem(TestHealthCheck.class));
}
@Test
public void task_binds_work() {
final Task task = mock(Task.class);
final Class<TestTask> taskClass = TestTask.class;
Injector injector = Guice.createInjector(new AbstractPlugin() {
@Override
protected void configure() {
bindTask(task);
bindTask(taskClass);
}
});
Set<Task> taskSet = injector.getInstance(Keys.Tasks);
Set<Class<? extends Task>> taskClassSet = injector.getInstance(Keys.TaskClasses);
assertThat(taskSet, hasSize(1));
assertThat(taskSet, hasItem(task));
assertThat(taskClassSet, hasSize(1));
assertThat(taskClassSet, hasItem(TestTask.class));
}
@Test
public void bundle_binds_work() {
final Bundle bundle = mock(Bundle.class);
final Class<TestBundle> bundleClass = TestBundle.class;
Injector injector = Guice.createInjector(new AbstractPlugin() {
@Override
protected void configure() {
bindBundle(bundle);
bindBundle(bundleClass);
}
});
Set<Bundle> bundleSet = injector.getInstance(Keys.Bundles);
Set<Class<? extends Bundle>> bundleClassSet = injector.getInstance(Keys.BundleClasses);
assertThat(bundleSet, hasSize(1));
assertThat(bundleSet, hasItem(bundle));
assertThat(bundleClassSet, hasSize(1));
assertThat(bundleClassSet, hasItem(TestBundle.class));
}
@Test
public void command_binds_work() {
final Command command = mock(Command.class);
final Class<TestCommand> commandClass = TestCommand.class;
Injector injector = Guice.createInjector(new AbstractPlugin() {
@Override
protected void configure() {
bindCommand(command);
bindCommand(commandClass);
}
});
Set<Command> commandSet = injector.getInstance(Keys.Commands);
Set<Class<? extends Command>> commandClassSet = injector.getInstance(Keys.CommandClasses);
assertThat(commandSet, hasSize(1));
assertThat(commandSet, hasItem(command));
assertThat(commandClassSet, hasSize(1));
assertThat(commandClassSet, hasItem(TestCommand.class));
}
@Test
public void configuration_binds_work() {
final TestConfiguration testConfiguration = new TestConfiguration();
Injector injector = Guice.createInjector(new AbstractPlugin() {
@Override
protected void configure() {
bindConfiguration(TestConfiguration.class).toInstance(testConfiguration);
}
});
TestConfiguration actualConfiguration = injector.getInstance(Key.get(TestConfiguration.class));
assertThat(actualConfiguration, is(testConfiguration));
}
@Test
public void filter_binds_work() {
final Filter filter = mock(Filter.class);
final Class<TestFilter> filterClass = TestFilter.class;
Injector injector = Guice.createInjector(new AbstractPlugin() {
@Override
protected void configure() {
buildFilter(filter).withPriority(100).bind();
buildFilter(filterClass).withName("myName").bind();
}
});
Set<FilterSpec> filterSpecSet = injector.getInstance(Keys.FilterSpecs);
assertThat(filterSpecSet, hasSize(2));
}
}