Skip to content

Commit

Permalink
Promote HttpSteps non-step methods into base class to allow extension…
Browse files Browse the repository at this point in the history
… (cucumber does not allow to extend classes defining steps).
  • Loading branch information
israelcolomer committed Oct 23, 2016
1 parent 7038256 commit 78b6031
Show file tree
Hide file tree
Showing 2 changed files with 95 additions and 69 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package foundation.stack.datamill.cucumber;

import com.google.common.collect.Multimap;
import foundation.stack.datamill.http.Method;
import foundation.stack.datamill.http.Response;
import foundation.stack.datamill.http.Status;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;

/**
* @author Israel Colomer (israelcolomer@gmail.com)
*/
public class AbstractHttpSteps {
final static String RESPONSE_KEY = "$$response";
final static String LAST_RESPONSE_BODY_KEY = "$$lastResponseBody";
final static String HEADER_KEY = "$$header";

protected final PropertyStore propertyStore;
protected final PlaceholderResolver placeholderResolver;
protected final HttpClient httpClient;

public AbstractHttpSteps(PropertyStore propertyStore, PlaceholderResolver placeholderResolver, HttpClient httpClient) {
this.propertyStore = propertyStore;
this.placeholderResolver = placeholderResolver;
this.httpClient = httpClient;
}

protected final void makeCall(Method method, String uri, String payload) {
final String resolvedUri = placeholderResolver.resolve(uri);
final String resolvedPayload = placeholderResolver.resolve(payload);

doAddValueToHeader("Origin", uri);

httpClient.request(method, resolvedUri, getHeaders(), resolvedPayload)
.doOnNext(response -> {
propertyStore.put(RESPONSE_KEY, response);
propertyStore.put(LAST_RESPONSE_BODY_KEY, getResponseBodyAsString(response));
}).toBlocking().lastOrDefault(null);
}

protected void doAddValueToHeader(String headerKey, String value) {
Map<String, String> headers = initAndGetHeaders();
headers.put(headerKey, placeholderResolver.resolve(value));
}

void compareHeaders(Map<String, String> expectedHeaders, Multimap<String, String> actualHeaders) {
for (Map.Entry<String, String> expectedHeadersEntries : expectedHeaders.entrySet()) {
String resolvedExpectedValue = placeholderResolver.resolve(expectedHeadersEntries.getValue());
Iterator<String> iterator = actualHeaders.get(expectedHeadersEntries.getKey()).iterator();
if (iterator.hasNext()) {
String actualValue = iterator.next();
assertThat(resolvedExpectedValue, equalTo(actualValue));
continue;
}
fail("Could not find corresponding header in response for " + expectedHeadersEntries.getKey());
}
}

public Status getLastResponseStatus() {
Response storedResponse = (Response) propertyStore.get(RESPONSE_KEY);
return storedResponse.status();
}

protected final Map<String, String> initAndGetHeaders() {
Map<String, String> headers = (Map<String, String>) propertyStore.get(HEADER_KEY);
if (headers == null) {
headers = new HashMap<>();
propertyStore.put(HEADER_KEY, headers);
}

return headers;
}

protected String getResponseBodyAsString(Response response) {
return response.body().map(body -> body.asString().toBlocking().lastOrDefault(null)).orElse(null);
}

protected final Map<String, String> getHeaders() {
return (Map<String, String>) propertyStore.get(HEADER_KEY);
}

protected final void clearHeaders() {
propertyStore.remove(HEADER_KEY);
}
}
Original file line number Diff line number Diff line change
@@ -1,22 +1,17 @@
package foundation.stack.datamill.cucumber;

import com.google.common.base.Strings;
import com.google.common.collect.Multimap;
import com.jayway.jsonpath.JsonPath;
import cucumber.api.java.en.And;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import foundation.stack.datamill.http.Method;
import foundation.stack.datamill.http.Response;
import foundation.stack.datamill.http.Status;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
Expand All @@ -26,21 +21,11 @@
/**
* @author Israel Colomer (israelcolomer@gmail.com)
*/
public class HttpSteps {
public class HttpSteps extends AbstractHttpSteps {
private final static Logger logger = LoggerFactory.getLogger(HttpSteps.class);

final static String RESPONSE_KEY = "$$response";
final static String LAST_RESPONSE_BODY_KEY = "$$lastResponseBody";
final static String HEADER_KEY = "$$header";

private final PropertyStore propertyStore;
private final PlaceholderResolver placeholderResolver;
private final HttpClient httpClient;

public HttpSteps(PropertyStore propertyStore, PlaceholderResolver placeholderResolver, HttpClient httpClient) {
this.propertyStore = propertyStore;
this.placeholderResolver = placeholderResolver;
this.httpClient = httpClient;
super(propertyStore, placeholderResolver, httpClient);
}

@Given("^" + Phrases.SUBJECT + " make" + Phrases.OPTIONAL_PLURAL + " a " + Phrases.HTTP_METHOD + " " +
Expand All @@ -61,19 +46,6 @@ public void userMakesCallWithProvidedMultiLinePayload(Method method, String uri,
userMakesCallWithProvidedPayload(method, uri, payload);
}

private void makeCall(Method method, String uri, String payload) {
final String resolvedUri = placeholderResolver.resolve(uri);
final String resolvedPayload = placeholderResolver.resolve(payload);

addValueToHeader("Origin", uri);

httpClient.request(method, resolvedUri, getHeaders(), resolvedPayload)
.doOnNext(response -> {
propertyStore.put(RESPONSE_KEY, response);
propertyStore.put(LAST_RESPONSE_BODY_KEY, getResponseBodyAsString(response));
}).toBlocking().lastOrDefault(null);
}

@Then("^" + Phrases.SUBJECT + " should get a (\\d+) response and JSON matching:$")
public void assertStatusAndJsonResponse(int statusCode, String expectedJson) {
assertStatus(statusCode);
Expand Down Expand Up @@ -136,19 +108,6 @@ public void assertResponseAndHeaders(int statusCode, Map<String, String> headers
compareHeaders(headers, storedResponse.headers());
}

void compareHeaders(Map<String, String> expectedHeaders, Multimap<String, String> actualHeaders) {
for (Map.Entry<String, String> expectedHeadersEntries : expectedHeaders.entrySet()) {
String resolvedExpectedValue = placeholderResolver.resolve(expectedHeadersEntries.getValue());
Iterator<String> iterator = actualHeaders.get(expectedHeadersEntries.getKey()).iterator();
if (iterator.hasNext()) {
String actualValue = iterator.next();
assertThat(resolvedExpectedValue, equalTo(actualValue));
continue;
}
fail("Could not find corresponding header in response for " + expectedHeadersEntries.getKey());
}
}

@And("^the response " + Phrases.HTTP_BODY + " is stored as (.+)$")
public void storeResponse(String key) {
String lastResponseBody = (String) propertyStore.get(LAST_RESPONSE_BODY_KEY);
Expand All @@ -164,36 +123,12 @@ public void storeJsonResponsePortion(String path, String key) {

@And("^a request header (.+) is added with value \"(.*)\"$")
public void addValueToHeader(String headerKey, String value) {
Map<String, String> headers = initAndGetHeaders();
headers.put(headerKey, placeholderResolver.resolve(value));
doAddValueToHeader(headerKey, value);
}

@And("^the request header (.+) is removed$")
public void removeHeader(String header) {
Map<String, String> headers = initAndGetHeaders();
headers.remove(header);
}

public Status getLastResponseStatus() {
Response storedResponse = (Response) propertyStore.get(RESPONSE_KEY);
return storedResponse.status();
}

private Map<String, String> initAndGetHeaders() {
Map<String, String> headers = (Map<String, String>) propertyStore.get(HEADER_KEY);
if (headers == null) {
headers = new HashMap<>();
propertyStore.put(HEADER_KEY, headers);
}

return headers;
}

private String getResponseBodyAsString(Response response) {
return response.body().map(body -> body.asString().toBlocking().lastOrDefault(null)).orElse(null);
}

private Map<String, String> getHeaders() {
return (Map<String, String>) propertyStore.get(HEADER_KEY);
}
}

0 comments on commit 78b6031

Please sign in to comment.