package org.jooby.internal.sitemap; import static org.easymock.EasyMock.eq; import static org.easymock.EasyMock.expect; import java.util.Collections; import java.util.List; import java.util.function.Predicate; import org.jooby.Env; import org.jooby.Router; import org.jooby.sitemap.Sitemap; import org.jooby.sitemap.WebPageProvider; import org.jooby.test.MockUnit; import org.jooby.test.MockUnit.Block; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import com.google.inject.Binder; import com.google.inject.Key; import com.google.inject.binder.LinkedBindingBuilder; import com.google.inject.name.Names; import com.typesafe.config.Config; import cz.jiripinkas.jsitemapgenerator.WebPage; import cz.jiripinkas.jsitemapgenerator.generator.SitemapGenerator; import javaslang.Function1; @RunWith(PowerMockRunner.class) @PrepareForTest({Sitemap.class, SitemapHandler.class, SitemapGenerator.class }) public class SitemapTest { private Block confWithSiteMapUrl = unit -> { Config config = unit.get(Config.class); expect(config.hasPath("sitemap.url")).andReturn(true); expect(config.getString("sitemap.url")).andReturn("http://foo.org"); }; @SuppressWarnings("unchecked") private Block defwpp = unit -> { LinkedBindingBuilder<WebPageProvider> lbb = unit.mock(LinkedBindingBuilder.class); lbb.toInstance(WebPageProvider.SITEMAP); Binder binder = unit.get(Binder.class); expect(binder.bind(Key.get(WebPageProvider.class, Names.named("/sitemap.xml")))).andReturn(lbb); }; private Block route = unit -> { Router routes = unit.mock(Router.class); expect(routes.get("/sitemap.xml", unit.get(SitemapHandler.class))).andReturn(null); Env env = unit.get(Env.class); expect(env.router()).andReturn(routes); }; private Block handler = unit -> { SitemapHandler handler = unit.constructor(SitemapHandler.class) .args(String.class, Predicate.class, Function1.class) .build(eq("/sitemap.xml"), unit.capture(Predicate.class), unit.capture(Function1.class)); unit.registerMock(SitemapHandler.class, handler); }; @Test public void configure() throws Exception { new MockUnit(Env.class, Config.class, Binder.class) .expect(defwpp) .expect(handler) .expect(route) .run(unit -> { new Sitemap("http://localhost") .configure(unit.get(Env.class), unit.get(Config.class), unit.get(Binder.class)); }); } @Test public void configureWithoutBaseUrl() throws Exception { new MockUnit(Env.class, Config.class, Binder.class) .expect(unit -> { Config config = unit.get(Config.class); expect(config.hasPath("sitemap.url")).andReturn(false); expect(config.getConfig("application")).andReturn(config); expect(config.getString("host")).andReturn("localhost"); expect(config.getString("port")).andReturn("8080"); expect(config.getString("path")).andReturn("/"); }) .expect(defwpp) .expect(handler) .expect(route) .run(unit -> { new Sitemap() .configure(unit.get(Env.class), unit.get(Config.class), unit.get(Binder.class)); }); } @SuppressWarnings("unchecked") @Test public void withWPPInstance() throws Exception { new MockUnit(Env.class, Config.class, Binder.class, WebPageProvider.class) .expect(confWithSiteMapUrl) .expect(unit -> { LinkedBindingBuilder<WebPageProvider> lbb = unit.mock(LinkedBindingBuilder.class); lbb.toInstance(unit.get(WebPageProvider.class)); Binder binder = unit.get(Binder.class); expect(binder.bind(Key.get(WebPageProvider.class, Names.named("/sitemap.xml")))) .andReturn(lbb); }) .expect(handler) .expect(route) .run(unit -> { new Sitemap() .with(unit.get(WebPageProvider.class)) .configure(unit.get(Env.class), unit.get(Config.class), unit.get(Binder.class)); }); } @SuppressWarnings("unchecked") @Test public void withWPPType() throws Exception { new MockUnit(Env.class, Config.class, Binder.class) .expect(confWithSiteMapUrl) .expect(unit -> { LinkedBindingBuilder<WebPageProvider> lbb = unit.mock(LinkedBindingBuilder.class); expect(lbb.to(WebPageProvider.class)).andReturn(null); Binder binder = unit.get(Binder.class); expect(binder.bind(Key.get(WebPageProvider.class, Names.named("/sitemap.xml")))) .andReturn(lbb); }) .expect(handler) .expect(route) .run(unit -> { new Sitemap() .with(WebPageProvider.class) .configure(unit.get(Env.class), unit.get(Config.class), unit.get(Binder.class)); }); } @SuppressWarnings({"rawtypes", "unchecked" }) @Test public void build() throws Exception { List<WebPage> pages = Collections.emptyList(); new MockUnit(Env.class, Config.class, Binder.class) .expect(confWithSiteMapUrl) .expect(defwpp) .expect(handler) .expect(route) .expect(unit -> { SitemapGenerator gen = unit.constructor(SitemapGenerator.class) .args(String.class) .build("http://foo.org"); gen.addPages(pages); expect(gen.constructSitemapString()).andReturn("<xml>"); }) .run(unit -> { new Sitemap() .configure(unit.get(Env.class), unit.get(Config.class), unit.get(Binder.class)); }, unit -> { Function1 fn = unit.captured(Function1.class).iterator().next(); fn.apply(pages); }); } }