package org.jooby.mail;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.isA;
import static org.junit.Assert.assertEquals;
import org.apache.commons.mail.HtmlEmail;
import org.apache.commons.mail.ImageHtmlEmail;
import org.apache.commons.mail.MultiPartEmail;
import org.apache.commons.mail.SimpleEmail;
import org.jooby.Env;
import org.jooby.Env.ServiceKey;
import org.jooby.internal.mail.HtmlEmailProvider;
import org.jooby.internal.mail.ImageHtmlEmailProvider;
import org.jooby.internal.mail.MultiPartEmailProvider;
import org.jooby.internal.mail.SimpleEmailProvider;
import org.jooby.test.MockUnit;
import org.junit.Test;
import com.google.inject.Binder;
import com.google.inject.Key;
import com.google.inject.binder.AnnotatedBindingBuilder;
import com.google.inject.name.Names;
import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;
public class CommonsEmailTest {
@SuppressWarnings("unchecked")
@Test
public void configure() throws Exception {
ServiceKey serviceKey = new Env.ServiceKey();
new MockUnit(Env.class, Config.class, Binder.class)
.expect(unit -> {
Env env = unit.get(Env.class);
expect(env.serviceKey()).andReturn(serviceKey);
Config config = unit.get(Config.class);
Config mail = unit.mock(Config.class);
expect(mail.withFallback(config)).andReturn(mail);
expect(config.getConfig("mail")).andReturn(mail);
expect(config.getConfig("mail")).andReturn(config);
AnnotatedBindingBuilder<SimpleEmail> abbSE = unit.mock(AnnotatedBindingBuilder.class);
expect(abbSE.toProvider(isA(SimpleEmailProvider.class))).andReturn(null).times(2);
AnnotatedBindingBuilder<HtmlEmail> abbHE = unit.mock(AnnotatedBindingBuilder.class);
expect(abbHE.toProvider(isA(HtmlEmailProvider.class))).andReturn(null).times(2);
AnnotatedBindingBuilder<MultiPartEmail> abbMPE = unit
.mock(AnnotatedBindingBuilder.class);
expect(abbMPE.toProvider(isA(MultiPartEmailProvider.class))).andReturn(null).times(2);
AnnotatedBindingBuilder<ImageHtmlEmail> abbIHE = unit
.mock(AnnotatedBindingBuilder.class);
expect(abbIHE.toProvider(isA(ImageHtmlEmailProvider.class))).andReturn(null).times(2);
Binder binder = unit.get(Binder.class);
expect(binder.bind(Key.get(SimpleEmail.class))).andReturn(abbSE);
expect(binder.bind(Key.get(SimpleEmail.class, Names.named("mail")))).andReturn(abbSE);
expect(binder.bind(Key.get(HtmlEmail.class))).andReturn(abbHE);
expect(binder.bind(Key.get(HtmlEmail.class, Names.named("mail")))).andReturn(abbHE);
expect(binder.bind(Key.get(MultiPartEmail.class))).andReturn(abbMPE);
expect(binder.bind(Key.get(MultiPartEmail.class, Names.named("mail")))).andReturn(abbMPE);
expect(binder.bind(Key.get(ImageHtmlEmail.class))).andReturn(abbIHE);
expect(binder.bind(Key.get(ImageHtmlEmail.class, Names.named("mail")))).andReturn(abbIHE);
})
.run(unit -> {
new CommonsEmail()
.configure(unit.get(Env.class), unit.get(Config.class), unit.get(Binder.class));
});
/** Just named object now, we shared the serviceKey registry. */
new MockUnit(Env.class, Config.class, Binder.class)
.expect(unit -> {
Env env = unit.get(Env.class);
expect(env.serviceKey()).andReturn(serviceKey);
Config config = unit.get(Config.class);
Config mail = unit.mock(Config.class);
expect(config.withFallback(mail)).andReturn(mail);
expect(config.getConfig("mail")).andReturn(mail);
expect(config.getConfig("office")).andReturn(config);
AnnotatedBindingBuilder<SimpleEmail> abbSE = unit.mock(AnnotatedBindingBuilder.class);
expect(abbSE.toProvider(isA(SimpleEmailProvider.class))).andReturn(null);
AnnotatedBindingBuilder<HtmlEmail> abbHE = unit.mock(AnnotatedBindingBuilder.class);
expect(abbHE.toProvider(isA(HtmlEmailProvider.class))).andReturn(null);
AnnotatedBindingBuilder<MultiPartEmail> abbMPE = unit
.mock(AnnotatedBindingBuilder.class);
expect(abbMPE.toProvider(isA(MultiPartEmailProvider.class))).andReturn(null);
AnnotatedBindingBuilder<ImageHtmlEmail> abbIHE = unit
.mock(AnnotatedBindingBuilder.class);
expect(abbIHE.toProvider(isA(ImageHtmlEmailProvider.class))).andReturn(null);
Binder binder = unit.get(Binder.class);
expect(binder.bind(Key.get(SimpleEmail.class, Names.named("office")))).andReturn(abbSE);
expect(binder.bind(Key.get(HtmlEmail.class, Names.named("office")))).andReturn(abbHE);
expect(binder.bind(Key.get(MultiPartEmail.class, Names.named("office")))).andReturn(abbMPE);
expect(binder.bind(Key.get(ImageHtmlEmail.class, Names.named("office")))).andReturn(abbIHE);
})
.run(unit -> {
new CommonsEmail("office")
.configure(unit.get(Env.class), unit.get(Config.class), unit.get(Binder.class));
});
}
@Test
public void config() throws Exception {
assertEquals(ConfigFactory.parseResources(getClass(), "commons-email.conf"),
new CommonsEmail().config());
}
}