2727import io .restassured .config .LogConfig ;
2828import io .restassured .config .RestAssuredConfig ;
2929import io .restassured .http .ContentType ;
30- import io .restassured .specification .RequestSpecification ;
31-
32- import java .nio .charset .StandardCharsets ;
33-
3430import org .junit .jupiter .api .Test ;
3531import org .junit .jupiter .api .extension .ExtensionContext ;
3632import org .junit .jupiter .params .ParameterizedTest ;
3733import org .junit .jupiter .params .provider .Arguments ;
3834import org .junit .jupiter .params .provider .ArgumentsProvider ;
3935import org .junit .jupiter .params .provider .ArgumentsSource ;
4036
37+ import java .nio .charset .StandardCharsets ;
4138import java .util .Collection ;
4239import java .util .List ;
4340import java .util .Map ;
41+ import java .util .function .Consumer ;
4442import java .util .stream .Collectors ;
4543import java .util .stream .Stream ;
4644
5048
5149class 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
6465class 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
8181class 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