package com.github.dreamhead.moco; import com.github.dreamhead.moco.internal.SessionContext; import com.github.dreamhead.moco.util.Idles; import com.google.common.collect.ImmutableMultimap; import org.junit.Test; import org.mockito.Mockito; import java.util.concurrent.TimeUnit; import static com.github.dreamhead.moco.Moco.and; import static com.github.dreamhead.moco.Moco.async; import static com.github.dreamhead.moco.Moco.by; import static com.github.dreamhead.moco.Moco.complete; import static com.github.dreamhead.moco.Moco.context; import static com.github.dreamhead.moco.Moco.file; import static com.github.dreamhead.moco.Moco.fileRoot; import static com.github.dreamhead.moco.Moco.get; import static com.github.dreamhead.moco.Moco.httpServer; import static com.github.dreamhead.moco.Moco.latency; import static com.github.dreamhead.moco.Moco.pathResource; import static com.github.dreamhead.moco.Moco.post; import static com.github.dreamhead.moco.Moco.template; import static com.github.dreamhead.moco.Moco.text; import static com.github.dreamhead.moco.Moco.uri; import static com.github.dreamhead.moco.Runner.running; import static com.github.dreamhead.moco.helper.RemoteTestUtils.port; import static com.github.dreamhead.moco.helper.RemoteTestUtils.remoteUrl; import static com.github.dreamhead.moco.helper.RemoteTestUtils.root; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class MocoEventTest extends AbstractMocoHttpTest { @Test public void should_fire_event_on_complete() throws Exception { MocoEventAction action = mock(MocoEventAction.class); server.response("foo").on(complete(action)); running(server, new Runnable() { @Override public void run() throws Exception { assertThat(helper.get(root()), is("foo")); } }); verify(action).execute(any(Request.class)); } @Test public void should_not_fire_event_on_specific_request() throws Exception { MocoEventAction action = mock(MocoEventAction.class); server.request(by(uri("/event"))).response("event").on(complete(action)); running(server, new Runnable() { @Override public void run() throws Exception { assertThat(helper.get(remoteUrl("/event")), is("event")); } }); verify(action).execute(any(Request.class)); } @Test public void should_not_fire_event_on_other_request() throws Exception { MocoEventAction action = mock(MocoEventAction.class); server.request(by(uri("/noevent"))).response("noevent"); server.request(by(uri("/event"))).response("foo").on(complete(action)); running(server, new Runnable() { @Override public void run() throws Exception { assertThat(helper.get(remoteUrl("/noevent")), is("noevent")); } }); verify(action, Mockito.never()).execute(any(Request.class)); } @Test public void should_send_get_request_to_target_on_complete() throws Exception { ResponseHandler handler = mock(ResponseHandler.class); server.request(by(uri("/target"))).response(handler); server.request(by(uri("/event"))).response("event").on(complete(get(remoteUrl("/target")))); running(server, new Runnable() { @Override public void run() throws Exception { assertThat(helper.get(remoteUrl("/event")), is("event")); } }); verify(handler).writeToResponse(any(SessionContext.class)); } @Test public void should_send_get_request_to_target_on_complete_with_resource() throws Exception { ResponseHandler handler = mock(ResponseHandler.class); server.request(by(uri("/target"))).response(handler); server.request(by(uri("/event"))).response("event").on(complete(get(text(remoteUrl("/target"))))); running(server, new Runnable() { @Override public void run() throws Exception { assertThat(helper.get(remoteUrl("/event")), is("event")); } }); verify(handler).writeToResponse(any(SessionContext.class)); } @Test public void should_send_get_request_to_target_on_complete_with_template_fetching_var_from_request() throws Exception { ResponseHandler handler = mock(ResponseHandler.class); server.request(by(uri("/target"))).response(handler); server.request(by(uri("/event"))).response("event").on(complete(get(template("${base}/${req.headers['foo']}", "base", root())))); running(server, new Runnable() { @Override public void run() throws Exception { assertThat(helper.getWithHeader(remoteUrl("/event"), ImmutableMultimap.of("foo", "target")), is("event")); } }); verify(handler).writeToResponse(any(SessionContext.class)); } @Test public void should_send_get_request_to_target_on_complete_with_path_resource() throws Exception { ResponseHandler handler = mock(ResponseHandler.class); server.request(by(uri("/target"))).response(handler); server.request(by(uri("/event"))).response("event").on(complete(get(pathResource("template.url")))); running(server, new Runnable() { @Override public void run() throws Exception { assertThat(helper.get(remoteUrl("/event")), is("event")); } }); verify(handler).writeToResponse(any(SessionContext.class)); } @Test public void should_send_get_request_to_target_on_complete_with_template() throws Exception { ResponseHandler handler = mock(ResponseHandler.class); server.request(by(uri("/target"))).response(handler); server.request(by(uri("/event"))).response("event").on(complete(get(template("${var}", "var", remoteUrl("/target"))))); running(server, new Runnable() { @Override public void run() throws Exception { assertThat(helper.get(remoteUrl("/event")), is("event")); } }); verify(handler).writeToResponse(any(SessionContext.class)); } @Test public void should_send_post_request_to_target_on_complete_with_string() throws Exception { ResponseHandler handler = mock(ResponseHandler.class); server.request(and(by(uri("/target")), by("content"))).response(handler); server.request(by(uri("/event"))).response("event").on(complete(post(remoteUrl("/target"), "content"))); running(server, new Runnable() { @Override public void run() throws Exception { assertThat(helper.get(remoteUrl("/event")), is("event")); } }); verify(handler).writeToResponse(any(SessionContext.class)); } @Test public void should_send_post_request_to_target_on_complete_with_string_and_resource_url() throws Exception { ResponseHandler handler = mock(ResponseHandler.class); server.request(and(by(uri("/target")), by("content"))).response(handler); server.request(by(uri("/event"))).response("event").on(complete(post(text(remoteUrl("/target")), "content"))); running(server, new Runnable() { @Override public void run() throws Exception { assertThat(helper.get(remoteUrl("/event")), is("event")); } }); verify(handler).writeToResponse(any(SessionContext.class)); } @Test public void should_send_post_request_to_target_on_complete_with_path_resource_url() throws Exception { ResponseHandler handler = mock(ResponseHandler.class); server.request(by(uri("/target"))).response(handler); server.request(by(uri("/event"))).response("event").on(complete(post(pathResource("template.url"), "content"))); running(server, new Runnable() { @Override public void run() throws Exception { assertThat(helper.get(remoteUrl("/event")), is("event")); } }); verify(handler).writeToResponse(any(SessionContext.class)); } @Test public void should_send_post_request_to_target_on_complete_with_path_resource_content() throws Exception { ResponseHandler handler = mock(ResponseHandler.class); server.request(by(uri("/target"))).response(handler); server.request(by(uri("/event"))).response("event").on(complete(post(remoteUrl("/target"), pathResource("foo.request")))); running(server, new Runnable() { @Override public void run() throws Exception { assertThat(helper.get(remoteUrl("/event")), is("event")); } }); verify(handler).writeToResponse(any(SessionContext.class)); } @Test public void should_send_post_request_to_target_on_complete() throws Exception { ResponseHandler handler = mock(ResponseHandler.class); server.request(and(by(uri("/target")), by("content"))).response(handler); server.request(by(uri("/event"))).response("event").on(complete(post(remoteUrl("/target"), text("content")))); running(server, new Runnable() { @Override public void run() throws Exception { assertThat(helper.get(remoteUrl("/event")), is("event")); } }); verify(handler).writeToResponse(any(SessionContext.class)); } @Test public void should_send_post_request_to_target_on_complete_with_template_content() throws Exception { ResponseHandler handler = mock(ResponseHandler.class); server.request(and(by(uri("/target")), by("content"))).response(handler); server.request(by(uri("/event"))).response("event").on(complete(post(remoteUrl("/target"), template("${req.headers['foo']}")))); running(server, new Runnable() { @Override public void run() throws Exception { assertThat(helper.getWithHeader(remoteUrl("/event"), ImmutableMultimap.of("foo", "content")), is("event")); } }); verify(handler).writeToResponse(any(SessionContext.class)); } @Test public void should_send_post_request_to_target_on_complete_with_resource_url() throws Exception { ResponseHandler handler = mock(ResponseHandler.class); server.request(and(by(uri("/target")), by("content"))).response(handler); server.request(by(uri("/event"))).response("event").on(complete(post(text(remoteUrl("/target")), text("content")))); running(server, new Runnable() { @Override public void run() throws Exception { assertThat(helper.get(remoteUrl("/event")), is("event")); } }); verify(handler).writeToResponse(any(SessionContext.class)); } @Test public void should_send_post_request_to_target_on_complete_asyc() throws Exception { final ResponseHandler handler = mock(ResponseHandler.class); server.request(and(by(uri("/target")), by("content"))).response(handler); server.request(by(uri("/event"))).response("event").on(complete(async(post(remoteUrl("/target"), text("content"))))); running(server, new Runnable() { @Override public void run() throws Exception { assertThat(helper.get(remoteUrl("/event")), is("event")); verify(handler, never()).writeToResponse(any(SessionContext.class)); Idles.idle(2, TimeUnit.SECONDS); } }); verify(handler).writeToResponse(any(SessionContext.class)); } @Test public void should_send_post_request_to_target_on_complete_async_after_awhile() throws Exception { final ResponseHandler handler = mock(ResponseHandler.class); server.request(and(by(uri("/target")), by("content"))).response(handler); server.request(by(uri("/event"))).response("event").on(complete(async(post(remoteUrl("/target"), text("content")), latency(1, TimeUnit.SECONDS)))); running(server, new Runnable() { @Override public void run() throws Exception { assertThat(helper.get(remoteUrl("/event")), is("event")); verify(handler, never()).writeToResponse(any(SessionContext.class)); Idles.idle(2, TimeUnit.SECONDS); } }); verify(handler).writeToResponse(any(SessionContext.class)); } @Test public void should_fire_event_for_context_configuration() throws Exception { MocoEventAction action = mock(MocoEventAction.class); when(action.apply(any(MocoConfig.class))).thenReturn(action); server = httpServer(port(), context("/context")); server.get(by(uri("/foo"))).response("foo").on(complete(action)); running(server, new Runnable() { @Override public void run() throws Exception { assertThat(helper.get(remoteUrl("/context/foo")), is("foo")); } }); verify(action).execute(any(Request.class)); } @Test public void should_send_post_request_with_file_root_configuration() throws Exception { ResponseHandler handler = mock(ResponseHandler.class); when(handler.apply(any(MocoConfig.class))).thenReturn(handler); server = httpServer(port(), fileRoot("src/test/resources")); server.request(by(uri("/target")), by(file("foo.request"))).response(handler); server.request(by(uri("/event"))).response("event").on(complete(post(remoteUrl("/target"), file("foo.request")))); running(server, new Runnable() { @Override public void run() throws Exception { assertThat(helper.get(remoteUrl("/event")), is("event")); } }); verify(handler).writeToResponse(any(SessionContext.class)); } }