package denominator; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import dagger.ObjectGraph; import denominator.mock.MockProvider; import static org.assertj.core.api.Assertions.assertThat; public class ProvidersTest { @Rule public final ExpectedException thrown = ExpectedException.none(); @Test public void niceMessageWhenProviderNotFound() { thrown.expect(IllegalArgumentException.class); thrown.expectMessage("provider foo not in set of configured providers: [mock]"); Providers.getByName("foo"); } @Test public void illegalArgumentWhenMissingModule() { thrown.expect(IllegalArgumentException.class); thrown.expectMessage("NoModuleProvider should have a static inner class named Module"); Providers.instantiateModule(new NoModuleProvider()); } @Test public void illegalArgumentWhenModuleCtorHasArgs() { thrown.expect(IllegalArgumentException.class); thrown.expectMessage("Module has a no-args constructor"); Providers.instantiateModule(new WrongCtorModuleProvider()); } @Test public void provideReturnsSameInstance() { FooProvider provider = new FooProvider(); DNSApiManager mgr = ObjectGraph.create(Providers.provide(provider), new FooProvider.Module()).get( DNSApiManager.class); assertThat(mgr.provider()).isSameAs(provider); } @Test public void withUrlOverrides() { Provider provider = Providers.withUrl(new URLProvider(), "http://bar"); assertThat(provider.url()).isEqualTo("http://bar"); } @Test public void withUrlWhenProviderMissingStringCtor() { thrown.expect(IllegalArgumentException.class); thrown.expectMessage("FooProvider does not have a String parameter constructor"); Providers.withUrl(new FooProvider(), "http://bar"); } @Test public void anonymousProviderPermitted() { FooProvider provider = new FooProvider() { @Override public String name() { return "bar"; } @Override public String url() { return "http://bar"; } }; DNSApiManager mgr = ObjectGraph.create(Providers.provide(provider), new FooProvider.Module()).get( DNSApiManager.class); assertThat(mgr.provider().name()).isEqualTo("bar"); assertThat(provider.url()).isEqualTo("http://bar"); } static class NoModuleProvider extends BasicProvider { } static class WrongCtorModuleProvider extends BasicProvider { @dagger.Module(injects = DNSApiManager.class, includes = MockProvider.Module.class, complete = false) static class Module { Module(String name) { } } } static class FooProvider extends BasicProvider { @dagger.Module(injects = DNSApiManager.class, includes = MockProvider.Module.class, complete = false) static class Module { } } static class URLProvider extends BasicProvider { private final String url; public URLProvider() { this(null); } public URLProvider(String url) { this.url = url == null || url.isEmpty() ? "http://foo" : url; } @Override public String url() { return url; } @dagger.Module(injects = DNSApiManager.class, includes = MockProvider.Module.class, complete = false) static class Module { } } }