package io.graceland.configuration;
import org.junit.Test;
import com.google.inject.AbstractModule;
import com.google.inject.Binder;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Key;
import io.graceland.testing.TestAnnotation;
import io.graceland.testing.TestConfiguration;
import io.graceland.testing.TestFileConfiguration;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
public class ConfigurationBinderTest {
@Test(expected = NullPointerException.class)
public void constructor_class_cannot_be_null() {
ConfigurationBinder.forClass(null, mock(Binder.class));
}
@Test(expected = NullPointerException.class)
public void constructor_binder_cannot_be_null() {
ConfigurationBinder.forClass(TestConfiguration.class, null);
}
@Test(expected = NullPointerException.class)
public void toInstance_cannot_bind_null() {
ConfigurationBinder
.forClass(TestConfiguration.class, mock(Binder.class))
.toInstance(null);
}
@Test
public void toInstance_binds_an_instance() {
final TestConfiguration expectedConfiguration = new TestConfiguration();
Injector injector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
ConfigurationBinder
.forClass(TestConfiguration.class, binder())
.toInstance(expectedConfiguration);
}
});
assertThat(
injector.getInstance(Key.get(TestConfiguration.class)),
is(expectedConfiguration));
}
@Test
public void toInstance_binds_an_annotated_instance() {
final TestConfiguration expectedConfiguration = new TestConfiguration();
Injector injector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
ConfigurationBinder
.forClass(TestConfiguration.class, binder())
.annotatedWith(TestAnnotation.class).toInstance(expectedConfiguration);
}
});
assertThat(
injector.getInstance(Key.get(TestConfiguration.class, TestAnnotation.class)),
is(expectedConfiguration));
}
@Test(expected = NullPointerException.class)
public void toFile_cannot_bind_null() {
ConfigurationBinder
.forClass(TestConfiguration.class, mock(Binder.class))
.toFile(null);
}
@Test(expected = IllegalArgumentException.class)
public void toFile_file_must_exist() {
ConfigurationBinder
.forClass(TestFileConfiguration.class, mock(Binder.class))
.toFile("file/does/not/exist.yml");
}
@Test
public void toFile_binds_to_a_file() {
final TestFileConfiguration expectedConfiguration = new TestFileConfiguration(123, "xyz");
Injector injector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
ConfigurationBinder
.forClass(TestFileConfiguration.class, binder())
.toFile("src/test/resources/fixtures/io/graceland/configuration/ConfigurationBinder/test.yml");
}
});
assertThat(
injector.getInstance(Key.get(TestFileConfiguration.class)),
equalTo(expectedConfiguration));
}
@Test
public void toFile_binds_to_an_annotated_file() {
final TestFileConfiguration expectedConfiguration = new TestFileConfiguration(123, "xyz");
Injector injector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
ConfigurationBinder
.forClass(TestFileConfiguration.class, binder())
.annotatedWith(TestAnnotation.class)
.toFile("src/test/resources/fixtures/io/graceland/configuration/ConfigurationBinder/test.yml");
}
});
assertThat(
injector.getInstance(Key.get(TestFileConfiguration.class, TestAnnotation.class)),
equalTo(expectedConfiguration));
}
}