package com.freedomotic.helpers;
import org.apache.http.HttpStatus;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.mockserver.client.server.MockServerClient;
import org.mockserver.junit.MockServerRule;
import org.mockserver.model.Header;
import java.nio.charset.Charset;
import java.util.List;
import static org.apache.commons.codec.binary.Base64.encodeBase64String;
import static org.apache.http.HttpStatus.SC_OK;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.mockserver.model.HttpRequest.request;
import static org.mockserver.model.HttpResponse.response;
public class HttpHelperTest {
private static final String A_USERNAME = "user";
private static final String A_PASSWORD = "password";
private static final String A_PATH = "/everything";
private static final String OK_RESPONSE = "OK";
public static final int RANDOM_PORT = 0;
private HttpHelper httpHelper;
@Rule
public MockServerRule mockServerRule = new MockServerRule(RANDOM_PORT);
private MockServerClient mockServerClient;
private String baseUrl;
@Before
public void setUp() throws Exception {
Integer port = mockServerRule.getPort();
mockServerClient = new MockServerClient("localhost", mockServerRule.getPort());
httpHelper = new HttpHelper();
baseUrl = "http://localhost:" + port + A_PATH;
}
@Test
public void usernameAndPasswordAreSendWithRequest() throws Exception {
respondWhenBasicAuthIsGiven(SC_OK, OK_RESPONSE);
respond401WhenNoBasicAuthenticationIsGiven();
String content = httpHelper.retrieveContent(baseUrl, A_USERNAME, A_PASSWORD);
assertEquals(OK_RESPONSE, content);
}
@Test
public void xmlResponseCanBeParsed() throws Exception {
String xmlResponse = "<xml>" +
"<test>" +
OK_RESPONSE +
"</test>" +
"</xml>";
respond(SC_OK, xmlResponse);
String xPath = "//test/child::text()";
List<String> xmls = httpHelper.queryXml(baseUrl, A_USERNAME, A_PASSWORD, xPath);
assertEquals(1, xmls.size());
assertEquals(OK_RESPONSE, xmls.get(0));
}
@Test
public void xmlShouldBePosted() throws Exception {
// Given
final String requestBody = "<xml><test>data</test></xml>";
final String responseBody = String.format("<xml><test>%s</test></xml>", OK_RESPONSE);
final byte[] request = requestBody.getBytes("UTF-8");
mockServerClient.when(request().withBody(requestBody))
.respond(response().withBody(responseBody).withStatusCode(200));
// When
byte[] response = httpHelper.post(baseUrl, request, A_USERNAME, A_PASSWORD);
// Then
assertThat(responseBody, equalTo(new String(response, "UTF-8")));
}
private void respondWhenBasicAuthIsGiven(int responseStatusCode, String response) {
mockServerClient.when(
request()
.withMethod("GET")
.withHeader(new Header("Authorization", "Basic " + asBasicAuthString()))
.withPath(A_PATH)
)
.respond(
response()
.withStatusCode(responseStatusCode)
.withBody(response)
);
}
private void respond401WhenNoBasicAuthenticationIsGiven() {
mockServerClient.when(
request()
.withMethod("GET")
.withPath(A_PATH)
)
.respond(
response()
.withStatusCode(HttpStatus.SC_UNAUTHORIZED)
.withHeader(new Header("WWW-Authenticate", "Basic realm=\"Realm\""))
);
}
private void respond(int responseStatusCode, String response) {
mockServerClient.when(
request()
.withMethod("GET")
.withPath(A_PATH)
)
.respond(
response()
.withStatusCode(responseStatusCode)
.withBody(response)
);
}
private static String asBasicAuthString() {
return encodeBase64String((A_USERNAME + ":" + A_PASSWORD).getBytes(Charset.forName("ASCII")));
}
}