Skip to content

Commit baaf4f2

Browse files
committed
Update query string when modifying GET request's parameters
Fixes gh-682
1 parent d62ee4f commit baaf4f2

File tree

2 files changed

+71
-26
lines changed

2 files changed

+71
-26
lines changed

spring-restdocs-core/src/main/java/org/springframework/restdocs/operation/OperationRequestFactory.java

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2014-2019 the original author or authors.
2+
* Copyright 2014-2020 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -17,6 +17,7 @@
1717
package org.springframework.restdocs.operation;
1818

1919
import java.net.URI;
20+
import java.net.URISyntaxException;
2021
import java.util.Collection;
2122
import java.util.Collections;
2223

@@ -94,14 +95,28 @@ public OperationRequest createFrom(OperationRequest original, HttpHeaders newHea
9495

9596
/**
9697
* Creates a new {@code OperationRequest} based on the given {@code original} but with
97-
* the given {@code newParameters}.
98+
* the given {@code newParameters} applied. The query string of a {@code GET} request
99+
* will be updated to reflect the new parameters.
98100
* @param original the original request
99101
* @param newParameters the new parameters
100-
* @return the new request with the new parameters
102+
* @return the new request with the parameters applied
101103
*/
102104
public OperationRequest createFrom(OperationRequest original, Parameters newParameters) {
103-
return new StandardOperationRequest(original.getUri(), original.getMethod(), original.getContent(),
104-
original.getHeaders(), newParameters, original.getParts(), original.getCookies());
105+
URI uri = (original.getMethod() == HttpMethod.GET) ? updateQueryString(original.getUri(), newParameters)
106+
: original.getUri();
107+
return new StandardOperationRequest(uri, original.getMethod(), original.getContent(), original.getHeaders(),
108+
newParameters, original.getParts(), original.getCookies());
109+
}
110+
111+
private URI updateQueryString(URI originalUri, Parameters parameters) {
112+
try {
113+
return new URI(originalUri.getScheme(), originalUri.getUserInfo(), originalUri.getHost(),
114+
originalUri.getPort(), originalUri.getPath(),
115+
parameters.isEmpty() ? null : parameters.toQueryString(), originalUri.getFragment());
116+
}
117+
catch (URISyntaxException ex) {
118+
throw new RuntimeException(ex);
119+
}
105120
}
106121

107122
private HttpHeaders augmentHeaders(HttpHeaders originalHeaders, URI uri, byte[] content) {

spring-restdocs-core/src/test/java/org/springframework/restdocs/operation/preprocess/ParametersModifyingOperationPreprocessorTests.java

Lines changed: 51 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2014-2019 the original author or authors.
2+
* Copyright 2014-2020 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -43,74 +43,104 @@ public class ParametersModifyingOperationPreprocessorTests {
4343
@Test
4444
public void addNewParameter() {
4545
Parameters parameters = new Parameters();
46-
assertThat(this.preprocessor.add("a", "alpha").preprocess(createRequest(parameters)).getParameters())
47-
.containsEntry("a", Arrays.asList("alpha"));
46+
OperationRequest request = this.preprocessor.add("a", "alpha").preprocess(createGetRequest(parameters));
47+
assertThat(request.getParameters()).containsEntry("a", Arrays.asList("alpha"));
48+
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost:8080?a=alpha"));
4849
}
4950

5051
@Test
5152
public void addValueToExistingParameter() {
5253
Parameters parameters = new Parameters();
5354
parameters.add("a", "apple");
54-
assertThat(this.preprocessor.add("a", "alpha").preprocess(createRequest(parameters)).getParameters())
55-
.containsEntry("a", Arrays.asList("apple", "alpha"));
55+
OperationRequest request = this.preprocessor.add("a", "alpha").preprocess(createGetRequest(parameters));
56+
assertThat(request.getParameters()).containsEntry("a", Arrays.asList("apple", "alpha"));
57+
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost:8080?a=apple&a=alpha"));
5658
}
5759

5860
@Test
5961
public void setNewParameter() {
6062
Parameters parameters = new Parameters();
61-
assertThat(this.preprocessor.set("a", "alpha", "avocado").preprocess(createRequest(parameters)).getParameters())
62-
.containsEntry("a", Arrays.asList("alpha", "avocado"));
63+
OperationRequest request = this.preprocessor.set("a", "alpha", "avocado")
64+
.preprocess(createGetRequest(parameters));
65+
assertThat(request.getParameters()).containsEntry("a", Arrays.asList("alpha", "avocado"));
66+
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost:8080?a=alpha&a=avocado"));
6367
}
6468

6569
@Test
6670
public void setExistingParameter() {
6771
Parameters parameters = new Parameters();
6872
parameters.add("a", "apple");
69-
assertThat(this.preprocessor.set("a", "alpha", "avocado").preprocess(createRequest(parameters)).getParameters())
70-
.containsEntry("a", Arrays.asList("alpha", "avocado"));
73+
OperationRequest request = this.preprocessor.set("a", "alpha", "avocado")
74+
.preprocess(createGetRequest(parameters));
75+
assertThat(request.getParameters()).containsEntry("a", Arrays.asList("alpha", "avocado"));
76+
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost:8080?a=alpha&a=avocado"));
7177
}
7278

7379
@Test
7480
public void removeNonExistentParameter() {
7581
Parameters parameters = new Parameters();
76-
assertThat(this.preprocessor.remove("a").preprocess(createRequest(parameters)).getParameters().size())
77-
.isEqualTo(0);
82+
OperationRequest request = this.preprocessor.remove("a").preprocess(createGetRequest(parameters));
83+
assertThat(request.getParameters().size()).isEqualTo(0);
84+
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost:8080"));
7885
}
7986

8087
@Test
8188
public void removeParameter() {
8289
Parameters parameters = new Parameters();
8390
parameters.add("a", "apple");
84-
assertThat(this.preprocessor.set("a", "alpha", "avocado").preprocess(createRequest(parameters)).getParameters())
85-
.containsEntry("a", Arrays.asList("alpha", "avocado"));
91+
OperationRequest request = this.preprocessor.remove("a").preprocess(createGetRequest(parameters));
92+
assertThat(request.getParameters()).isEmpty();
93+
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost:8080"));
8694
}
8795

8896
@Test
8997
public void removeParameterValueForNonExistentParameter() {
9098
Parameters parameters = new Parameters();
91-
assertThat(this.preprocessor.remove("a", "apple").preprocess(createRequest(parameters)).getParameters().size())
92-
.isEqualTo(0);
99+
OperationRequest request = this.preprocessor.remove("a", "apple").preprocess(createGetRequest(parameters));
100+
assertThat(request.getParameters()).isEmpty();
101+
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost:8080"));
93102
}
94103

95104
@Test
96105
public void removeParameterValueWithMultipleValues() {
97106
Parameters parameters = new Parameters();
98107
parameters.add("a", "apple");
99108
parameters.add("a", "alpha");
100-
assertThat(this.preprocessor.remove("a", "apple").preprocess(createRequest(parameters)).getParameters())
101-
.containsEntry("a", Arrays.asList("alpha"));
109+
parameters.add("b", "bravo");
110+
OperationRequest request = this.preprocessor.remove("a", "apple").preprocess(createGetRequest(parameters));
111+
assertThat(request.getParameters()).containsEntry("a", Arrays.asList("alpha"));
112+
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost:8080?a=alpha&b=bravo"));
102113
}
103114

104115
@Test
105116
public void removeParameterValueWithSingleValueRemovesEntryEntirely() {
106117
Parameters parameters = new Parameters();
107118
parameters.add("a", "apple");
108-
assertThat(this.preprocessor.remove("a", "apple").preprocess(createRequest(parameters)).getParameters().size())
109-
.isEqualTo(0);
119+
parameters.add("b", "bravo");
120+
OperationRequest request = this.preprocessor.remove("a", "apple").preprocess(createGetRequest(parameters));
121+
assertThat(request.getParameters()).doesNotContainKey("a");
122+
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost:8080?b=bravo"));
110123
}
111124

112-
private OperationRequest createRequest(Parameters parameters) {
113-
return new OperationRequestFactory().create(URI.create("http://localhost:8080"), HttpMethod.GET, new byte[0],
125+
@Test
126+
public void whenParametersOfANonGetRequestAreModifiedThenTheQueryStringIsUnaffected() {
127+
Parameters parameters = new Parameters();
128+
parameters.add("a", "apple");
129+
parameters.add("b", "bravo");
130+
OperationRequest request = this.preprocessor.remove("a", "apple").preprocess(createPostRequest(parameters));
131+
assertThat(request.getParameters()).doesNotContainKey("a");
132+
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost:8080"));
133+
}
134+
135+
private OperationRequest createGetRequest(Parameters parameters) {
136+
return new OperationRequestFactory().create(
137+
URI.create("http://localhost:8080" + (parameters.isEmpty() ? "" : "?" + parameters.toQueryString())),
138+
HttpMethod.GET, new byte[0], new HttpHeaders(), parameters,
139+
Collections.<OperationRequestPart>emptyList());
140+
}
141+
142+
private OperationRequest createPostRequest(Parameters parameters) {
143+
return new OperationRequestFactory().create(URI.create("http://localhost:8080"), HttpMethod.POST, new byte[0],
114144
new HttpHeaders(), parameters, Collections.<OperationRequestPart>emptyList());
115145
}
116146

0 commit comments

Comments
 (0)