diff --git a/accurest-core/src/main/groovy/io/coderate/accurest/dsl/GroovyDsl.groovy b/accurest-core/src/main/groovy/io/coderate/accurest/dsl/GroovyDsl.groovy index 35a2acbc7d..3eb01b9e8c 100644 --- a/accurest-core/src/main/groovy/io/coderate/accurest/dsl/GroovyDsl.groovy +++ b/accurest-core/src/main/groovy/io/coderate/accurest/dsl/GroovyDsl.groovy @@ -1,11 +1,13 @@ package io.coderate.accurest.dsl import groovy.transform.TypeChecked +import io.coderate.accurest.dsl.internal.Response @TypeChecked class GroovyDsl { Request request + Response response static GroovyDsl make(Closure closure) { GroovyDsl dsl = new GroovyDsl() @@ -20,4 +22,11 @@ class GroovyDsl { closure.delegate = request closure() } + + void response(@DelegatesTo(Response) Closure closure) { + Response response = new Response() + this.response = response + closure.delegate = response + closure() + } } diff --git a/accurest-core/src/main/groovy/io/coderate/accurest/dsl/Request.groovy b/accurest-core/src/main/groovy/io/coderate/accurest/dsl/Request.groovy index d4f40ef6ba..60fd51b785 100644 --- a/accurest-core/src/main/groovy/io/coderate/accurest/dsl/Request.groovy +++ b/accurest-core/src/main/groovy/io/coderate/accurest/dsl/Request.groovy @@ -1,9 +1,14 @@ package io.coderate.accurest.dsl import groovy.transform.TypeChecked +import io.coderate.accurest.dsl.internal.Headers +import io.coderate.accurest.dsl.internal.StringCustomizableProperty + +import static io.coderate.accurest.dsl.internal.DelegateHelper.delegateToClosure @TypeChecked class Request { + String method String url StringCustomizableProperty urlPattern @@ -33,140 +38,4 @@ class Request { void urlPath(String urlPath) { this.urlPath = urlPath } - - //TODO: Can we have different types for Client/Server (client: pattern(String), server: value(Boolean/Int)) ? - class CustomizableProperty { - private T client - private V server - - void client(T client) { - this.client = client - } - - void server(V server) { - this.server = server - } - - T toClientSide() { - return client - } - - V toServerSide() { - return server - } - } - - private class StringCustomizableProperty extends CustomizableProperty { - @Override - String toClientSide() { - return super.toClientSide() as String - } - - @Override - String toServerSide() { - return super.toServerSide() as String - } - } - - private class NoOpCustomizableProperty extends CustomizableProperty { - NoOpCustomizableProperty(T value) { - client(value) - server(value) - } - - @Override - public String toString() { - return toClientSide() - } - } - - class Headers { - private Map headers = [:] - - WithValuePattern header(String headerName) { - WithValuePattern withValuePattern = new WithValuePattern() - headers[headerName] = withValuePattern - return withValuePattern - } - - Set> entries() { - return headers.entrySet() - } - } - -/** - * - * From Wiremock - private Map queryParamPatterns; - private List bodyPatterns; - - private String equalToJson; - private String equalToXml; - private String matchesXPath; - private JSONCompareMode jsonCompareMode; - private String equalTo; - private String contains; - private String matches; - private String doesNotMatch; - private Boolean absent; - private String matchesJsonPath; - - */ - class WithValuePattern { - NoOpCustomizableProperty equalToJson - NoOpCustomizableProperty equalToXml - StringCustomizableProperty matchesXPath - NoOpCustomizableProperty jsonCompareMode - NoOpCustomizableProperty equalTo - StringCustomizableProperty contains - StringCustomizableProperty matches - StringCustomizableProperty doesNotMatch - CustomizableProperty absent - StringCustomizableProperty matchesJsonPath - -// void equalToJson(String equalToJson) { -// this.equalToJson = equalToJson -// } -// - void equalTo(String equalTo) { - this.equalTo = new NoOpCustomizableProperty(equalTo) - } - -// void equalToXml(String equalToXml) { -// this.equalToXml = equalToXml -// } - - void matches(@DelegatesTo(StringCustomizableProperty) Closure closure) { - StringCustomizableProperty placeholderHaving = new StringCustomizableProperty() - this.matches = placeholderHaving - delegateToClosure(closure, placeholderHaving) - } - - void doesNotMatch(@DelegatesTo(StringCustomizableProperty) Closure closure) { - StringCustomizableProperty placeholderHaving = new StringCustomizableProperty() - this.doesNotMatch = placeholderHaving - delegateToClosure(closure, placeholderHaving) - } - - void contains(@DelegatesTo(StringCustomizableProperty) Closure closure) { - StringCustomizableProperty placeholderHaving = new StringCustomizableProperty() - this.contains = placeholderHaving - delegateToClosure(closure, placeholderHaving) - } - -// void jsonCompareMode(JSONCompareMode jsonCompareMode) { -// this.jsonCompareMode = jsonCompareMode -// } - - } - - enum JSONCompareMode { - STRICT, LENIENT, NON_EXTENSIBLE, STRICT_ORDER; - } - - private static void delegateToClosure(@DelegatesTo(T) Closure closure, T delegate) { - closure.delegate = delegate - closure() - } - -} \ No newline at end of file +} diff --git a/accurest-core/src/main/groovy/io/coderate/accurest/dsl/WiremockStubStrategy.groovy b/accurest-core/src/main/groovy/io/coderate/accurest/dsl/WiremockStubStrategy.groovy index ea975a0ca8..ee846b1a28 100644 --- a/accurest-core/src/main/groovy/io/coderate/accurest/dsl/WiremockStubStrategy.groovy +++ b/accurest-core/src/main/groovy/io/coderate/accurest/dsl/WiremockStubStrategy.groovy @@ -2,6 +2,9 @@ package io.coderate.accurest.dsl import groovy.json.JsonOutput import groovy.transform.CompileStatic +import io.coderate.accurest.dsl.internal.CustomizableProperty +import io.coderate.accurest.dsl.internal.Headers +import io.coderate.accurest.dsl.internal.WithValuePattern @CompileStatic class WiremockStubStrategy { @@ -14,7 +17,6 @@ class WiremockStubStrategy { String toWiremockClientStub() { return JsonOutput.toJson(buildClientRequest(request)) - } String toWiremockServerStub() { @@ -41,36 +43,36 @@ class WiremockStubStrategy { headers : buildHeaders()].findAll { it.value }] } - private Map buildClientHeadersSection(Request.Headers headers) { + private Map buildClientHeadersSection(Headers headers) { return createHeadersSection(headers) { - Map.Entry entry -> [(entry.key): buildClientHeaderFromValuePattern(entry.value)] + Map.Entry entry -> [(entry.key): buildClientHeaderFromValuePattern(entry.value)] } } - private Map buildServerHeadersSection(Request.Headers headers) { + private Map buildServerHeadersSection(Headers headers) { return createHeadersSection(headers) { - Map.Entry entry -> [(entry.key): buildServerHeaderFromValuePattern(entry.value)] + Map.Entry entry -> [(entry.key): buildServerHeaderFromValuePattern(entry.value)] } } - private Map createHeadersSection(Request.Headers headers, Closure closure) { + private Map createHeadersSection(Headers headers, Closure closure) { return headers?.entries()?.collectEntries(closure) } - private Map buildClientHeaderFromValuePattern(Request.WithValuePattern valuePattern) { + private Map buildClientHeaderFromValuePattern(WithValuePattern valuePattern) { return getValuePatternSection(valuePattern) .findAll { it.value } .collectEntries { [(it.key): it.value.toClientSide()] } } - private Map buildServerHeaderFromValuePattern(Request.WithValuePattern valuePattern) { + private Map buildServerHeaderFromValuePattern(WithValuePattern valuePattern) { return getValuePatternSection(valuePattern) .findAll { it.value } .collectEntries { [(it.key): it.value.toServerSide()] } } - private Map getValuePatternSection(Request.WithValuePattern valuePattern) { + private Map getValuePatternSection(WithValuePattern valuePattern) { return [equalToJson : valuePattern.equalToJson, equalToXml : valuePattern.equalToXml, matchesXPath : valuePattern.matchesXPath, @@ -82,5 +84,4 @@ class WiremockStubStrategy { absent : valuePattern.absent, matchesJsonPath: valuePattern.matchesJsonPath] } - } diff --git a/accurest-core/src/main/groovy/io/coderate/accurest/dsl/internal/CustomizableProperty.groovy b/accurest-core/src/main/groovy/io/coderate/accurest/dsl/internal/CustomizableProperty.groovy new file mode 100644 index 0000000000..592fff82a0 --- /dev/null +++ b/accurest-core/src/main/groovy/io/coderate/accurest/dsl/internal/CustomizableProperty.groovy @@ -0,0 +1,39 @@ +package io.coderate.accurest.dsl.internal + +//TODO: Can we have different types for Client/Server (client: pattern(String), server: value(Boolean/Int)) ? +class CustomizableProperty { + + private T client + private V server + + void client(T client) { + this.client = client + } + + void server(V server) { + this.server = server + } + + T toClientSide() { + return client + } + + V toServerSide() { + return server + } +} + +class StringCustomizableProperty extends CustomizableProperty { +} + +class NoOpCustomizableProperty extends CustomizableProperty { + NoOpCustomizableProperty(T value) { + client(value) + server(value) + } + + @Override + public String toString() { + return toClientSide() + } +} diff --git a/accurest-core/src/main/groovy/io/coderate/accurest/dsl/internal/DelegateHelper.groovy b/accurest-core/src/main/groovy/io/coderate/accurest/dsl/internal/DelegateHelper.groovy new file mode 100644 index 0000000000..baa8240dcf --- /dev/null +++ b/accurest-core/src/main/groovy/io/coderate/accurest/dsl/internal/DelegateHelper.groovy @@ -0,0 +1,10 @@ +package io.coderate.accurest.dsl.internal + +//TODO: There is problem with a trait usage +class DelegateHelper { + + public static void delegateToClosure(@DelegatesTo(T) Closure closure, T delegate) { + closure.delegate = delegate + closure() + } +} diff --git a/accurest-core/src/main/groovy/io/coderate/accurest/dsl/internal/Headers.groovy b/accurest-core/src/main/groovy/io/coderate/accurest/dsl/internal/Headers.groovy new file mode 100644 index 0000000000..3ab38d42ec --- /dev/null +++ b/accurest-core/src/main/groovy/io/coderate/accurest/dsl/internal/Headers.groovy @@ -0,0 +1,17 @@ +package io.coderate.accurest.dsl.internal + +class Headers { + + private Map headers = [:] + + WithValuePattern header(String headerName) { + WithValuePattern withValuePattern = new WithValuePattern() + headers[headerName] = withValuePattern + return withValuePattern + } + + Set> entries() { + //TODO: Make it immutable + return headers.entrySet() + } +} diff --git a/accurest-core/src/main/groovy/io/coderate/accurest/dsl/internal/JSONCompareMode.groovy b/accurest-core/src/main/groovy/io/coderate/accurest/dsl/internal/JSONCompareMode.groovy new file mode 100644 index 0000000000..591432866e --- /dev/null +++ b/accurest-core/src/main/groovy/io/coderate/accurest/dsl/internal/JSONCompareMode.groovy @@ -0,0 +1,5 @@ +package io.coderate.accurest.dsl.internal + +enum JSONCompareMode { + STRICT, LENIENT, NON_EXTENSIBLE, STRICT_ORDER; +} \ No newline at end of file diff --git a/accurest-core/src/main/groovy/io/coderate/accurest/dsl/internal/WithValuePattern.groovy b/accurest-core/src/main/groovy/io/coderate/accurest/dsl/internal/WithValuePattern.groovy new file mode 100644 index 0000000000..5f92b4f27f --- /dev/null +++ b/accurest-core/src/main/groovy/io/coderate/accurest/dsl/internal/WithValuePattern.groovy @@ -0,0 +1,51 @@ +package io.coderate.accurest.dsl.internal + +import static io.coderate.accurest.dsl.internal.DelegateHelper.delegateToClosure + +class WithValuePattern { + + NoOpCustomizableProperty equalToJson + NoOpCustomizableProperty equalToXml + StringCustomizableProperty matchesXPath + NoOpCustomizableProperty jsonCompareMode + NoOpCustomizableProperty equalTo + StringCustomizableProperty contains + StringCustomizableProperty matches + StringCustomizableProperty doesNotMatch + CustomizableProperty absent + StringCustomizableProperty matchesJsonPath + +// void equalToJson(String equalToJson) { +// this.equalToJson = equalToJson +// } +// + void equalTo(String equalTo) { + this.equalTo = new NoOpCustomizableProperty(equalTo) + } + +// void equalToXml(String equalToXml) { +// this.equalToXml = equalToXml +// } + + void matches(@DelegatesTo(StringCustomizableProperty) Closure closure) { + StringCustomizableProperty placeholderHaving = new StringCustomizableProperty() + this.matches = placeholderHaving + delegateToClosure(closure, placeholderHaving) + } + + void doesNotMatch(@DelegatesTo(StringCustomizableProperty) Closure closure) { + StringCustomizableProperty placeholderHaving = new StringCustomizableProperty() + this.doesNotMatch = placeholderHaving + delegateToClosure(closure, placeholderHaving) + } + + void contains(@DelegatesTo(StringCustomizableProperty) Closure closure) { + StringCustomizableProperty placeholderHaving = new StringCustomizableProperty() + this.contains = placeholderHaving + delegateToClosure(closure, placeholderHaving) + } + +// void jsonCompareMode(JSONCompareMode jsonCompareMode) { +// this.jsonCompareMode = jsonCompareMode +// } +}