Skip to content

Commit 6eee482

Browse files
author
Ronald Holshausen
committedJan 18, 2020
fix: Target request filter validation for MockMvcTarget #983
1 parent 4336c50 commit 6eee482

File tree

7 files changed

+28
-17
lines changed

7 files changed

+28
-17
lines changed
 

‎core/pact-broker/src/main/kotlin/au/com/dius/pact/core/pactbroker/HalClient.kt

+6-6
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ open class HalClient @JvmOverloads constructor(
271271
if (response.statusLine.statusCode < 300) {
272272
val contentType = ContentType.getOrDefault(response.entity)
273273
if (isJsonResponse(contentType)) {
274-
return@of JsonParser().parse(EntityUtils.toString(response.entity))
274+
return@of JsonParser.parseString(EntityUtils.toString(response.entity))
275275
} else {
276276
throw InvalidHalResponse("Expected a HAL+JSON response from the pact broker, but got '$contentType'")
277277
}
@@ -408,16 +408,16 @@ open class HalClient @JvmOverloads constructor(
408408
if (isJsonResponse(contentType)) {
409409
var error = ""
410410
if (body.isNotEmpty()) {
411-
val jsonBody = JsonParser().parse(body)
411+
val jsonBody = JsonParser.parseString(body)
412412
if (jsonBody != null && jsonBody.obj.has("errors")) {
413413
if (jsonBody["errors"].isJsonArray) {
414414
error = " - " + jsonBody["errors"].asJsonArray.joinToString(", ") { it.asString }
415415
} else if (jsonBody["errors"].isJsonObject) {
416-
error = " - " + jsonBody["errors"].asJsonObject.entrySet().joinToString(", ") {
417-
if (it.value.isJsonArray) {
418-
"${it.key}: ${it.value.array.joinToString(", ") { it.asString }}"
416+
error = " - " + jsonBody["errors"].asJsonObject.entrySet().joinToString(", ") { entry ->
417+
if (entry.value.isJsonArray) {
418+
"${entry.key}: ${entry.value.array.joinToString(", ") { it.asString }}"
419419
} else {
420-
"${it.key}: ${it.value.asString}"
420+
"${entry.key}: ${entry.value.asString}"
421421
}
422422
}
423423
}

‎core/support/src/main/kotlin/au/com/dius/pact/core/support/Json.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ object Json {
107107
}
108108
}
109109

110-
fun prettyPrint(json: String) = gsonPretty.toJson(JsonParser().parse(json))
110+
fun prettyPrint(json: String): String = gsonPretty.toJson(JsonParser.parseString(json))
111111

112112
fun exceptionToJson(exp: Exception) = jsonObject("message" to exp.message,
113113
"exceptionClass" to exp.javaClass.name)

‎provider/pact-jvm-provider-junit/src/main/kotlin/au/com/dius/pact/provider/junit/InteractionRunner.kt

+3-9
Original file line numberDiff line numberDiff line change
@@ -84,24 +84,18 @@ open class InteractionRunner<I>(
8484
validatePublicVoidNoArgMethods(After::class.java, false, errors)
8585
validateStateChangeMethods(testClass, errors)
8686
validateConstructor(errors)
87-
val targetField = validateTestTarget(errors)
87+
validateTestTarget(errors)
8888
validateRules(errors)
89-
validateTargetRequestFilters(errors, targetField)
89+
validateTargetRequestFilters(errors)
9090

9191
if (errors.isNotEmpty()) {
9292
throw InitializationError(errors)
9393
}
9494
}
9595

96-
private fun validateTargetRequestFilters(errors: MutableList<Throwable>, targetField: FrameworkField) {
96+
private fun validateTargetRequestFilters(errors: MutableList<Throwable>) {
9797
testClass.getAnnotatedMethods(TargetRequestFilter::class.java).forEach { method ->
9898
method.validatePublicVoid(false, errors)
99-
val requestClass = (targetField.type.newInstance() as Target).getRequestClass()
100-
if (method.method.parameterTypes.size != 1) {
101-
errors.add(Exception("Method ${method.name} should take only a single ${requestClass.simpleName} parameter"))
102-
} else if (!requestClass.isAssignableFrom(method.method.parameterTypes[0])) {
103-
errors.add(Exception("Method ${method.name} should take only a single HttpRequest parameter"))
104-
}
10599
}
106100
}
107101

‎provider/pact-jvm-provider-junit/src/main/kotlin/au/com/dius/pact/provider/junit/target/AmqpTarget.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,9 @@ open class AmqpTarget @JvmOverloads constructor(
100100

101101
if (source is PactBrokerSource<*>) {
102102
val (_, _, _, pacts) = source
103-
providerInfo.consumers = pacts.entries.flatMap { e -> e.value.map { p -> ConsumerInfo(e.key.name, p) } }.toMutableList()
103+
providerInfo.consumers = pacts.entries.flatMap { e ->
104+
e.value.map { p -> ConsumerInfo(e.key.name, p) }
105+
}.toMutableList()
104106
} else if (source is DirectorySource<*>) {
105107
val (_, pacts) = source
106108
providerInfo.consumers = pacts.entries.map { e -> ConsumerInfo(e.value.consumer.name, e.value) }.toMutableList()

‎provider/pact-jvm-provider-junit/src/main/kotlin/au/com/dius/pact/provider/junit/target/BaseTarget.kt

+12
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import java.io.File
1515
import java.util.function.BiConsumer
1616
import java.util.function.Supplier
1717
import org.apache.commons.lang3.tuple.Pair
18+
import org.junit.runners.model.FrameworkMethod
1819

1920
/**
2021
* Out-of-the-box implementation of [Target],
@@ -100,4 +101,15 @@ abstract class BaseTarget : TestClassAwareTarget {
100101
this.stateHandlers.add(stateHandler)
101102
return this
102103
}
104+
105+
protected fun validateTargetRequestFilters(methods: MutableList<FrameworkMethod>) {
106+
methods.forEach { method ->
107+
val requestClass = getRequestClass()
108+
if (method.method.parameterTypes.size != 1) {
109+
throw Exception("Method ${method.name} should take only a single ${requestClass.simpleName} parameter")
110+
} else if (!requestClass.isAssignableFrom(method.method.parameterTypes[0])) {
111+
throw Exception("Method ${method.name} should take only a single ${requestClass.simpleName} parameter")
112+
}
113+
}
114+
}
103115
}

‎provider/pact-jvm-provider-junit/src/main/kotlin/au/com/dius/pact/provider/junit/target/HttpTarget.kt

+2
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@ open class HttpTarget
118118

119119
val methods = testClass.getAnnotatedMethods(TargetRequestFilter::class.java)
120120
if (methods.isNotEmpty()) {
121+
validateTargetRequestFilters(methods)
122+
121123
providerInfo.requestFilter = Consumer { httpRequest: HttpRequest ->
122124
methods.forEach { method ->
123125
try {

‎provider/pact-jvm-provider-spring/src/main/kotlin/au/com/dius/pact/provider/spring/target/MockMvcTarget.kt

+1
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ class MockMvcTarget @JvmOverloads constructor(
131131

132132
val methods = testClass.getAnnotatedMethods(TargetRequestFilter::class.java)
133133
if (methods.isNotEmpty()) {
134+
validateTargetRequestFilters(methods)
134135
providerInfo.requestFilter = Consumer<MockHttpServletRequestBuilder> { httpRequest ->
135136
methods.forEach { method ->
136137
try {

0 commit comments

Comments
 (0)
Please sign in to comment.