diff --git a/allure-attachments/src/main/java/io/qameta/allure/attachment/http/HttpRequestAttachment.java b/allure-attachments/src/main/java/io/qameta/allure/attachment/http/HttpRequestAttachment.java index 831b2a5da..5d8d0a093 100644 --- a/allure-attachments/src/main/java/io/qameta/allure/attachment/http/HttpRequestAttachment.java +++ b/allure-attachments/src/main/java/io/qameta/allure/attachment/http/HttpRequestAttachment.java @@ -17,6 +17,8 @@ import io.qameta.allure.attachment.AttachmentData; +import java.time.ZoneId; +import java.time.ZonedDateTime; import java.util.HashMap; import java.util.Map; import java.util.Objects; @@ -36,18 +38,23 @@ public class HttpRequestAttachment implements AttachmentData { private final String curl; + private final ZonedDateTime requestTime; + private final Map headers; private final Map cookies; + @SuppressWarnings("checkstyle:ParameterNumber") public HttpRequestAttachment(final String name, final String url, final String method, - final String body, final String curl, final Map headers, + final String body, final String curl, final ZonedDateTime requestTime, + final Map headers, final Map cookies) { this.name = name; this.url = url; this.method = method; this.body = body; this.curl = curl; + this.requestTime = requestTime; this.headers = headers; this.cookies = cookies; } @@ -76,6 +83,10 @@ public String getCurl() { return curl; } + public ZonedDateTime getRequestTime() { + return requestTime; + } + @Override public String getName() { return name; @@ -95,6 +106,8 @@ public static final class Builder { private String body; + private ZonedDateTime requestTime; + private final Map headers = new HashMap<>(); private final Map cookies = new HashMap<>(); @@ -110,6 +123,11 @@ public static Builder create(final String attachmentName, final String url) { return new Builder(attachmentName, url); } + public Builder setRequestTime() { + this.requestTime = ZonedDateTime.now(ZoneId.systemDefault()); + return this; + } + public Builder setMethod(final String method) { Objects.requireNonNull(method, "Method must not be null value"); this.method = method; @@ -150,6 +168,7 @@ public Builder setBody(final String body) { /** * Use setter method instead. + * * @deprecated scheduled for removal in 3.0 release */ @Deprecated @@ -159,6 +178,7 @@ public Builder withMethod(final String method) { /** * Use setter method instead. + * * @deprecated scheduled for removal in 3.0 release */ @Deprecated @@ -168,6 +188,7 @@ public Builder withHeader(final String name, final String value) { /** * Use setter method instead. + * * @deprecated scheduled for removal in 3.0 release */ @Deprecated @@ -177,6 +198,7 @@ public Builder withHeaders(final Map headers) { /** * Use setter method instead. + * * @deprecated scheduled for removal in 3.0 release */ @Deprecated @@ -186,6 +208,7 @@ public Builder withCookie(final String name, final String value) { /** * Use setter method instead. + * * @deprecated scheduled for removal in 3.0 release */ @Deprecated @@ -195,6 +218,7 @@ public Builder withCookies(final Map cookies) { /** * Use setter method instead. + * * @deprecated scheduled for removal in 3.0 release */ @Deprecated @@ -203,7 +227,7 @@ public Builder withBody(final String body) { } public HttpRequestAttachment build() { - return new HttpRequestAttachment(name, url, method, body, getCurl(), headers, cookies); + return new HttpRequestAttachment(name, url, method, body, getCurl(), requestTime, headers, cookies); } private String getCurl() { diff --git a/allure-attachments/src/main/java/io/qameta/allure/attachment/http/HttpResponseAttachment.java b/allure-attachments/src/main/java/io/qameta/allure/attachment/http/HttpResponseAttachment.java index d73b21701..ff5c64f00 100644 --- a/allure-attachments/src/main/java/io/qameta/allure/attachment/http/HttpResponseAttachment.java +++ b/allure-attachments/src/main/java/io/qameta/allure/attachment/http/HttpResponseAttachment.java @@ -17,6 +17,8 @@ import io.qameta.allure.attachment.AttachmentData; +import java.time.ZoneId; +import java.time.ZonedDateTime; import java.util.HashMap; import java.util.Map; import java.util.Objects; @@ -34,17 +36,20 @@ public class HttpResponseAttachment implements AttachmentData { private final int responseCode; + private final ZonedDateTime responseTime; + private final Map headers; private final Map cookies; public HttpResponseAttachment(final String name, final String url, - final String body, final int responseCode, + final String body, final int responseCode, final ZonedDateTime responseTime, final Map headers, final Map cookies) { this.name = name; this.url = url; this.body = body; this.responseCode = responseCode; + this.responseTime = responseTime; this.headers = headers; this.cookies = cookies; } @@ -66,6 +71,10 @@ public int getResponseCode() { return responseCode; } + public ZonedDateTime getResponseTime() { + return responseTime; + } + public Map getHeaders() { return headers; } @@ -86,6 +95,8 @@ public static final class Builder { private int responseCode; + private ZonedDateTime responseTime; + private String body; private final Map headers = new HashMap<>(); @@ -101,6 +112,11 @@ public static Builder create(final String attachmentName) { return new Builder(attachmentName); } + public Builder setResponseTime() { + this.responseTime = ZonedDateTime.now(ZoneId.systemDefault()); + return this; + } + public Builder setUrl(final String url) { Objects.requireNonNull(url, "Url must not be null value"); this.url = url; @@ -209,7 +225,7 @@ public Builder withBody(final String body) { } public HttpResponseAttachment build() { - return new HttpResponseAttachment(name, url, body, responseCode, headers, cookies); + return new HttpResponseAttachment(name, url, body, responseCode, responseTime, headers, cookies); } } } diff --git a/allure-attachments/src/main/resources/tpl/http-request.ftl b/allure-attachments/src/main/resources/tpl/http-request.ftl index 5ef76b521..d577a8c7b 100644 --- a/allure-attachments/src/main/resources/tpl/http-request.ftl +++ b/allure-attachments/src/main/resources/tpl/http-request.ftl @@ -2,6 +2,13 @@ <#-- @ftlvariable name="data" type="io.qameta.allure.attachment.http.HttpRequestAttachment" -->
<#if data.method??>${data.method}<#else>GET to <#if data.url??>${data.url}<#else>Unknown
+<#if data.requestTime??> +

Request time

+
+ ${data.requestTime} +
+ + <#if data.body??>

Body

diff --git a/allure-attachments/src/main/resources/tpl/http-response.ftl b/allure-attachments/src/main/resources/tpl/http-response.ftl index 2bc55de9f..f7c8329f9 100644 --- a/allure-attachments/src/main/resources/tpl/http-response.ftl +++ b/allure-attachments/src/main/resources/tpl/http-response.ftl @@ -3,6 +3,13 @@
Status code <#if data.responseCode??>${data.responseCode} <#else>Unknown
<#if data.url??>
${data.url}
+<#if data.responseTime??> +

Response time

+
+ ${data.responseTime} +
+ + <#if data.body??>

Body

diff --git a/allure-attachments/src/test/java/io/qameta/allure/attachment/FreemarkerAttachmentRendererTest.java b/allure-attachments/src/test/java/io/qameta/allure/attachment/FreemarkerAttachmentRendererTest.java index 75ddac32d..a39fe09ea 100644 --- a/allure-attachments/src/test/java/io/qameta/allure/attachment/FreemarkerAttachmentRendererTest.java +++ b/allure-attachments/src/test/java/io/qameta/allure/attachment/FreemarkerAttachmentRendererTest.java @@ -16,10 +16,12 @@ package io.qameta.allure.attachment; import io.qameta.allure.attachment.http.HttpRequestAttachment; +import io.qameta.allure.attachment.http.HttpResponseAttachment; import io.qameta.allure.test.AllureFeatures; import org.junit.jupiter.api.Test; import static io.qameta.allure.attachment.testdata.TestData.randomHttpRequestAttachment; +import static io.qameta.allure.attachment.testdata.TestData.randomHttpResponseAttachment; import static org.assertj.core.api.Assertions.assertThat; /** @@ -40,6 +42,26 @@ void shouldRenderRequestAttachment() { .hasFieldOrProperty("content"); } + @AllureFeatures.Attachments + @Test + void shouldRenderRequestTimeAttachment() { + final HttpRequestAttachment data = randomHttpRequestAttachment(); + final DefaultAttachmentContent content = new FreemarkerAttachmentRenderer("http-request.ftl") + .render(data); + + assertThat(content.getContent()).contains("Request time"); + } + + @AllureFeatures.Attachments + @Test + void shouldRenderResponseTimeAttachment() { + final HttpResponseAttachment data = randomHttpResponseAttachment(); + final DefaultAttachmentContent content = new FreemarkerAttachmentRenderer("http-response.ftl") + .render(data); + + assertThat(content.getContent()).contains("Response time"); + } + @AllureFeatures.Attachments @Test void shouldRenderResponseAttachment() { diff --git a/allure-attachments/src/test/java/io/qameta/allure/attachment/testdata/TestData.java b/allure-attachments/src/test/java/io/qameta/allure/attachment/testdata/TestData.java index 26eba1c6f..e2c880ef7 100644 --- a/allure-attachments/src/test/java/io/qameta/allure/attachment/testdata/TestData.java +++ b/allure-attachments/src/test/java/io/qameta/allure/attachment/testdata/TestData.java @@ -21,6 +21,8 @@ import io.qameta.allure.attachment.http.HttpResponseAttachment; import org.apache.commons.lang3.RandomStringUtils; +import java.time.ZoneId; +import java.time.ZonedDateTime; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ThreadLocalRandom; @@ -45,6 +47,7 @@ public static HttpRequestAttachment randomHttpRequestAttachment() { randomString(), randomString(), randomString(), + ZonedDateTime.now(ZoneId.systemDefault()), randomMap(), randomMap() ); @@ -56,6 +59,7 @@ public static HttpResponseAttachment randomHttpResponseAttachment() { randomString(), randomString(), ThreadLocalRandom.current().nextInt(), + ZonedDateTime.now(ZoneId.systemDefault()), randomMap(), randomMap() ); diff --git a/allure-rest-assured/src/main/java/io/qameta/allure/restassured/AllureRestAssured.java b/allure-rest-assured/src/main/java/io/qameta/allure/restassured/AllureRestAssured.java index 717b64ecd..4945fea68 100644 --- a/allure-rest-assured/src/main/java/io/qameta/allure/restassured/AllureRestAssured.java +++ b/allure-rest-assured/src/main/java/io/qameta/allure/restassured/AllureRestAssured.java @@ -78,6 +78,7 @@ public Response filter(final FilterableRequestSpecification requestSpec, final HttpRequestAttachment.Builder requestAttachmentBuilder = create("Request", requestSpec.getURI()) + .setRequestTime() .setMethod(requestSpec.getMethod()) .setHeaders(toMapConverter(requestSpec.getHeaders())) .setCookies(toMapConverter(requestSpec.getCookies())); @@ -95,6 +96,7 @@ public Response filter(final FilterableRequestSpecification requestSpec, final Response response = filterContext.next(requestSpec, responseSpec); final HttpResponseAttachment responseAttachment = create(response.getStatusLine()) + .setResponseTime() .setResponseCode(response.getStatusCode()) .setHeaders(toMapConverter(response.getHeaders())) .setBody(prettifier.getPrettifiedBodyIfPossible(response, response.getBody()))