Skip to content

Commit a448a28

Browse files
committed
fix form params
1 parent d94943d commit a448a28

File tree

2 files changed

+122
-38
lines changed

2 files changed

+122
-38
lines changed

allure-rest-assured/src/main/java/io/qameta/allure/restassured/AllureRestAssured.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import io.qameta.allure.attachment.FreemarkerAttachmentRenderer;
2020
import io.qameta.allure.attachment.http.HttpRequestAttachment;
2121
import io.qameta.allure.attachment.http.HttpResponseAttachment;
22+
import io.qameta.allure.util.ObjectUtils;
2223
import io.restassured.filter.FilterContext;
2324
import io.restassured.filter.OrderedFilter;
2425
import io.restassured.internal.NameAndValue;
@@ -114,7 +115,7 @@ public Response filter(final FilterableRequestSpecification requestSpec,
114115
}
115116

116117
if (Objects.nonNull(requestSpec.getFormParams())) {
117-
requestAttachmentBuilder.setFormParams(requestSpec.getFormParams());
118+
requestAttachmentBuilder.setFormParams(toStringMapConverter(requestSpec.getFormParams()));
118119
}
119120

120121
final HttpRequestAttachment requestAttachment = requestAttachmentBuilder.build();
@@ -155,6 +156,12 @@ private static Map<String, String> toMapConverter(final Iterable<? extends NameA
155156
return result;
156157
}
157158

159+
private static Map<String, String> toStringMapConverter(final Map<String, ?> items) {
160+
final Map<String, String> result = new HashMap<>();
161+
items.forEach((key, value) -> result.put(key, ObjectUtils.toString(value)));
162+
return result;
163+
}
164+
158165
@Override
159166
public int getOrder() {
160167
return Integer.MAX_VALUE;

allure-rest-assured/src/test/java/io/qameta/allure/restassured/AllureRestAssuredTest.java

Lines changed: 114 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,18 @@
2727
import io.restassured.config.LogConfig;
2828
import io.restassured.config.RestAssuredConfig;
2929
import io.restassured.http.ContentType;
30-
import io.restassured.specification.RequestSpecification;
31-
32-
import java.nio.charset.StandardCharsets;
33-
3430
import org.junit.jupiter.api.Test;
3531
import org.junit.jupiter.api.extension.ExtensionContext;
3632
import org.junit.jupiter.params.ParameterizedTest;
3733
import org.junit.jupiter.params.provider.Arguments;
3834
import org.junit.jupiter.params.provider.ArgumentsProvider;
3935
import org.junit.jupiter.params.provider.ArgumentsSource;
4036

37+
import java.nio.charset.StandardCharsets;
4138
import java.util.Collection;
4239
import java.util.List;
4340
import java.util.Map;
41+
import java.util.function.Consumer;
4442
import java.util.stream.Collectors;
4543
import java.util.stream.Stream;
4644

@@ -50,21 +48,23 @@
5048

5149
class AttachmentArgumentProvider implements ArgumentsProvider {
5250
@Override
53-
public Stream<? extends Arguments> provideArguments(ExtensionContext context) {
54-
51+
public Stream<? extends Arguments> provideArguments(final ExtensionContext context) {
5552
return Stream.of(
5653
arguments(ImmutableList.of("Request", "HTTP/1.1 200 OK"), new AllureRestAssured()),
57-
arguments(ImmutableList.of("Allure Request", "Allure Response"), new AllureRestAssured().setRequestAttachmentName("Allure Request").setResponseAttachmentName("Allure Response")),
58-
arguments(ImmutableList.of("Request", "Allure Response"), new AllureRestAssured().setResponseAttachmentName("Allure Response")),
59-
arguments(ImmutableList.of("Allure Request", "HTTP/1.1 200 OK"), new AllureRestAssured().setRequestAttachmentName("Allure Request"))
54+
arguments(ImmutableList.of("Allure Request", "Allure Response"), new AllureRestAssured()
55+
.setRequestAttachmentName("Allure Request")
56+
.setResponseAttachmentName("Allure Response")),
57+
arguments(ImmutableList.of("Request", "Allure Response"), new AllureRestAssured()
58+
.setResponseAttachmentName("Allure Response")),
59+
arguments(ImmutableList.of("Allure Request", "HTTP/1.1 200 OK"), new AllureRestAssured()
60+
.setRequestAttachmentName("Allure Request"))
6061
);
6162
}
6263
}
6364

6465
class JsonPrettifyingArgumentsProvider implements ArgumentsProvider {
6566
@Override
66-
public Stream<? extends Arguments> provideArguments(ExtensionContext context) {
67-
67+
public Stream<? extends Arguments> provideArguments(final ExtensionContext context) {
6868
return Stream.of(
6969
arguments(new AllureRestAssured(), """
7070
{
@@ -80,8 +80,7 @@ public Stream<? extends Arguments> provideArguments(ExtensionContext context) {
8080

8181
class HiddenHeadersArgumentProvider implements ArgumentsProvider {
8282
@Override
83-
public Stream<? extends Arguments> provideArguments(ExtensionContext context) {
84-
83+
public Stream<? extends Arguments> provideArguments(final ExtensionContext context) {
8584
final String hiddenHeader = "Authorization";
8685
final String header = "Accept";
8786
final String headerValue = "value";
@@ -104,8 +103,15 @@ class AllureRestAssuredTest {
104103
@ParameterizedTest
105104
@ArgumentsSource(AttachmentArgumentProvider.class)
106105
void shouldCreateAttachment(final List<String> attachmentNames, final AllureRestAssured filter) {
107-
RestAssured.replaceFiltersWith(filter);
108-
final AllureResults results = execute();
106+
final AllureResults results = executeWithStub(
107+
server -> WireMock.stubFor(WireMock.get(WireMock.urlEqualTo("/hello?Allure=Form"))
108+
.willReturn(WireMock.aResponse().withStatus(200).withBody("some body"))),
109+
server -> RestAssured.given()
110+
.contentType(ContentType.URLENC)
111+
.formParams("Allure", "Form")
112+
.get(server.url("/hello")).then().statusCode(200),
113+
filter
114+
);
109115

110116
assertThat(results.getTestResults()
111117
.stream()
@@ -127,11 +133,26 @@ void shouldProperlySetAttachmentNameForSingleFilterInstance() {
127133
.withStatus(400)
128134
.withBody("some other body");
129135

130-
RestAssured.replaceFiltersWith(filter);
131-
final AllureResults resultsOne = executeWithStub(responseBuilderOne);
136+
// Reuse the same filter instance for both requests to verify names are not cached.
137+
final AllureResults resultsOne = executeWithStub(
138+
server -> WireMock.stubFor(WireMock.get(WireMock.urlEqualTo("/hello?Allure=Form"))
139+
.willReturn(responseBuilderOne)),
140+
server -> RestAssured.given()
141+
.contentType(ContentType.URLENC)
142+
.formParams("Allure", "Form")
143+
.get(server.url("/hello")).then().statusCode(200),
144+
filter
145+
);
132146

133-
RestAssured.replaceFiltersWith(filter);
134-
final AllureResults resultsTwo = executeWithStub(responseBuilderTwo);
147+
final AllureResults resultsTwo = executeWithStub(
148+
server -> WireMock.stubFor(WireMock.get(WireMock.urlEqualTo("/hello?Allure=Form"))
149+
.willReturn(responseBuilderTwo)),
150+
server -> RestAssured.given()
151+
.contentType(ContentType.URLENC)
152+
.formParams("Allure", "Form")
153+
.get(server.url("/hello")).then().statusCode(400),
154+
filter
155+
);
135156

136157
assertThat(resultsOne.getTestResults()
137158
.stream()
@@ -153,10 +174,17 @@ void shouldProperlySetAttachmentNameForSingleFilterInstance() {
153174
@ParameterizedTest
154175
@ArgumentsSource(AttachmentArgumentProvider.class)
155176
void shouldCatchAttachmentBody(final List<String> attachmentNames, final AllureRestAssured filter) {
156-
RestAssured.replaceFiltersWith(filter);
157-
final AllureResults results = execute();
177+
final AllureResults results = executeWithStub(
178+
server -> WireMock.stubFor(WireMock.get(WireMock.urlEqualTo("/hello?Allure=Form"))
179+
.willReturn(WireMock.aResponse().withStatus(200).withBody("some body"))),
180+
server -> RestAssured.given()
181+
.contentType(ContentType.URLENC)
182+
.formParams("Allure", "Form")
183+
.get(server.url("/hello")).then().statusCode(200),
184+
filter
185+
);
158186

159-
List<Attachment> actualAttachments = results.getTestResults().stream()
187+
final List<Attachment> actualAttachments = results.getTestResults().stream()
160188
.map(TestResult::getAttachments)
161189
.flatMap(List::stream)
162190
.collect(Collectors.toList());
@@ -178,14 +206,21 @@ void shouldHideHeadersInAttachments(final Map<String, String> headers,
178206
final String hiddenHeader,
179207
final List<String> expectedValues,
180208
final AllureRestAssured filter) {
181-
182209
final ResponseDefinitionBuilder responseBuilder = WireMock.aResponse().withStatus(200);
183210
headers.forEach(responseBuilder::withHeader);
184211

185212
RestAssured.config = new RestAssuredConfig().logConfig(LogConfig.logConfig().blacklistHeaders(List.of(hiddenHeader)));
186-
RestAssured.replaceFiltersWith(filter);
187213

188-
final AllureResults results = executeWithStub(responseBuilder, RestAssured.with().headers(headers));
214+
final AllureResults results = executeWithStub(
215+
server -> WireMock.stubFor(WireMock.get(WireMock.urlEqualTo("/hello?Allure=Form"))
216+
.willReturn(responseBuilder)),
217+
server -> RestAssured.with()
218+
.headers(headers)
219+
.contentType(ContentType.URLENC)
220+
.formParams("Allure", "Form")
221+
.get(server.url("/hello")).then().statusCode(200),
222+
filter
223+
);
189224

190225
assertThat(results.getAttachments().values())
191226
.hasSize(2)
@@ -203,9 +238,16 @@ void responseJsonPrettified(final AllureRestAssured filter, final String formatt
203238
""")
204239
.withStatus(200);
205240

206-
RestAssured.replaceFiltersWith(filter);
241+
final AllureResults results = executeWithStub(
242+
server -> WireMock.stubFor(WireMock.get(WireMock.urlEqualTo("/hello?Allure=Form"))
243+
.willReturn(responseBuilder)),
244+
server -> RestAssured.with()
245+
.contentType(ContentType.URLENC)
246+
.formParams("Allure", "Form")
247+
.get(server.url("/hello")).then().statusCode(200),
248+
filter
249+
);
207250

208-
final AllureResults results = executeWithStub(responseBuilder, RestAssured.with());
209251
final Attachment requestAttachment = results.getTestResults()
210252
.stream()
211253
.map(TestResult::getAttachments)
@@ -221,27 +263,62 @@ void responseJsonPrettified(final AllureRestAssured filter, final String formatt
221263
.contains(formattedBody);
222264
}
223265

224-
protected final AllureResults execute() {
225-
return executeWithStub(WireMock.aResponse().withBody("some body"));
266+
@Test
267+
void shouldRenderListValuedFormParams() {
268+
final ResponseDefinitionBuilder responseBuilder = WireMock.aResponse()
269+
.withStatus(200)
270+
.withBody("some body");
271+
272+
final AllureResults results = executeWithStub(
273+
server -> WireMock.stubFor(WireMock.post(WireMock.urlPathEqualTo("/hello"))
274+
.willReturn(responseBuilder)),
275+
server -> RestAssured.given()
276+
.contentType(ContentType.URLENC)
277+
.formParam("data", List.of("a", "b"))
278+
.post(server.url("/hello")).then().statusCode(200)
279+
);
280+
281+
assertThat(results.getTestResults()
282+
.stream()
283+
.map(TestResult::getAttachments)
284+
.flatMap(Collection::stream)
285+
.map(Attachment::getName))
286+
.containsExactly("Request", "HTTP/1.1 200 OK");
287+
288+
final Attachment requestAttachment = results.getTestResults()
289+
.stream()
290+
.map(TestResult::getAttachments)
291+
.flatMap(Collection::stream)
292+
.filter(attachment -> "Request".equals(attachment.getName()))
293+
.findAny()
294+
.orElseThrow(() -> new AssertionError("No request attachment found"));
295+
296+
final byte[] attachmentBody = results.getAttachments().get(requestAttachment.getSource());
297+
final String attachmentBodyString = new String(attachmentBody, StandardCharsets.UTF_8);
298+
299+
assertThat(attachmentBodyString)
300+
.contains("data: [a, b]")
301+
.contains("data=[a, b]");
226302
}
227303

228-
protected final AllureResults executeWithStub(ResponseDefinitionBuilder responseBuilder) {
229-
return executeWithStub(responseBuilder, RestAssured.given());
304+
protected final AllureResults executeWithStub(final Consumer<WireMockServer> stubSetup,
305+
final Consumer<WireMockServer> requestExecutor) {
306+
return executeWithStub(stubSetup, requestExecutor, new AllureRestAssured());
230307
}
231308

232-
protected final AllureResults executeWithStub(ResponseDefinitionBuilder responseBuilder, RequestSpecification spec) {
309+
protected final AllureResults executeWithStub(final Consumer<WireMockServer> stubSetup,
310+
final Consumer<WireMockServer> requestExecutor,
311+
final AllureRestAssured filter) {
233312
final WireMockServer server = new WireMockServer(WireMockConfiguration.options().dynamicPort());
234-
final int statusCode = responseBuilder.build().getStatus();
235313

236314
return runWithinTestContext(() -> {
237315
server.start();
238316
WireMock.configureFor(server.port());
317+
RestAssured.replaceFiltersWith(filter);
239318

240-
WireMock.stubFor(WireMock.get(WireMock.urlEqualTo("/hello?Allure=Form")).willReturn(responseBuilder));
319+
stubSetup.accept(server);
241320
try {
242-
spec.contentType(ContentType.URLENC)
243-
.formParams("Allure", "Form")
244-
.get(server.url("/hello")).then().statusCode(statusCode);
321+
requestExecutor.accept(server);
245322
} finally {
246323
server.stop();
247324
RestAssured.replaceFiltersWith(ImmutableList.of());

0 commit comments

Comments
 (0)