From 21b06a8eac832e35c48c7c417a408e31d2c3bafc Mon Sep 17 00:00:00 2001 From: Tomas Bjerre Date: Fri, 7 Feb 2025 16:33:46 +0100 Subject: [PATCH] feat: global response templating configurable --- .../wiremock/spring/ConfigureWireMock.java | 5 ++ .../internal/WireMockServerCreator.java | 5 +- .../ResponseTemplatingGlobalTest.java | 48 +++++++++++++++++++ .../usecases/ResponseTemplatingLocalTest.java | 46 ++++++++++++++++++ .../mappings/global-templating.json | 15 ++++++ .../mappings/local-templating-enabled.json | 18 +++++++ 6 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 src/test/java/usecases/ResponseTemplatingGlobalTest.java create mode 100644 src/test/java/usecases/ResponseTemplatingLocalTest.java create mode 100644 src/test/resources/response-templating/mappings/global-templating.json create mode 100644 src/test/resources/response-templating/mappings/local-templating-enabled.json diff --git a/src/main/java/org/wiremock/spring/ConfigureWireMock.java b/src/main/java/org/wiremock/spring/ConfigureWireMock.java index bce22e5..f5e7228 100644 --- a/src/main/java/org/wiremock/spring/ConfigureWireMock.java +++ b/src/main/java/org/wiremock/spring/ConfigureWireMock.java @@ -132,4 +132,9 @@ * be {@link Autowired} by name. */ boolean registerSpringBean() default false; + + /** + * @see WireMockConfiguration#globalTemplating(boolean) + */ + boolean globalTemplating() default false; } diff --git a/src/main/java/org/wiremock/spring/internal/WireMockServerCreator.java b/src/main/java/org/wiremock/spring/internal/WireMockServerCreator.java index 923058f..3d61d05 100644 --- a/src/main/java/org/wiremock/spring/internal/WireMockServerCreator.java +++ b/src/main/java/org/wiremock/spring/internal/WireMockServerCreator.java @@ -11,6 +11,7 @@ import java.util.List; import java.util.Optional; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.junit.platform.commons.util.ReflectionUtils; import org.junit.platform.commons.util.StringUtils; import org.slf4j.Logger; @@ -82,6 +83,8 @@ public WireMockServer createWireMockServer( serverOptions.extensions(options.extensions()); } + serverOptions.globalTemplating(options.globalTemplating()); + this.applyCustomizers(options, serverOptions); this.logger.info( @@ -251,7 +254,7 @@ private Optional configureFilesUnderClasspath( private Optional configureFilesUnderDirectory( final String[] filesUnderDirectory, final String suffix) { final List alternatives = - List.of(filesUnderDirectory).stream() + Stream.of(filesUnderDirectory) .map(it -> it + suffix) .filter( it -> { diff --git a/src/test/java/usecases/ResponseTemplatingGlobalTest.java b/src/test/java/usecases/ResponseTemplatingGlobalTest.java new file mode 100644 index 0000000..0f15be0 --- /dev/null +++ b/src/test/java/usecases/ResponseTemplatingGlobalTest.java @@ -0,0 +1,48 @@ +package usecases; + +import static org.assertj.core.api.Assertions.assertThat; + +import io.restassured.RestAssured; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.SpringBootTest; +import org.wiremock.spring.ConfigureWireMock; +import org.wiremock.spring.EnableWireMock; + +@SpringBootTest +@EnableWireMock({ + @ConfigureWireMock(filesUnderClasspath = "response-templating", globalTemplating = true) +}) +class ResponseTemplatingGlobalTest { + + @Value("${wiremock.server.baseUrl}") + private String wireMockServerUrl; + + @Test + void testLocal() { + RestAssured.baseURI = this.wireMockServerUrl; + final String actual = + RestAssured.when().get("/local-templating").then().extract().asPrettyString(); + assertThat(actual) + .isEqualToIgnoringWhitespace( + """ + { + "name": "Resolved: local-templating" + } + """); + } + + @Test + void testGlobal() { + RestAssured.baseURI = this.wireMockServerUrl; + final String actual = + RestAssured.when().get("/global-templating").then().extract().asPrettyString(); + assertThat(actual) + .isEqualToIgnoringWhitespace( + """ + { + "name": "Resolved: global-templating" + } + """); + } +} diff --git a/src/test/java/usecases/ResponseTemplatingLocalTest.java b/src/test/java/usecases/ResponseTemplatingLocalTest.java new file mode 100644 index 0000000..2cfc4ff --- /dev/null +++ b/src/test/java/usecases/ResponseTemplatingLocalTest.java @@ -0,0 +1,46 @@ +package usecases; + +import static org.assertj.core.api.Assertions.assertThat; + +import io.restassured.RestAssured; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.SpringBootTest; +import org.wiremock.spring.ConfigureWireMock; +import org.wiremock.spring.EnableWireMock; + +@SpringBootTest +@EnableWireMock({ + @ConfigureWireMock(filesUnderClasspath = "response-templating", globalTemplating = false) +}) +class ResponseTemplatingLocalTest { + + @Value("${wiremock.server.baseUrl}") + private String wireMockServerUrl; + + @Test + void testLocal() { + RestAssured.baseURI = this.wireMockServerUrl; + final String actual = + RestAssured.when().get("/local-templating").then().extract().asPrettyString(); + assertThat(actual) + .isEqualToIgnoringWhitespace(""" +{ + "name": "Resolved: local-templating" +} +"""); + } + + @Test + void testGlobal() { + RestAssured.baseURI = this.wireMockServerUrl; + final String actual = + RestAssured.when().get("/global-templating").then().extract().asPrettyString(); + assertThat(actual) + .isEqualToIgnoringWhitespace(""" +{ + "name": "Resolved: {{request.path.[0]}}" +} +"""); + } +} diff --git a/src/test/resources/response-templating/mappings/global-templating.json b/src/test/resources/response-templating/mappings/global-templating.json new file mode 100644 index 0000000..db602e8 --- /dev/null +++ b/src/test/resources/response-templating/mappings/global-templating.json @@ -0,0 +1,15 @@ +{ + "request": { + "method": "GET", + "url": "/global-templating" + }, + "response": { + "headers": { + "Content-Type": "application/json" + }, + "jsonBody": { + "name": "Resolved: {{request.path.[0]}}" + }, + "status": 200 + } +} diff --git a/src/test/resources/response-templating/mappings/local-templating-enabled.json b/src/test/resources/response-templating/mappings/local-templating-enabled.json new file mode 100644 index 0000000..b0360c5 --- /dev/null +++ b/src/test/resources/response-templating/mappings/local-templating-enabled.json @@ -0,0 +1,18 @@ +{ + "request": { + "method": "GET", + "url": "/local-templating" + }, + "response": { + "headers": { + "Content-Type": "application/json" + }, + "jsonBody": { + "name": "Resolved: {{request.path.[0]}}" + }, + "transformers": [ + "response-template" + ], + "status": 200 + } +}