Skip to content

Commit 0da6581

Browse files
author
Ronald Holshausen
committedFeb 22, 2020
fix: Request query gets mangled/encoded when generating V2 pact file #1018
1 parent 1b2de39 commit 0da6581

File tree

4 files changed

+80
-3
lines changed

4 files changed

+80
-3
lines changed
 

‎consumer/pact-jvm-consumer/src/test/groovy/au/com/dius/pact/consumer/dsl/PactDslRequestWithPathSpec.groovy

+26
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class PactDslRequestWithPathSpec extends Specification {
3939
subject2.requestBody == OptionalBody.body('{"test":true}'.bytes)
4040
}
4141

42+
@Issue('#716')
4243
def 'set the content type header correctly (issue #716)'() {
4344
given:
4445
def builder = ConsumerPactBuilder.consumer('spec').hasPactWith('provider')
@@ -107,4 +108,29 @@ class PactDslRequestWithPathSpec extends Specification {
107108
108109
}
109110
111+
@Issue('#1018')
112+
def 'Request query gets mangled/encoded '() {
113+
given:
114+
def builder = ConsumerPactBuilder.consumer('spec').hasPactWith('provider')
115+
116+
when:
117+
def pact = builder
118+
.uponReceiving('a request with query parameters')
119+
.path('/')
120+
.query('include[]=term&include[]=total_scores&include[]=license&include[]=is_public&include[]=needs_' +
121+
'grading_count&include[]=permissions&include[]=current_grading_period_scores&include[]=course_image&' +
122+
'include[]=favorites')
123+
.willRespondWith()
124+
.status(200)
125+
.toPact()
126+
127+
def request = pact.interactions[0].request
128+
129+
then:
130+
request.query == [
131+
'include[]': ['term', 'total_scores', 'license', 'is_public', 'needs_grading_count', 'permissions',
132+
'current_grading_period_scores', 'course_image', 'favorites']
133+
]
134+
}
135+
110136
}

‎core/model/src/main/kotlin/au/com/dius/pact/core/model/RequestResponseInteraction.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ open class RequestResponseInteraction @JvmOverloads constructor(
113113

114114
private fun mapToQueryStr(query: Map<String, List<String>>): String {
115115
return query.entries.joinToString("&") { (k, v) ->
116-
v.joinToString { "$k=${URLEncoder.encode(it, "UTF-8")}" }
116+
v.joinToString("&") { "$k=${URLEncoder.encode(it, "UTF-8")}" }
117117
}
118118
}
119119

‎core/model/src/test/groovy/au/com/dius/pact/core/model/PactWriterSpec.groovy

+32
Original file line numberDiff line numberDiff line change
@@ -212,4 +212,36 @@ class PactWriterSpec extends Specification {
212212
cleanup:
213213
pactFile.delete()
214214
}
215+
216+
@Issue('#1018')
217+
def 'encode the query parameters correctly with V2 pact files'() {
218+
given:
219+
def request = new Request('GET', '/', [
220+
'include[]': ['term', 'total_scores', 'license', 'is_public', 'needs_grading_count', 'permissions',
221+
'current_grading_period_scores', 'course_image', 'favorites']
222+
])
223+
def response = new Response()
224+
def interaction = new RequestResponseInteraction('test interaction with query parameters',
225+
[], request, response)
226+
def pact = new RequestResponsePact(new Provider('PactWriterSpecProvider'),
227+
new Consumer('PactWriterSpecConsumer'), [interaction])
228+
def sw = new StringWriter()
229+
def sw2 = new StringWriter()
230+
231+
when:
232+
DefaultPactWriter.INSTANCE.writePact(pact, new PrintWriter(sw), PactSpecVersion.V2)
233+
DefaultPactWriter.INSTANCE.writePact(pact, new PrintWriter(sw2), PactSpecVersion.V3)
234+
def json = Json.INSTANCE.toMap(JsonParser.parseString(sw.toString()))
235+
def interactionJson = json.interactions.first()
236+
def json2 = Json.INSTANCE.toMap(JsonParser.parseString(sw2.toString()))
237+
def interactionJson2 = json2.interactions.first()
238+
239+
then:
240+
interactionJson.request.query == 'include[]=term&include[]=total_scores&include[]=license&include[]=is_public' +
241+
'&include[]=needs_grading_count&include[]=permissions&include[]=current_grading_period_scores&include[]' +
242+
'=course_image&include[]=favorites'
243+
interactionJson2.request.query == [
244+
'include[]': ['term', 'total_scores', 'license', 'is_public', 'needs_grading_count', 'permissions',
245+
'current_grading_period_scores', 'course_image', 'favorites']]
246+
}
215247
}

‎core/model/src/test/groovy/au/com/dius/pact/core/model/RequestResponseInteractionSpec.groovy

+21-2
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,22 @@ package au.com.dius.pact.core.model
33
import au.com.dius.pact.core.model.generators.Category
44
import au.com.dius.pact.core.model.generators.Generators
55
import au.com.dius.pact.core.model.generators.RandomStringGenerator
6+
import spock.lang.Issue
67
import spock.lang.Specification
78
import spock.lang.Unroll
89

910
class RequestResponseInteractionSpec extends Specification {
1011

11-
private interaction, generators
12+
private RequestResponseInteraction interaction
13+
private generators
14+
private Request request
1215

1316
def setup() {
1417
generators = new Generators([(Category.HEADER): [a: new RandomStringGenerator(4)]])
18+
request = new Request(generators: generators)
1519
interaction = new RequestResponseInteraction('test interaction', [
1620
new ProviderState('state one'), new ProviderState('state two', [value: 'one', other: '2'])],
17-
new Request(generators: generators), new Response(generators: generators))
21+
request, new Response(generators: generators))
1822
}
1923

2024
def 'creates a V3 map format if V3 spec'() {
@@ -97,4 +101,19 @@ class RequestResponseInteractionSpec extends Specification {
97101
[new ProviderState('state 1'), new ProviderState('state 2')] | 'state 1, state 2'
98102
}
99103

104+
@Issue('#1018')
105+
def 'correctly encodes the query parameters when V2 format'() {
106+
given:
107+
request.query = ['include[]': ['term', 'total_scores', 'license', 'is_public', 'needs_grading_count', 'permissions',
108+
'current_grading_period_scores', 'course_image', 'favorites']]
109+
110+
when:
111+
def map = interaction.toMap(PactSpecVersion.V2)
112+
113+
then:
114+
map.request.query == 'include[]=term&include[]=total_scores&include[]=license&include[]=is_public&' +
115+
'include[]=needs_grading_count&include[]=permissions&include[]=current_grading_period_scores&' +
116+
'include[]=course_image&include[]=favorites'
117+
}
118+
100119
}

0 commit comments

Comments
 (0)
Please sign in to comment.