From 66bc04a6daa1e0a2584a69cea94c392a46e5536e Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Fri, 15 Jul 2016 00:19:51 +0200 Subject: [PATCH] Generating values if only one regex is passed with this change if in the DSL the regex is not in the valid place - an exception will be thrown if the regex is passed properly but there is no other value (client / server) - it will get generated fixes #32 --- spring-cloud-contract-spec/pom.xml | 5 +++ .../contract/spec/internal/Common.groovy | 12 ++++-- .../contract/spec/internal/Request.groovy | 26 +++++++++++++ .../contract/spec/internal/Response.groovy | 27 ++++++++++++++ .../repackaged}/nl/flotsam/xeger/Xeger.java | 10 ++--- .../contract/spec/internal/RequestSpec.groovy | 37 +++++++++++++++++++ .../spec/internal/ResponseSpec.groovy | 37 +++++++++++++++++++ .../nl/flotsam/xeger/XegerTest.java | 2 +- .../nl/flotsam/xeger/XegerUtilsTest.java | 2 +- .../pom.xml | 5 --- .../wiremock/WireMockToDslConverter.groovy | 2 +- .../verifier/dsl/WireMockGroovyDslSpec.groovy | 3 +- 12 files changed, 149 insertions(+), 19 deletions(-) rename {spring-cloud-contract-verifier/spring-cloud-contract-verifier-converters/src/main/groovy => spring-cloud-contract-spec/src/main/groovy/repackaged}/nl/flotsam/xeger/Xeger.java (96%) create mode 100644 spring-cloud-contract-spec/src/test/groovy/org/springframework/cloud/contract/spec/internal/RequestSpec.groovy create mode 100644 spring-cloud-contract-spec/src/test/groovy/org/springframework/cloud/contract/spec/internal/ResponseSpec.groovy rename {spring-cloud-contract-verifier/spring-cloud-contract-verifier-converters/src/test/groovy => spring-cloud-contract-spec/src/test/groovy/repackaged}/nl/flotsam/xeger/XegerTest.java (98%) rename {spring-cloud-contract-verifier/spring-cloud-contract-verifier-converters/src/test/groovy => spring-cloud-contract-spec/src/test/groovy/repackaged}/nl/flotsam/xeger/XegerUtilsTest.java (96%) diff --git a/spring-cloud-contract-spec/pom.xml b/spring-cloud-contract-spec/pom.xml index 790b66ca8d..02b0320f29 100644 --- a/spring-cloud-contract-spec/pom.xml +++ b/spring-cloud-contract-spec/pom.xml @@ -17,6 +17,11 @@ org.codehaus.groovy groovy + + dk.brics.automaton + automaton + 1.11-8 + org.spockframework spock-core diff --git a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Common.groovy b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Common.groovy index 6cbf2a3a6f..a403f4d1e9 100644 --- a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Common.groovy +++ b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Common.groovy @@ -81,15 +81,19 @@ class Common { return new DslProperty(client.clientValue, server.serverValue) } - DslProperty value(Object value) { - return new DslProperty(value) - } - DslProperty value(ServerDslProperty server, ClientDslProperty client) { assertThatSidesMatch(client.clientValue, server.serverValue) return new DslProperty(client.clientValue, server.serverValue) } + DslProperty value(DslProperty value) { + return value + } + + DslProperty value(Object value) { + return new DslProperty(value) + } + DslProperty $(ClientDslProperty client, ServerDslProperty server) { return value(client, server) } diff --git a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Request.groovy b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Request.groovy index 724771d2f4..982fe8f1ea 100644 --- a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Request.groovy +++ b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Request.groovy @@ -20,7 +20,9 @@ import groovy.transform.CompileStatic import groovy.transform.EqualsAndHashCode import groovy.transform.ToString import groovy.transform.TypeChecked +import repackaged.nl.flotsam.xeger.Xeger +import java.util.regex.Pattern /** * Represents the request side of the HTTP communication * @@ -172,6 +174,30 @@ class Request extends Common { throw new IllegalStateException("Optional can be used only for the stub side of the request!") } + DslProperty value(ClientDslProperty client) { + Object clientValue = client.clientValue + if (client.clientValue instanceof Pattern) { + clientValue = new Xeger(((Pattern)client.clientValue).pattern()).generate() + } + return new DslProperty(client.clientValue, clientValue) + } + + @Override + DslProperty value(ClientDslProperty client, ServerDslProperty server) { + if (server.clientValue instanceof Pattern) { + throw new IllegalStateException("You can't have a regular expression for the request on the server side") + } + return super.value(client, server) + } + + @Override + DslProperty value(ServerDslProperty server, ClientDslProperty client) { + if (server.clientValue instanceof Pattern) { + throw new IllegalStateException("You can't have a regular expression for the request on the server side") + } + return super.value(server, client) + } + } @CompileStatic diff --git a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Response.groovy b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Response.groovy index 454841becd..035ef82abc 100644 --- a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Response.groovy +++ b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Response.groovy @@ -20,6 +20,9 @@ import groovy.transform.CompileStatic import groovy.transform.EqualsAndHashCode import groovy.transform.ToString import groovy.transform.TypeChecked +import repackaged.nl.flotsam.xeger.Xeger + +import java.util.regex.Pattern /** * Represents the response side of the HTTP communication @@ -83,6 +86,30 @@ class Response extends Common { void assertThatSidesMatch(OptionalProperty stubSide, Object testSide) { throw new IllegalStateException("Optional can be used only in the test side of the response!") } + + DslProperty value(ServerDslProperty server) { + Object value = server.clientValue + if (server.clientValue instanceof Pattern) { + value = new Xeger(((Pattern)server.clientValue).pattern()).generate() + } + return new DslProperty(server.clientValue, value) + } + + @Override + DslProperty value(ClientDslProperty client, ServerDslProperty server) { + if (client.clientValue instanceof Pattern) { + throw new IllegalStateException("You can't have a regular expression for the response on the client side") + } + return super.value(client, server) + } + + @Override + DslProperty value(ServerDslProperty server, ClientDslProperty client) { + if (client.clientValue instanceof Pattern) { + throw new IllegalStateException("You can't have a regular expression for the response on the client side") + } + return super.value(server, client) + } } @CompileStatic diff --git a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-converters/src/main/groovy/nl/flotsam/xeger/Xeger.java b/spring-cloud-contract-spec/src/main/groovy/repackaged/nl/flotsam/xeger/Xeger.java similarity index 96% rename from spring-cloud-contract-verifier/spring-cloud-contract-verifier-converters/src/main/groovy/nl/flotsam/xeger/Xeger.java rename to spring-cloud-contract-spec/src/main/groovy/repackaged/nl/flotsam/xeger/Xeger.java index 9bd42a674a..10b3987643 100644 --- a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-converters/src/main/groovy/nl/flotsam/xeger/Xeger.java +++ b/spring-cloud-contract-spec/src/main/groovy/repackaged/nl/flotsam/xeger/Xeger.java @@ -19,16 +19,16 @@ * released to any central repository. * */ -package nl.flotsam.xeger; +package repackaged.nl.flotsam.xeger; + +import java.util.List; +import java.util.Random; import dk.brics.automaton.Automaton; import dk.brics.automaton.RegExp; import dk.brics.automaton.State; import dk.brics.automaton.Transition; -import java.util.List; -import java.util.Random; - /** * An object that will generate text from a regular expression. In a way, it's the opposite of a regular expression * matcher: an instance of this class will produce text that is guaranteed to match the regular expression passed in. @@ -53,7 +53,7 @@ public class Xeger { } /** - * As {@link nl.flotsam.xeger.Xeger#Xeger(String, java.util.Random)}, creating a {@link java.util.Random} instance + * As {@link Xeger#Xeger(String, java.util.Random)}, creating a {@link java.util.Random} instance * implicityly. * * @param regex as string diff --git a/spring-cloud-contract-spec/src/test/groovy/org/springframework/cloud/contract/spec/internal/RequestSpec.groovy b/spring-cloud-contract-spec/src/test/groovy/org/springframework/cloud/contract/spec/internal/RequestSpec.groovy new file mode 100644 index 0000000000..2e3e8fecc7 --- /dev/null +++ b/spring-cloud-contract-spec/src/test/groovy/org/springframework/cloud/contract/spec/internal/RequestSpec.groovy @@ -0,0 +1,37 @@ +package org.springframework.cloud.contract.spec.internal + +import spock.lang.Specification +/** + * @author Marcin Grzejszczak + */ +class RequestSpec extends Specification { + + def 'should throw exception when on request side a value contains regex for server'() { + given: + Request request = new Request() + when: + request.with { + value(client("foo"), server(regex("foo"))) + } + then: + thrown(IllegalStateException) + when: + request.with { + value(server(regex("foo")), client("foo")) + } + then: + thrown(IllegalStateException) + } + + def 'should generate a value if only regex is passed for client'() { + given: + Request request = new Request() + DslProperty property + when: + request.with { + property = value(client(regex("[0-9]{5}"))) + } + then: + (property.serverValue as String).matches(/[0-9]{5}/) + } +} diff --git a/spring-cloud-contract-spec/src/test/groovy/org/springframework/cloud/contract/spec/internal/ResponseSpec.groovy b/spring-cloud-contract-spec/src/test/groovy/org/springframework/cloud/contract/spec/internal/ResponseSpec.groovy new file mode 100644 index 0000000000..f22f855f4a --- /dev/null +++ b/spring-cloud-contract-spec/src/test/groovy/org/springframework/cloud/contract/spec/internal/ResponseSpec.groovy @@ -0,0 +1,37 @@ +package org.springframework.cloud.contract.spec.internal + +import spock.lang.Specification +/** + * @author Marcin Grzejszczak + */ +class ResponseSpec extends Specification { + + def 'should throw exception when on response side a value contains regex for client'() { + given: + Response response = new Response() + when: + response.with { + value(server("foo"), client(regex("foo"))) + } + then: + thrown(IllegalStateException) + when: + response.with { + value(client(regex("foo")), server("foo")) + } + then: + thrown(IllegalStateException) + } + + def 'should generate a value if only regex is passed for server'() { + given: + Response request = new Response() + DslProperty property + when: + request.with { + property = value(server(regex("[0-9]{5}"))) + } + then: + (property.serverValue as String).matches(/[0-9]{5}/) + } +} diff --git a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-converters/src/test/groovy/nl/flotsam/xeger/XegerTest.java b/spring-cloud-contract-spec/src/test/groovy/repackaged/nl/flotsam/xeger/XegerTest.java similarity index 98% rename from spring-cloud-contract-verifier/spring-cloud-contract-verifier-converters/src/test/groovy/nl/flotsam/xeger/XegerTest.java rename to spring-cloud-contract-spec/src/test/groovy/repackaged/nl/flotsam/xeger/XegerTest.java index f60e4bf5db..a1f2cd775a 100644 --- a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-converters/src/test/groovy/nl/flotsam/xeger/XegerTest.java +++ b/spring-cloud-contract-spec/src/test/groovy/repackaged/nl/flotsam/xeger/XegerTest.java @@ -15,7 +15,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package nl.flotsam.xeger; +package repackaged.nl.flotsam.xeger; import org.junit.Test; diff --git a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-converters/src/test/groovy/nl/flotsam/xeger/XegerUtilsTest.java b/spring-cloud-contract-spec/src/test/groovy/repackaged/nl/flotsam/xeger/XegerUtilsTest.java similarity index 96% rename from spring-cloud-contract-verifier/spring-cloud-contract-verifier-converters/src/test/groovy/nl/flotsam/xeger/XegerUtilsTest.java rename to spring-cloud-contract-spec/src/test/groovy/repackaged/nl/flotsam/xeger/XegerUtilsTest.java index ccabfeb54d..978a6ab8d3 100644 --- a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-converters/src/test/groovy/nl/flotsam/xeger/XegerUtilsTest.java +++ b/spring-cloud-contract-spec/src/test/groovy/repackaged/nl/flotsam/xeger/XegerUtilsTest.java @@ -15,7 +15,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package nl.flotsam.xeger; +package repackaged.nl.flotsam.xeger; import org.hamcrest.Matchers; import org.junit.Test; diff --git a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-converters/pom.xml b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-converters/pom.xml index 9d288ecb9b..fc38432e34 100644 --- a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-converters/pom.xml +++ b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-converters/pom.xml @@ -30,11 +30,6 @@ com.github.tomakehurst wiremock - - dk.brics.automaton - automaton - 1.11-8 - org.spockframework spock-core diff --git a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-converters/src/main/groovy/org/springframework/cloud/contract/verifier/wiremock/WireMockToDslConverter.groovy b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-converters/src/main/groovy/org/springframework/cloud/contract/verifier/wiremock/WireMockToDslConverter.groovy index 960797316c..fdccd95ba5 100644 --- a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-converters/src/main/groovy/org/springframework/cloud/contract/verifier/wiremock/WireMockToDslConverter.groovy +++ b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-converters/src/main/groovy/org/springframework/cloud/contract/verifier/wiremock/WireMockToDslConverter.groovy @@ -23,7 +23,7 @@ import groovy.json.JsonSlurper import groovy.transform.CompileDynamic import groovy.xml.XmlUtil import org.springframework.cloud.contract.spec.Contract -import nl.flotsam.xeger.Xeger +import repackaged.nl.flotsam.xeger.Xeger import java.nio.charset.StandardCharsets diff --git a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-core/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/WireMockGroovyDslSpec.groovy b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-core/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/WireMockGroovyDslSpec.groovy index c4a9fec545..04e0a36783 100755 --- a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-core/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/WireMockGroovyDslSpec.groovy +++ b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-core/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/WireMockGroovyDslSpec.groovy @@ -865,8 +865,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie } } then: - def e = thrown(IllegalStateException) - e.message.contains "Query parameter 'age' can't be a pattern for the server side" + thrown(IllegalStateException) } def "should not allow query parameter unresolvable for a server value"() {