@@ -2,10 +2,15 @@ package au.com.dius.pact.provider.spring
2
2
3
3
import au.com.dius.pact.core.model.Request
4
4
import au.com.dius.pact.core.model.RequestResponseInteraction
5
+ import au.com.dius.pact.provider.ProviderClient
5
6
import au.com.dius.pact.provider.ProviderInfo
6
7
import au.com.dius.pact.provider.ProviderVerifier
8
+ import groovy.lang.Binding
9
+ import groovy.lang.Closure
10
+ import groovy.lang.GroovyShell
7
11
import mu.KLogging
8
12
import org.apache.commons.lang3.StringUtils
13
+ import org.hamcrest.Matchers.anything
9
14
import org.springframework.http.HttpHeaders
10
15
import org.springframework.http.HttpMethod
11
16
import org.springframework.http.MediaType
@@ -15,16 +20,20 @@ import org.springframework.test.web.servlet.MockMvc
15
20
import org.springframework.test.web.servlet.MvcResult
16
21
import org.springframework.test.web.servlet.RequestBuilder
17
22
import org.springframework.test.web.servlet.ResultActions
23
+ import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder
18
24
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders
19
25
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.asyncDispatch
20
26
import org.springframework.test.web.servlet.result.MockMvcResultHandlers
21
27
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.request
22
28
import org.springframework.web.util.UriComponentsBuilder
29
+ import scala.Function1
23
30
import java.net.URI
31
+ import java.util.concurrent.Callable
32
+ import java.util.function.Consumer
33
+ import java.util.function.Function
24
34
import javax.mail.internet.ContentDisposition
25
35
import javax.mail.internet.MimeMultipart
26
36
import javax.mail.util.ByteArrayDataSource
27
- import org.hamcrest.Matchers.anything
28
37
29
38
/* *
30
39
* Verifies the providers against the defined consumers using Spring MockMvc
@@ -41,7 +50,7 @@ open class MvcProviderVerifier(private val debugRequestResponse: Boolean = false
41
50
try {
42
51
val request = interaction.request
43
52
44
- val mvcResult = executeMockMvcRequest(mockMvc, request)
53
+ val mvcResult = executeMockMvcRequest(mockMvc, request, provider )
45
54
46
55
val expectedResponse = interaction.response
47
56
val actualResponse = handleResponse(mvcResult.response)
@@ -56,7 +65,7 @@ open class MvcProviderVerifier(private val debugRequestResponse: Boolean = false
56
65
}
57
66
}
58
67
59
- fun executeMockMvcRequest (mockMvc : MockMvc , request : Request ): MvcResult {
68
+ fun executeMockMvcRequest (mockMvc : MockMvc , request : Request , provider : ProviderInfo ): MvcResult {
60
69
val body = request.body
61
70
val requestBuilder = if (body != null && body.isPresent()) {
62
71
if (request.isMultipartFileUpload()) {
@@ -81,11 +90,46 @@ open class MvcProviderVerifier(private val debugRequestResponse: Boolean = false
81
90
MockMvcRequestBuilders .request(HttpMethod .valueOf(request.method), requestUriString(request))
82
91
.headers(mapHeaders(request, false ))
83
92
}
84
- return performRequest(mockMvc, requestBuilder).andDo({
93
+
94
+ executeRequestFilter(requestBuilder, provider)
95
+
96
+ return performRequest(mockMvc, requestBuilder).andDo {
85
97
if (debugRequestResponse) {
86
98
MockMvcResultHandlers .print ().handle(it)
87
99
}
88
- }).andReturn()
100
+ }.andReturn()
101
+ }
102
+
103
+ private fun executeRequestFilter (requestBuilder : MockHttpServletRequestBuilder , provider : ProviderInfo ) {
104
+ val requestFilter = provider.requestFilter
105
+ if (requestFilter != null ) {
106
+ when (requestFilter) {
107
+ is Closure <* > -> requestFilter.call(requestBuilder)
108
+ is Function1 <* , * > -> (requestFilter as Function1 <MockHttpServletRequestBuilder , * >).apply (requestBuilder)
109
+ is org.apache.commons.collections4.Closure <* > ->
110
+ (requestFilter as org.apache.commons.collections4.Closure <Any >).execute(requestBuilder)
111
+ else -> {
112
+ if (ProviderClient .isFunctionalInterface(requestFilter)) {
113
+ invokeJavaFunctionalInterface(requestFilter, requestBuilder)
114
+ } else {
115
+ val binding = Binding ()
116
+ binding.setVariable(ProviderClient .REQUEST , requestBuilder)
117
+ val shell = GroovyShell (binding)
118
+ shell.evaluate(requestFilter as String )
119
+ }
120
+ }
121
+ }
122
+ }
123
+ }
124
+
125
+ private fun invokeJavaFunctionalInterface (functionalInterface : Any , requestBuilder : MockHttpServletRequestBuilder ) {
126
+ when (functionalInterface) {
127
+ is Consumer <* > -> (functionalInterface as Consumer <MockHttpServletRequestBuilder >).accept(requestBuilder)
128
+ is Function <* , * > -> (functionalInterface as Function <MockHttpServletRequestBuilder , Any ?>).apply (requestBuilder)
129
+ is Callable <* > -> (functionalInterface as Callable <MockHttpServletRequestBuilder >).call()
130
+ else -> throw IllegalArgumentException (" Java request filters must be either a Consumer or Function that " +
131
+ " takes at least one MockHttpServletRequestBuilder parameter" )
132
+ }
89
133
}
90
134
91
135
private fun performRequest (mockMvc : MockMvc , requestBuilder : RequestBuilder ): ResultActions {
0 commit comments