package org.jooby.reactor; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.isA; import static org.junit.Assert.assertEquals; import java.util.function.Consumer; import org.jooby.Deferred; import org.jooby.Env; import org.jooby.Request; import org.jooby.Route; import org.jooby.Router; 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.typesafe.config.Config; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.core.scheduler.Scheduler; @RunWith(PowerMockRunner.class) @PrepareForTest({Reactor.class, Flux.class, Mono.class }) public class ReactorTest { private Block map = unit -> { Router routes = unit.get(Router.class); expect(routes.map(unit.capture(Route.Mapper.class))).andReturn(routes); Env env = unit.get(Env.class); expect(env.router()).andReturn(routes); }; @SuppressWarnings({"rawtypes", "unchecked" }) private Block flux = unit -> { Flux flux = unit.powerMock(Flux.class); expect(flux.consume(isA(Consumer.class), isA(Consumer.class))).andReturn(null); unit.registerMock(Flux.class, flux); }; @SuppressWarnings({"rawtypes", "unchecked" }) private Block mono = unit -> { Mono mono = unit.powerMock(Mono.class); expect(mono.consume(isA(Consumer.class), isA(Consumer.class))).andReturn(null); unit.registerMock(Mono.class, mono); }; @Test public void configure() throws Exception { new MockUnit(Env.class, Config.class, Binder.class, Router.class) .expect(map) .run(unit -> { new Reactor() .configure(unit.get(Env.class), unit.get(Config.class), unit.get(Binder.class)); }); } @SuppressWarnings({"unchecked", "rawtypes" }) @Test public void skipMapper() throws Exception { new MockUnit(Env.class, Config.class, Binder.class, Router.class) .expect(map) .run(unit -> { new Reactor() .configure(unit.get(Env.class), unit.get(Config.class), unit.get(Binder.class)); }, unit -> { Route.Mapper mapper = unit.captured(Route.Mapper.class).iterator().next(); Object value = new Object(); assertEquals(value, mapper.map(value)); }); } @SuppressWarnings({"unchecked", "rawtypes" }) @Test public void fluxMapper() throws Exception { new MockUnit(Env.class, Config.class, Binder.class, Router.class, Request.class) .expect(map) .expect(flux) .run(unit -> { new Reactor() .configure(unit.get(Env.class), unit.get(Config.class), unit.get(Binder.class)); }, unit -> { Route.Mapper mapper = unit.captured(Route.Mapper.class).iterator().next(); Deferred deferred = (Deferred) mapper.map(unit.get(Flux.class)); deferred.handler(unit.get(Request.class), (r, x) -> { }); }); } @SuppressWarnings({"unchecked", "rawtypes" }) @Test public void fluxMapperWithAdapter() throws Exception { new MockUnit(Env.class, Config.class, Binder.class, Router.class, Scheduler.class, Request.class) .expect(map) .expect(flux) .expect(unit -> { Flux flux = unit.get(Flux.class); expect(flux.publishOn(unit.get(Scheduler.class))).andReturn(flux); }) .run(unit -> { new Reactor() .withFlux(f -> f.publishOn(unit.get(Scheduler.class))) .configure(unit.get(Env.class), unit.get(Config.class), unit.get(Binder.class)); }, unit -> { Route.Mapper mapper = unit.captured(Route.Mapper.class).iterator().next(); Deferred deferred = (Deferred) mapper.map(unit.get(Flux.class)); deferred.handler(unit.get(Request.class), (r, x) -> { }); }); } @SuppressWarnings({"unchecked", "rawtypes" }) @Test public void mono() throws Exception { new MockUnit(Env.class, Config.class, Binder.class, Router.class, Request.class) .expect(map) .expect(mono) .run(unit -> { new Reactor() .configure(unit.get(Env.class), unit.get(Config.class), unit.get(Binder.class)); }, unit -> { Route.Mapper mapper = unit.captured(Route.Mapper.class).iterator().next(); Deferred deferred = (Deferred) mapper.map(unit.get(Mono.class)); deferred.handler(unit.get(Request.class), (r, x) -> { }); }); } @SuppressWarnings({"unchecked", "rawtypes" }) @Test public void monoMapperWithAdapter() throws Exception { new MockUnit(Env.class, Config.class, Binder.class, Router.class, Scheduler.class, Request.class) .expect(map) .expect(mono) .expect(unit -> { Mono mono = unit.get(Mono.class); expect(mono.publishOn(unit.get(Scheduler.class))).andReturn(mono); }) .run(unit -> { new Reactor() .withMono(f -> f.publishOn(unit.get(Scheduler.class))) .configure(unit.get(Env.class), unit.get(Config.class), unit.get(Binder.class)); }, unit -> { Route.Mapper mapper = unit.captured(Route.Mapper.class).iterator().next(); Deferred deferred = (Deferred) mapper.map(unit.get(Mono.class)); deferred.handler(unit.get(Request.class), (r, x) -> { }); }); } }