/**
* Copyright © 2010-2011 Nokia
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.github.restdriver.clientdriver.jetty;
import static org.hamcrest.core.StringContains.*;
import static org.junit.Assert.*;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
import org.eclipse.jetty.server.Request;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InOrder;
import com.github.restdriver.clientdriver.ClientDriverRequest;
import com.github.restdriver.clientdriver.ClientDriverRequest.Method;
import com.github.restdriver.clientdriver.ClientDriverResponse;
import com.github.restdriver.clientdriver.RealRequest;
import com.github.restdriver.clientdriver.RequestMatcher;
import com.github.restdriver.clientdriver.exception.ClientDriverFailedExpectationException;
import com.github.restdriver.clientdriver.unit.DummyServletInputStream;
public class DefaultClientDriverJettyHandlerTest {
private RequestMatcher mockRequestMatcher;
private Request mockRequest;
private HttpServletRequest mockHttpRequest;
private HttpServletResponse mockHttpResponse;
private ServletOutputStream mockServletOutputStream;
private ClientDriverRequest realRequest;
private ClientDriverResponse realResponse;
@Before
public void before() throws IOException {
mockRequestMatcher = mock(RequestMatcher.class);
mockRequest = mock(Request.class);
mockHttpRequest = mock(Request.class);
mockHttpResponse = mock(HttpServletResponse.class);
mockServletOutputStream = mock(ServletOutputStream.class);
ServletInputStream servletInputStream = new DummyServletInputStream(IOUtils.toInputStream(""));
realRequest = new ClientDriverRequest("/").withMethod(Method.GET);
realResponse = new ClientDriverResponse("entity payload", "text/plain").withStatus(200).withHeader("Test", "header-should-be-set-before-writing-body");
when(mockHttpRequest.getInputStream()).thenReturn(servletInputStream);
when(mockHttpRequest.getMethod()).thenReturn("GET");
when(mockHttpRequest.getReader()).thenReturn(new BufferedReader(new StringReader("")));
when(mockRequestMatcher.isMatch((RealRequest) anyObject(), (ClientDriverRequest) anyObject())).thenReturn(true);
when(mockHttpResponse.getOutputStream()).thenReturn(mockServletOutputStream);
}
@Test
public void unexpected_request_error_should_include_expectations() throws IOException, ServletException {
RequestMatcher requestMatcher = mock(RequestMatcher.class);
when(requestMatcher.isMatch((RealRequest) anyObject(), (ClientDriverRequest) anyObject())).thenReturn(false);
DefaultClientDriverJettyHandler sut = new DefaultClientDriverJettyHandler(requestMatcher);
sut.addExpectation(new ClientDriverRequest("/not_matched").withMethod(Method.POST), realResponse);
try {
sut.handle("", mockRequest, mockHttpRequest, mockHttpResponse);
fail("ClientDriverFailedExpectationException should have been thrown");
} catch (ClientDriverFailedExpectationException e) {
assertThat(e.getMessage(), containsString("GET"));
assertThat(e.getMessage(), containsString("POST"));
assertThat(e.getMessage(), containsString("not_matched"));
}
}
@Test
public void unexpected_request_should_not_fail_fast_if_excluded() throws IOException, ServletException {
RequestMatcher requestMatcher = mock(RequestMatcher.class);
when(requestMatcher.isMatch((RealRequest) anyObject(), (ClientDriverRequest) anyObject())).thenReturn(false);
DefaultClientDriverJettyHandler sut = new DefaultClientDriverJettyHandler(requestMatcher);
sut.addExpectation(new ClientDriverRequest("/not_matched").withMethod(Method.POST), realResponse);
sut.noFailFastOnUnexpectedRequest();
sut.handle("", mockRequest, mockHttpRequest, mockHttpResponse);
try {
sut.checkForUnexpectedRequests();
fail("ClientDriverFailedExpectationException should have been thrown");
} catch (ClientDriverFailedExpectationException e) {
// Should happen
}
verify(mockHttpResponse).setStatus(404);
}
@Test
public void when_responseContainsBothBodyAndHeaders_headers_shouldBeSetBeforeBody_otherwise_theyWontBeSentAtAll() throws IOException, ServletException {
DefaultClientDriverJettyHandler sut = new DefaultClientDriverJettyHandler(mockRequestMatcher);
sut.addExpectation(realRequest, realResponse);
sut.handle("", mockRequest, mockHttpRequest, mockHttpResponse);
verify(mockHttpResponse).setStatus(200);
InOrder inOrder = inOrder(mockHttpResponse, mockServletOutputStream);
inOrder.verify(mockHttpResponse).setContentType("text/plain");
inOrder.verify(mockHttpResponse).setHeader("Test", "header-should-be-set-before-writing-body");
inOrder.verify(mockServletOutputStream).write("entity payload".getBytes("UTF-8"));
}
@Test
public void reset_should_make_ready_for_new_run() throws IOException, ServletException {
DefaultClientDriverJettyHandler sut = new DefaultClientDriverJettyHandler(mockRequestMatcher);
sut.addExpectation(realRequest, realResponse);
sut.reset();
try {
sut.handle("", mockRequest, mockHttpRequest, mockHttpResponse);
fail("Should throw exception as expectations are reset");
} catch (ClientDriverFailedExpectationException e) {
// Should happen
}
sut.addExpectation(realRequest, realResponse);
sut.handle("", mockRequest, mockHttpRequest, mockHttpResponse);
verify(mockHttpResponse).setStatus(200);
}
}