package org.mockserver.proxy.http; import io.netty.channel.embedded.EmbeddedChannel; import io.netty.handler.codec.http.HttpResponseStatus; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockserver.client.serialization.ExpectationSerializer; import org.mockserver.client.serialization.HttpRequestSerializer; import org.mockserver.client.serialization.VerificationSequenceSerializer; import org.mockserver.client.serialization.VerificationSerializer; import org.mockserver.filters.RequestLogFilter; import org.mockserver.filters.RequestResponseLogFilter; import org.mockserver.mock.Expectation; import org.mockserver.mock.action.ActionHandler; import org.mockserver.model.HttpRequest; import org.mockserver.model.HttpResponse; import org.mockserver.proxy.Proxy; import org.mockserver.verify.Verification; import org.mockserver.verify.VerificationSequence; import java.util.concurrent.TimeUnit; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.core.Is.is; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.*; import static org.mockito.MockitoAnnotations.initMocks; import static org.mockserver.model.HttpRequest.request; import static org.mockserver.model.Parameter.param; /** * @author jamesdbloom */ public class HttpProxyHandlerGeneralOperationsTest extends HttpProxyHandlerTest { @Test public void shouldResetExpectations() { // given HttpRequest request = request("/reset").withMethod("PUT"); // when embeddedChannel.writeInbound(request); // then - filter and matcher is reset verify(mockRequestLogFilter).reset(); // and - correct response written to ChannelHandlerContext HttpResponse httpResponse = (HttpResponse)embeddedChannel.readOutbound(); assertThat(httpResponse.getStatusCode(), is(HttpResponseStatus.ACCEPTED.code())); assertThat(httpResponse.getBodyAsString(), is("")); } @Test public void shouldClearExpectations() { // given HttpRequest request = request("/clear").withMethod("PUT").withBody("some_content"); // when embeddedChannel.writeInbound(request); // then - request deserialized verify(mockHttpRequestSerializer).deserialize("some_content"); // then - filter and matcher is cleared verify(mockRequestLogFilter).clear(mockHttpRequest); // and - correct response written to ChannelHandlerContext HttpResponse httpResponse = (HttpResponse)embeddedChannel.readOutbound(); assertThat(httpResponse.getStatusCode(), is(HttpResponseStatus.ACCEPTED.code())); assertThat(httpResponse.getBodyAsString(), is("")); } @Test public void shouldDumpExpectationsToLog() { // given HttpRequest request = request("/dumpToLog").withMethod("PUT").withBody("some_content"); // when embeddedChannel.writeInbound(request); // then - request deserialized verify(mockHttpRequestSerializer).deserialize("some_content"); // then - expectations dumped to log verify(mockRequestResponseLogFilter).dumpToLog(mockHttpRequest, false); // and - correct response written to ChannelHandlerContext HttpResponse httpResponse = (HttpResponse)embeddedChannel.readOutbound(); assertThat(httpResponse.getStatusCode(), is(HttpResponseStatus.ACCEPTED.code())); assertThat(httpResponse.getBodyAsString(), is("")); } @Test public void shouldDumpExpectationsToLogAsJava() { // given HttpRequest request = request("/dumpToLog").withQueryStringParameter(param("type", "java")).withMethod("PUT").withBody("some_content"); // when embeddedChannel.writeInbound(request); // then - request deserialized verify(mockHttpRequestSerializer).deserialize("some_content"); // then - expectations dumped to log verify(mockRequestResponseLogFilter).dumpToLog(mockHttpRequest, true); // and - correct response written to ChannelHandlerContext HttpResponse httpResponse = (HttpResponse)embeddedChannel.readOutbound(); assertThat(httpResponse.getStatusCode(), is(HttpResponseStatus.ACCEPTED.code())); assertThat(httpResponse.getBodyAsString(), is("")); } @Test public void shouldReturnRecordedRequests() { // given HttpRequest[] requests = {}; when(mockRequestLogFilter.retrieve(mockHttpRequest)).thenReturn(requests); when(mockHttpRequestSerializer.serialize(requests)).thenReturn("requests"); HttpRequest request = request("/retrieve").withMethod("PUT").withBody("some_content"); // when embeddedChannel.writeInbound(request); // then - request deserialized verify(mockHttpRequestSerializer).deserialize("some_content"); // then - matching requests should be retrieved verify(mockRequestLogFilter).retrieve(mockHttpRequest); // and - correct response written to ChannelHandlerContext HttpResponse httpResponse = (HttpResponse) embeddedChannel.readOutbound(); assertThat(httpResponse.getStatusCode(), is(HttpResponseStatus.OK.code())); assertThat(httpResponse.getBodyAsString(), is("requests")); } @Test public void shouldReturnBadRequestAfterException() { // given HttpRequest request = request("/randomPath").withMethod("GET").withBody("some_content"); when(mockRequestLogFilter.onRequest(request)).thenThrow(new RuntimeException("TEST EXCEPTION")); // when embeddedChannel.writeInbound(request); // and - correct response written to ChannelHandlerContext HttpResponse httpResponse = (HttpResponse)embeddedChannel.readOutbound(); assertThat(httpResponse.getStatusCode(), is(HttpResponseStatus.BAD_REQUEST.code())); assertThat(httpResponse.getBodyAsString(), is("")); } @Test public void shouldReturnNotFoundAfterNoMatch() { // given HttpRequest request = request("/randomPath").withMethod("GET").withBody("some_content"); when(mockRequestLogFilter.onRequest(request)).thenReturn(null); // when embeddedChannel.writeInbound(request); // and - correct response written to ChannelHandlerContext HttpResponse httpResponse = (HttpResponse)embeddedChannel.readOutbound(); assertThat(httpResponse.getStatusCode(), is(HttpResponseStatus.NOT_FOUND.code())); assertThat(httpResponse.getBodyAsString(), nullValue()); } @Test public void shouldVerifyPassingRequest() { // given when(mockRequestLogFilter.verify(any(Verification.class))).thenReturn(""); // and - a request HttpRequest request = request("/verify").withMethod("PUT").withBody("some_content"); // when embeddedChannel.writeInbound(request); // then - request deserialized verify(mockVerificationSerializer).deserialize("some_content"); // and - log filter called verify(mockRequestLogFilter).verify(mockVerification); // and - correct response written to ChannelHandlerContext HttpResponse httpResponse = (HttpResponse)embeddedChannel.readOutbound(); assertThat(httpResponse.getStatusCode(), is(HttpResponseStatus.ACCEPTED.code())); assertThat(httpResponse.getBodyAsString(), is("")); } @Test public void shouldVerifyFailingRequest() { // given when(mockRequestLogFilter.verify(any(Verification.class))).thenReturn("failure response"); // and - a request HttpRequest request = request("/verify").withMethod("PUT").withBody("some_content"); // when embeddedChannel.writeInbound(request); // then - request deserialized verify(mockVerificationSerializer).deserialize("some_content"); // and - log filter called verify(mockRequestLogFilter).verify(mockVerification); // and - correct response written to ChannelHandlerContext HttpResponse httpResponse = (HttpResponse)embeddedChannel.readOutbound(); assertThat(httpResponse.getStatusCode(), is(HttpResponseStatus.NOT_ACCEPTABLE.code())); assertThat(httpResponse.getBodyAsString(), is("failure response")); } @Test public void shouldVerifySequencePassingRequest() { // given when(mockRequestLogFilter.verify(any(VerificationSequence.class))).thenReturn(""); // and - a request HttpRequest request = request("/verifySequence").withMethod("PUT").withBody("some_content"); // when embeddedChannel.writeInbound(request); // then - request deserialized verify(mockVerificationSequenceSerializer).deserialize("some_content"); // and - log filter called verify(mockRequestLogFilter).verify(mockVerificationSequence); // and - correct response written to ChannelHandlerContext HttpResponse httpResponse = (HttpResponse)embeddedChannel.readOutbound(); assertThat(httpResponse.getStatusCode(), is(HttpResponseStatus.ACCEPTED.code())); assertThat(httpResponse.getBodyAsString(), is("")); } @Test public void shouldVerifySequenceFailingRequest() { // given when(mockRequestLogFilter.verify(any(VerificationSequence.class))).thenReturn("failure response"); // and - a request HttpRequest request = request("/verifySequence").withMethod("PUT").withBody("some_content"); // when embeddedChannel.writeInbound(request); // then - request deserialized verify(mockVerificationSequenceSerializer).deserialize("some_content"); // and - log filter called verify(mockRequestLogFilter).verify(mockVerificationSequence); // and - correct response written to ChannelHandlerContext HttpResponse httpResponse = (HttpResponse)embeddedChannel.readOutbound(); assertThat(httpResponse.getStatusCode(), is(HttpResponseStatus.NOT_ACCEPTABLE.code())); assertThat(httpResponse.getBodyAsString(), is("failure response")); } @Test public void shouldStopMockServer() throws InterruptedException { // given HttpRequest request = request("/stop").withMethod("PUT").withBody("some_content"); // when embeddedChannel.writeInbound(request); // ensure that stop thread has run TimeUnit.SECONDS.sleep(3); // then - mock server is stopped verify(mockHttpProxy).stop(); // and - correct response written to ChannelHandlerContext HttpResponse httpResponse = (HttpResponse)embeddedChannel.readOutbound(); assertThat(httpResponse.getStatusCode(), is(HttpResponseStatus.ACCEPTED.code())); } }