diff --git a/docs/src/main/asciidoc/verifier_contract.adoc b/docs/src/main/asciidoc/verifier_contract.adoc
index efaff3b145..d96dbf14ab 100644
--- a/docs/src/main/asciidoc/verifier_contract.adoc
+++ b/docs/src/main/asciidoc/verifier_contract.adoc
@@ -536,6 +536,31 @@ proper values. Additionally, it registers two helper functions:
* `escapejsonbody`: Escapes the request body in a format that can be embedded in a JSON.
* `jsonpath`: For a given parameter, find an object in the request body.
+==== Registering Your Own WireMock Extension
+
+WireMock lets you register custom extensions. By default, Spring Cloud Contract registers
+the transformer, which lets you reference a request from a response. If you want to
+provide your own extensions, you can register an implementation of the
+`org.springframework.cloud.contract.verifier.dsl.wiremock.WireMockExtensions` interface.
+Since we use the spring.factories extension approach, you can create an entry in
+`META-INF/spring.factories` file similar to the following:
+
+[source,groovy,indent=0]
+----
+include::{stubrunner_core_path}/src/test/resources/META-INF/spring.factories[indent=0]
+----
+
+The following is an example of a custom extension:
+
+.TestWireMockExtensions.groovy
+[source,groovy,indent=0]
+----
+include::{stubrunner_core_path}/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/TestWireMockExtensions.groovy[indent=0]
+----
+
+IMPORTANT: Remember to override the `applyGlobally()` method and set it to `false` if you
+want the transformation to be applied only for a mapping that explicitly requires it.
+
==== Dynamic Properties in the Matchers Sections
If you work with https://docs.pact.io/[Pact], the following discussion may seem familiar.
diff --git a/samples/standalone/restdocs/http-client/pom.xml b/samples/standalone/restdocs/http-client/pom.xml
index 0993b238ae..01033676e7 100644
--- a/samples/standalone/restdocs/http-client/pom.xml
+++ b/samples/standalone/restdocs/http-client/pom.xml
@@ -21,7 +21,6 @@
UTF-8
1.8
2.0.0.BUILD-SNAPSHOT
- 2.0.0.BUILD-SNAPSHOT
@@ -89,13 +88,6 @@
pom
import
-
- org.springframework.cloud
- spring-cloud-commons-dependencies
- ${spring-cloud-commons.version}
- pom
- import
-
diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/provider/wiremock/WireMockHttpServerStub.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/provider/wiremock/WireMockHttpServerStub.java
index e402197655..7146153c20 100644
--- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/provider/wiremock/WireMockHttpServerStub.java
+++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/provider/wiremock/WireMockHttpServerStub.java
@@ -8,27 +8,28 @@ import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import com.github.tomakehurst.wiremock.WireMockServer;
import com.github.tomakehurst.wiremock.client.WireMock;
import com.github.tomakehurst.wiremock.common.Slf4jNotifier;
import com.github.tomakehurst.wiremock.core.WireMockConfiguration;
-import com.github.tomakehurst.wiremock.extension.responsetemplating.ResponseTemplateTransformer;
+import com.github.tomakehurst.wiremock.extension.Extension;
import com.github.tomakehurst.wiremock.stubbing.StubMapping;
-
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-
import org.springframework.cloud.contract.stubrunner.HttpServerStub;
import org.springframework.cloud.contract.verifier.builder.handlebars.HandlebarsEscapeHelper;
import org.springframework.cloud.contract.verifier.builder.handlebars.HandlebarsJsonPathHelper;
+import org.springframework.cloud.contract.verifier.dsl.wiremock.DefaultResponseTransformer;
+import org.springframework.cloud.contract.verifier.dsl.wiremock.WireMockExtensions;
import org.springframework.cloud.contract.wiremock.WireMockSpring;
+import org.springframework.core.io.support.SpringFactoriesLoader;
import org.springframework.util.ClassUtils;
import org.springframework.util.SocketUtils;
import org.springframework.util.StreamUtils;
import org.springframework.util.StringUtils;
-
import wiremock.com.github.jknack.handlebars.Helper;
/**
@@ -47,18 +48,32 @@ public class WireMockHttpServerStub implements HttpServerStub {
private WireMockConfiguration config() {
if (ClassUtils.isPresent("org.springframework.cloud.contract.wiremock.WireMockSpring", null)) {
return WireMockSpring.options()
- .extensions(responseTemplateTransformer());
+ .extensions(responseTransformers());
}
- return new WireMockConfiguration().extensions(responseTemplateTransformer());
+ return new WireMockConfiguration().extensions(responseTransformers());
}
- private ResponseTemplateTransformer responseTemplateTransformer() {
- return new ResponseTemplateTransformer(false, helpers());
+ private Extension[] responseTransformers() {
+ List wireMockExtensions = SpringFactoriesLoader
+ .loadFactories(WireMockExtensions.class, null);
+ List extensions = new ArrayList<>();
+ if (!wireMockExtensions.isEmpty()) {
+ for (WireMockExtensions wireMockExtension : wireMockExtensions) {
+ extensions.addAll(wireMockExtension.extensions());
+ }
+ } else {
+ extensions.add(new DefaultResponseTransformer(false, helpers()));
+ }
+ return extensions.toArray(new Extension[extensions.size()]);
}
/**
* Override this if you want to register your own helpers
+ *
+ * @deprecated - please use the {@link WireMockExtensions} mechanism and pass
+ * the helpers in your implementation
*/
+ @Deprecated
protected Map helpers() {
Map helpers = new HashMap<>();
helpers.put(HandlebarsJsonPathHelper.NAME, new HandlebarsJsonPathHelper());
diff --git a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/provider/wiremock/TestWireMockExtensions.groovy b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/provider/wiremock/TestWireMockExtensions.groovy
new file mode 100644
index 0000000000..5d6d444eda
--- /dev/null
+++ b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/provider/wiremock/TestWireMockExtensions.groovy
@@ -0,0 +1,56 @@
+package org.springframework.cloud.contract.stubrunner.provider.wiremock
+
+import com.github.tomakehurst.wiremock.common.FileSource
+import com.github.tomakehurst.wiremock.extension.Extension
+import com.github.tomakehurst.wiremock.extension.Parameters
+import com.github.tomakehurst.wiremock.extension.ResponseTransformer
+import com.github.tomakehurst.wiremock.http.Request
+import com.github.tomakehurst.wiremock.http.Response
+
+import org.springframework.cloud.contract.verifier.dsl.wiremock.DefaultResponseTransformer
+import org.springframework.cloud.contract.verifier.dsl.wiremock.WireMockExtensions
+
+/**
+ * Extension that registers the default response transformer and a custom one too
+ */
+class TestWireMockExtensions implements WireMockExtensions {
+ @Override
+ List extensions() {
+ return [
+ new DefaultResponseTransformer(),
+ new CustomExtension()
+ ]
+ }
+}
+
+class CustomExtension extends ResponseTransformer {
+
+ /**
+ * We expect the mapping to contain "foo-transformer" in the list
+ * of "response-transformers" in the stub mapping
+ */
+ @Override
+ String getName() {
+ return "foo-transformer"
+ }
+
+ /**
+ * Transformer returns the "surprise!" body regardless of what you
+ * the stub mapping returns
+ */
+ @Override
+ Response transform(Request request, Response response, FileSource files, Parameters parameters) {
+ return new Response(response.status, response.statusMessage,
+ "surprise!", response.headers, response.wasConfigured(), response.fault, response.fromProxy)
+ }
+
+ /**
+ * We don't want this extension to be applied to every single mapping.
+ * We just want this to take place when a mapping explicitly expresses that in the
+ * "response-transformers" section
+ */
+ @Override
+ boolean applyGlobally() {
+ return false
+ }
+}
diff --git a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/provider/wiremock/WireMockHttpServerStubSpec.groovy b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/provider/wiremock/WireMockHttpServerStubSpec.groovy
index 0a8bb1b3bd..64008e1091 100644
--- a/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/provider/wiremock/WireMockHttpServerStubSpec.groovy
+++ b/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/provider/wiremock/WireMockHttpServerStubSpec.groovy
@@ -23,31 +23,35 @@ import spock.lang.Specification
import org.springframework.boot.test.rule.OutputCapture
import org.springframework.boot.test.web.client.TestRestTemplate
+import org.springframework.web.client.RestTemplate
class WireMockHttpServerStubSpec extends Specification {
public static
- final File MAPPING_DESCRIPTOR = new File('src/test/resources/repository/mappings/spring/cloud/ping/ping.json')
+ final File MAPPING_DESCRIPTOR = new File('src/test/resources/transformers.json')
@Rule OutputCapture capture = new OutputCapture()
def 'should describe stub mapping'() {
given:
- WireMockHttpServerStub mappingDescriptor = new WireMockHttpServerStub().start() as WireMockHttpServerStub
-
+ WireMockHttpServerStub mappingDescriptor = new WireMockHttpServerStub().start() as WireMockHttpServerStub
when:
- StubMapping mapping = mappingDescriptor.getMapping(MAPPING_DESCRIPTOR)
-
+ StubMapping mapping = mappingDescriptor.getMapping(MAPPING_DESCRIPTOR)
then:
- with(mapping) {
- assert request.method == RequestMethod.GET
- assert request.url == '/ping'
- assert response.status == 200
- assert response.body == 'pong'
- assert response.headers.contentTypeHeader.mimeTypePart() == 'text/plain'
- }
-
+ with(mapping) {
+ assert request.method == RequestMethod.GET
+ assert request.url == '/ping'
+ assert response.status == 200
+ assert response.body == 'pong'
+ assert response.headers.contentTypeHeader.mimeTypePart() == 'text/plain'
+ }
+ when:
+ mappingDescriptor.registerMappings([MAPPING_DESCRIPTOR])
+ then:
+ noExceptionThrown()
+ expect:
+ "surprise!" == new RestTemplate().getForObject("http://localhost:" + mappingDescriptor.port() + "/ping", String.class)
cleanup:
- mappingDescriptor.stop()
+ mappingDescriptor.stop()
}
def 'should make WireMock print out logs on INFO'() {
diff --git a/spring-cloud-contract-stub-runner/src/test/resources/META-INF/spring.factories b/spring-cloud-contract-stub-runner/src/test/resources/META-INF/spring.factories
new file mode 100644
index 0000000000..b149be0c5b
--- /dev/null
+++ b/spring-cloud-contract-stub-runner/src/test/resources/META-INF/spring.factories
@@ -0,0 +1,2 @@
+org.springframework.cloud.contract.verifier.dsl.wiremock.WireMockExtensions=\
+org.springframework.cloud.contract.stubrunner.provider.wiremock.TestWireMockExtensions
\ No newline at end of file
diff --git a/spring-cloud-contract-stub-runner/src/test/resources/transformers.json b/spring-cloud-contract-stub-runner/src/test/resources/transformers.json
new file mode 100644
index 0000000000..710b9846d2
--- /dev/null
+++ b/spring-cloud-contract-stub-runner/src/test/resources/transformers.json
@@ -0,0 +1,14 @@
+{
+ "request": {
+ "method": "GET",
+ "url": "/ping"
+ },
+ "response": {
+ "status": 200,
+ "body": "pong",
+ "headers": {
+ "Content-Type": "text/plain"
+ },
+ "transformers" : [ "response-template", "foo-transformer" ]
+ }
+}
\ No newline at end of file
diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/bootSimple/gradle.properties b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/bootSimple/gradle.properties
index ef22b95564..051f2ef6d2 100644
--- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/bootSimple/gradle.properties
+++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/bootSimple/gradle.properties
@@ -14,6 +14,6 @@
# limitations under the License.
#
wiremockVersion=2.8.0
-jsonAssertVersion=0.4.8
+jsonAssertVersion=0.4.10
verifierVersion=2.0.0.BUILD-SNAPSHOT
diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/gradle.properties b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/gradle.properties
index 53bd4d1dac..1af700cadb 100644
--- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/gradle.properties
+++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/gradle.properties
@@ -14,5 +14,5 @@
# limitations under the License.
#
wiremockVersion=2.8.0
-jsonAssertVersion=0.4.8
+jsonAssertVersion=0.4.10
verifierVersion=2.0.0.BUILD-SNAPSHOT
diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleProject/gradle.properties b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleProject/gradle.properties
index 71f7b31454..dc436c77a0 100644
--- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleProject/gradle.properties
+++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleProject/gradle.properties
@@ -14,5 +14,5 @@
# limitations under the License.
#
wiremockVersion=2.8.0
-jsonAssertVersion=0.4.8
+jsonAssertVersion=0.4.10
verifierVersion=2.0.0.BUILD-SNAPSHOT
\ No newline at end of file
diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/scenarioProject/gradle.properties b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/scenarioProject/gradle.properties
index ef22b95564..051f2ef6d2 100644
--- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/scenarioProject/gradle.properties
+++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/scenarioProject/gradle.properties
@@ -14,6 +14,6 @@
# limitations under the License.
#
wiremockVersion=2.8.0
-jsonAssertVersion=0.4.8
+jsonAssertVersion=0.4.10
verifierVersion=2.0.0.BUILD-SNAPSHOT
diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/DefaultResponseTransformer.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/DefaultResponseTransformer.groovy
new file mode 100644
index 0000000000..7dc1d3215a
--- /dev/null
+++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/DefaultResponseTransformer.groovy
@@ -0,0 +1,39 @@
+package org.springframework.cloud.contract.verifier.dsl.wiremock
+
+import com.github.tomakehurst.wiremock.extension.responsetemplating.ResponseTemplateTransformer
+import wiremock.com.github.jknack.handlebars.Helper
+
+import org.springframework.cloud.contract.verifier.builder.handlebars.HandlebarsEscapeHelper
+import org.springframework.cloud.contract.verifier.builder.handlebars.HandlebarsJsonPathHelper
+
+/**
+ * Default implementation of {@link ResponseTemplateTransformer} that contains
+ * default set of handlebars helpers
+ *
+ * @author Marcin Grzejszczak
+ * @since 1.2.0
+ */
+class DefaultResponseTransformer extends ResponseTemplateTransformer {
+ DefaultResponseTransformer() {
+ super(false, defaultHelpers())
+ }
+
+ DefaultResponseTransformer(boolean global) {
+ super(global)
+ }
+
+ DefaultResponseTransformer(boolean global, String helperName, Helper helper) {
+ super(global, helperName, helper)
+ }
+
+ DefaultResponseTransformer(boolean global, Map helpers) {
+ super(global, helpers)
+ }
+
+ private static Map defaultHelpers() {
+ Map helpers = new HashMap<>()
+ helpers.put(HandlebarsJsonPathHelper.NAME, new HandlebarsJsonPathHelper())
+ helpers.put(HandlebarsEscapeHelper.NAME, new HandlebarsEscapeHelper())
+ return helpers
+ }
+}
diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockExtensions.java b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockExtensions.java
new file mode 100644
index 0000000000..43e18900ac
--- /dev/null
+++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockExtensions.java
@@ -0,0 +1,16 @@
+package org.springframework.cloud.contract.verifier.dsl.wiremock;
+
+import java.util.List;
+
+import com.github.tomakehurst.wiremock.extension.Extension;
+
+/**
+ * Contract that describes a list of {@link Extension} extensions
+ * that should be applied to the response
+ *
+ * @author Marcin Grzejszczak
+ * @since 1.2.0
+ */
+public interface WireMockExtensions {
+ List extensions();
+}
diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockResponseStubStrategy.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockResponseStubStrategy.groovy
index f0fee12960..14f4254afe 100755
--- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockResponseStubStrategy.groovy
+++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockResponseStubStrategy.groovy
@@ -17,16 +17,19 @@
package org.springframework.cloud.contract.verifier.dsl.wiremock
import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder
+import com.github.tomakehurst.wiremock.extension.Extension
import com.github.tomakehurst.wiremock.http.HttpHeader
import com.github.tomakehurst.wiremock.http.HttpHeaders
import com.github.tomakehurst.wiremock.http.ResponseDefinition
import groovy.transform.PackageScope
import groovy.transform.TypeChecked
+
import org.springframework.cloud.contract.spec.Contract
import org.springframework.cloud.contract.spec.internal.Request
import org.springframework.cloud.contract.spec.internal.Response
import org.springframework.cloud.contract.verifier.util.ContentType
import org.springframework.cloud.contract.verifier.util.MapConverter
+import org.springframework.core.io.support.SpringFactoriesLoader
import static org.springframework.cloud.contract.verifier.util.ContentUtils.recognizeContentTypeFromContent
import static org.springframework.cloud.contract.verifier.util.ContentUtils.recognizeContentTypeFromHeader
@@ -56,10 +59,21 @@ class WireMockResponseStubStrategy extends BaseWireMockStubStrategy {
appendHeaders(builder)
appendBody(builder)
appendResponseDelayTime(builder)
- builder.withTransformers("response-template")
+ builder.withTransformers(responseTransformerNames())
return builder.build()
}
+ private String[] responseTransformerNames() {
+ List wireMockExtensions = SpringFactoriesLoader.loadFactories(WireMockExtensions, null)
+ if (wireMockExtensions) {
+ return ((List) wireMockExtensions
+ .collect { WireMockExtensions extension -> extension.extensions() }
+ .flatten())
+ .collect { Extension e -> e.getName()} as String[]
+ }
+ return [new DefaultResponseTransformer().getName()] as String[]
+ }
+
private void appendHeaders(ResponseDefinitionBuilder builder) {
if (response.headers) {
builder.withHeaders(new HttpHeaders(response.headers.entries?.collect {
diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/WireMockGroovyDslSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/WireMockGroovyDslSpec.groovy
index 7c0c338845..488b9d1916 100755
--- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/WireMockGroovyDslSpec.groovy
+++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/WireMockGroovyDslSpec.groovy
@@ -78,7 +78,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
"headers" : {
"Content-Type" : "application/json"
},
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
''', wireMockStub)
@@ -126,7 +126,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
"response" : {
"status" : 200,
"body" : "{\\"ingredients\\":[{\\"quantity\\":100,\\"type\\":\\"MALT\\"},{\\"quantity\\":200,\\"type\\":\\"WATER\\"},{\\"quantity\\":300,\\"type\\":\\"HOP\\"},{\\"quantity\\":400,\\"type\\":\\"YIEST\\"}]}",
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
''', wireMockStub)
@@ -180,7 +180,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
"response": {
"status": 204,
"body": "{\\"foundExistingPayment\\":false,\\"paymentId\\":\\"4\\"}",
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
''', wireMockStub)
@@ -227,7 +227,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
"headers" : {
"Content-Type" : "application/json"
},
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
''')
@@ -284,7 +284,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
"headers" : {
"Content-Type" : "application/json"
},
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
''', wireMockStub)
@@ -335,7 +335,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
},
"response" : {
"status" : 200,
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
'''), wireMockStub)
@@ -381,7 +381,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
},
"response" : {
"status" : 200,
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
'''), json)
@@ -427,7 +427,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
},
"response": {
"status": 200,
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
'''), json)
@@ -465,7 +465,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
},
"response": {
"status": 200,
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
'''), json)
@@ -499,7 +499,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
"response": {
"status": 200,
"body":"Jozo<test>",
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
'''), json)
@@ -535,7 +535,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
},
"response": {
"status": 200,
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
'''), json)
@@ -573,7 +573,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
},
"response": {
"status": 200,
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
'''), json)
@@ -624,7 +624,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
"headers" : {
"Content-Type" : "application/json"
},
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
'''), wireMockStub)
@@ -687,7 +687,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
"headers" : {
"Content-Type" : "application/vnd.fraud.v1+json"
},
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
'''), wireMockStub)
@@ -754,7 +754,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
},
"response": {
"status": 200,
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
'''), json)
@@ -793,7 +793,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
},
"response" : {
"status" : 200,
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
'''), json)
@@ -834,7 +834,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
},
"response": {
"status": 200,
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
'''), json)
@@ -865,7 +865,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
},
"response": {
"status": 200,
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
'''), json)
@@ -895,7 +895,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
},
"response": {
"status": 200,
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
'''), json)
@@ -1049,7 +1049,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
},
"response": {
"status": 200,
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
'''), json)
@@ -1123,7 +1123,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
"headers" : {
"Content-Type" : "application/json"
},
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
'''), wireMockStub)
@@ -1184,7 +1184,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
"headers" : {
"Content-Type" : "application/json"
},
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
'''), json)
@@ -1218,7 +1218,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
},
"response": {
"status": 406,
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
'''), json)
@@ -1248,7 +1248,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
},
"response": {
"status": 406,
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
'''), json)
@@ -1282,7 +1282,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
},
"response" : {
"status" : 200,
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
'''), wireMockStub)
@@ -1320,7 +1320,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
},
"response": {
"status": 200,
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
'''), wireMockStub)
@@ -1379,7 +1379,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
"headers" : {
"Content-Type" : "application/json"
},
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
},
"priority" : 1
}
@@ -1425,7 +1425,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
},
"response" : {
"status" : 422,
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
'''), wireMockStub)
@@ -1460,7 +1460,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
"headers" : {
"Content-Type" : "application/json"
},
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
},
"priority" : 1
}
@@ -1592,7 +1592,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
},
"response" : {
"status" : 200,
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
'''
@@ -1673,7 +1673,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
"response" : {
"status" : 200,
"body" : "{\\"number\\":0,\\"last\\":true,\\"numberOfElements\\":1,\\"size\\":1,\\"totalPages\\":1,\\"sort\\":[{\\"nullHandling\\":\\"NATIVE\\",\\"ignoreCase\\":false,\\"property\\":\\"id\\",\\"ascending\\":true,\\"direction\\":\\"ASC\\"}],\\"content\\":[{\\"id\\":\\"00000000-0000-0000-0000-000000000000\\",\\"state\\":\\"ACTIVE\\",\\"type\\":\\"Extraordinary\\"}],\\"first\\":true,\\"totalElements\\":1}",
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
'''), json)
@@ -1802,7 +1802,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
"headers" : {
"Authorization" : "{{{request.headers.Authorization.[0]}}};foo"
},
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
'''), json)
@@ -1936,8 +1936,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
"body" : "{\\"id\\":\\"foo\\"}",
"headers" : {
"Content-Type" : "application/json;charset=UTF-8"
- },
- "transformers" : [ "response-template" ]
+ }
}
}
''', wireMockStub)
@@ -1994,7 +1993,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
"response" : {
"status" : 200,
"body" : "{\\"code\\":91015,\\"payload\\":null,\\"description\\":\\"订单已失效\\",\\"lastUpdateTime\\":\\"0\\"}",
- "transformers" : [ "response-template" ]
+ "transformers" : [ "response-template", "foo-transformer" ]
}
}
''', wireMockStub)
diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/TestWireMockExtensions.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/TestWireMockExtensions.groovy
new file mode 100644
index 0000000000..e39590632f
--- /dev/null
+++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/TestWireMockExtensions.groovy
@@ -0,0 +1,24 @@
+package org.springframework.cloud.contract.verifier.dsl.wiremock
+
+import com.github.tomakehurst.wiremock.extension.Extension
+
+/**
+ * Extension that registers the default transformer and the custom one
+ */
+class TestWireMockExtensions implements WireMockExtensions {
+ @Override
+ List extensions() {
+ return [
+ new DefaultResponseTransformer(),
+ new CustomExtension()
+ ]
+ }
+}
+
+class CustomExtension implements Extension {
+
+ @Override
+ String getName() {
+ return "foo-transformer"
+ }
+}
diff --git a/spring-cloud-contract-verifier/src/test/resources/META-INF/spring.factories b/spring-cloud-contract-verifier/src/test/resources/META-INF/spring.factories
index f69e06c844..92ce449691 100644
--- a/spring-cloud-contract-verifier/src/test/resources/META-INF/spring.factories
+++ b/spring-cloud-contract-verifier/src/test/resources/META-INF/spring.factories
@@ -1,3 +1,8 @@
# Converters
org.springframework.cloud.contract.spec.ContractConverter=\
-org.springframework.cloud.contract.verifier.converter.YamlContractConverter
\ No newline at end of file
+org.springframework.cloud.contract.verifier.converter.YamlContractConverter
+
+# tag::extension[]
+org.springframework.cloud.contract.verifier.dsl.wiremock.WireMockExtensions=\
+org.springframework.cloud.contract.verifier.dsl.wiremock.TestWireMockExtensions
+# end::extension[]
\ No newline at end of file