package io.sphere.sdk.play.metrics;
import io.sphere.sdk.http.HttpClient;
import io.sphere.sdk.http.HttpMethod;
import io.sphere.sdk.http.HttpRequest;
import io.sphere.sdk.http.HttpResponse;
import org.junit.Test;
import play.mvc.Http;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
import java.util.function.Consumer;
import static io.sphere.sdk.play.metrics.MetricAction.KEY;
import static java.util.Collections.emptyMap;
import static org.assertj.core.api.Assertions.assertThat;
public class MetricHttpClientTest {
private static final HttpRequest SOME_REQUEST = HttpRequest.of(HttpMethod.GET, "somewhere");
private static final HttpResponse SOME_RESPONSE = HttpResponse.of(200);
@Test
public void executesRequestWithNoContext() throws Exception {
executeWithoutContext(SOME_REQUEST, response -> assertThat(response).isEqualTo(SOME_RESPONSE));
}
@Test
public void executesRequestWithContext() throws Exception {
executeWithContext(SOME_REQUEST, response -> assertThat(response).isEqualTo(SOME_RESPONSE));
}
@Test
public void reportsMetricsWithContext() throws Exception {
executeWithContext(SOME_REQUEST, response -> {
final ReportRawData report = reportFromContext().get(0);
assertThat(report.getHttpRequest()).isEqualTo(SOME_REQUEST);
assertThat(report.getHttpResponse()).isEqualTo(SOME_RESPONSE);
assertThat(report.getStartTimestamp()).isLessThanOrEqualTo(report.getStopTimestamp());
});
}
private void executeWithContext(final HttpRequest request, Consumer<HttpResponse> test) {
Http.Context.current.set(emptyContext());
executeWithoutContext(request, test);
}
private void executeWithoutContext(final HttpRequest request, Consumer<HttpResponse> test) {
final MetricHttpClient metricHttpClient = MetricHttpClient.of(httpClient());
final HttpResponse response = metricHttpClient.execute(request).toCompletableFuture().join();
test.accept(response);
}
@SuppressWarnings("unchecked")
private List<ReportRawData> reportFromContext() {
return (List<ReportRawData>) Http.Context.current.get().args.get(KEY);
}
private Http.Context emptyContext() {
final Http.Context context = new Http.Context(null, null, null, emptyMap(), emptyMap(), emptyMap());
context.args.put(KEY, new LinkedList<>());
return context;
}
private HttpClient httpClient() {
return new HttpClient() {
@Override
public CompletionStage<HttpResponse> execute(final HttpRequest httpRequest) {
return CompletableFuture.completedFuture(SOME_RESPONSE);
}
@Override
public void close() {
}
};
}
}