From a6b1cef2e88b28f4e987fe96da877fc9f5f18426 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Fri, 13 Feb 2015 15:18:28 +0100 Subject: [PATCH] [#10] Working Wiremock To Dsl Converter --- .../wiremock/WiremockToDslConverter.groovy | 77 +++++++++++++------ .../WiremockToDslConverterSpec.groovy | 57 +++++++------- .../dsl/BaseWiremockStubStrategy.groovy | 2 +- .../io/coderate/accurest/dsl/GroovyDsl.groovy | 3 +- .../accurest/dsl/internal/Headers.groovy | 3 +- 5 files changed, 88 insertions(+), 54 deletions(-) diff --git a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/WiremockToDslConverter.groovy b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/WiremockToDslConverter.groovy index 4e08b51d5f..f7d2311d75 100644 --- a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/WiremockToDslConverter.groovy +++ b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/WiremockToDslConverter.groovy @@ -4,37 +4,64 @@ import groovy.json.JsonSlurper import io.coderate.accurest.dsl.GroovyDsl class WiremockToDslConverter { - static GroovyDsl fromWiremockStub(String wiremockStringStub) { + static String fromWiremockStub(String wiremockStringStub) { + return new WiremockToDslConverter().convertFromWiremockStub(wiremockStringStub) + } + + private String convertFromWiremockStub(String wiremockStringStub) { Object wiremockStub = new JsonSlurper().parseText(wiremockStringStub) - def wiremockRequest = wiremockStub.request - def wiremockResponse = wiremockStub.response - return GroovyDsl.make { + def request = wiremockStub.request + def response = wiremockStub.response + return """\ request { - wiremockRequest.method ? method(wiremockRequest.method as String) : null - wiremockRequest.url ? url(wiremockRequest.url as String) : null - wiremockRequest.urlPattern ? urlPattern(wiremockRequest.urlPattern as String) : null - wiremockRequest.urlPath ? urlPath(wiremockRequest.urlPath as String) : null - wiremockRequest.headers ? headers { - wiremockRequest.headers.each { - def assertion = it.value - String headerName = it.key as String - def entry = assertion.entrySet().first() - header(headerName)."$entry.key"(entry.value) - } - } : null + ${request.method ? "method '$request.method'" : ""} + ${request.url ? "url '$request.url'" : ""} + ${request.urlPattern ? "urlPattern '$request.urlPattern'" : ""} + ${request.urlPath ? "urlPath '$request.urlPath'" : ""} + ${request.headers ? """headers { + ${request.headers.collect { + def assertion = it.value + String headerName = it.key as String + def entry = assertion.entrySet().first() + """header('$headerName').$entry.key('$entry.value')\n""" + }.join('') + } + } + """ : ""} } response { - status wiremockResponse.status ? wiremockResponse.status as Integer : null - wiremockResponse.body ? body( - wiremockResponse.body as Map - ) : null - wiremockResponse.headers ? headers { - wiremockResponse.headers.each { - header([(it.key): it.value]) + ${response.status ? "status $response.status" : ""} + ${response.body ? "body( ${response.body.entrySet().collectAll(withQuotedStringElements()).inject([:], appendToMap())})" : ""} + ${response.headers ? """headers { + ${response.headers.collect { "header('$it.key': '${it.value}')\n" }.join('')} } - } : null + """ : ""} } - } + """ + } + + private Closure withQuotedStringElements() { + return { [(it.key): convert(it.value)] } + } + + private Closure appendToMap() { + return { acc, el -> acc << el } + } + + private Object convert(Object element) { + return element + } + + private Object convert(String element) { + return """ "$element" """ + } + + private Object convert(List element) { + return element.collect { convert(it) } + } + + private Object convert(Map element) { + return element.collectEntries { [(it.key) : convert(it.value)] } } static int main(String[] args) { diff --git a/accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/WiremockToDslConverterSpec.groovy b/accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/WiremockToDslConverterSpec.groovy index 444c4a3d4f..099d0fb621 100644 --- a/accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/WiremockToDslConverterSpec.groovy +++ b/accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/WiremockToDslConverterSpec.groovy @@ -7,7 +7,7 @@ class WiremockToDslConverterSpec extends Specification { def 'should produce a Groovy DSL from Wiremock stub'() { given: - String wiremockStub = ''' + String wiremockStub = '''\ { "request": { "method": "GET", @@ -27,7 +27,9 @@ class WiremockToDslConverterSpec extends Specification { "response": { "status": 200, "body": { - "id": "123", + "id": { + "value": "132" + }, "surname": "Kowalsky", "name": "Jan", "created" : "2014-02-02 12:23:43" @@ -40,32 +42,35 @@ class WiremockToDslConverterSpec extends Specification { ''' and: GroovyDsl expectedGroovyDsl = GroovyDsl.make { - request { - method 'GET' - urlPattern '/[0-9]{2}' - headers { - header('Accept').matches('text/.*') - header('etag').doesNotMatch('abcd.*') - header('X-Custom-Header').contains('2134') - } - } - response { - status 200 - body ( - id : '123', - surname : 'Kowalsky', - name: 'Jan', - created : '2014-02-02 12:23:43' - ) - headers { - header 'Content-Type': 'text/plain' + request { + method 'GET' + urlPattern '/[0-9]{2}' + headers { + header('Accept').matches('text/.*') + header('etag').doesNotMatch('abcd.*') + header('X-Custom-Header').contains('2134') + } + } + response { + status 200 + body ( + id : [value: '132'], + surname : 'Kowalsky', + name: 'Jan', + created : '2014-02-02 12:23:43' + ) + headers { + header 'Content-Type': 'text/plain' - } - } - } + } + } + } when: - GroovyDsl groovyDsl = WiremockToDslConverter.fromWiremockStub(wiremockStub) + String groovyDsl = WiremockToDslConverter.fromWiremockStub(wiremockStub) then: - groovyDsl == expectedGroovyDsl + new GroovyShell(this.class.classLoader).evaluate( + """ io.coderate.accurest.dsl.GroovyDsl.make { + $groovyDsl + }""") == expectedGroovyDsl } } diff --git a/accurest-core/src/main/groovy/io/coderate/accurest/dsl/BaseWiremockStubStrategy.groovy b/accurest-core/src/main/groovy/io/coderate/accurest/dsl/BaseWiremockStubStrategy.groovy index 3925ada9f3..e02c2a62ce 100644 --- a/accurest-core/src/main/groovy/io/coderate/accurest/dsl/BaseWiremockStubStrategy.groovy +++ b/accurest-core/src/main/groovy/io/coderate/accurest/dsl/BaseWiremockStubStrategy.groovy @@ -12,7 +12,7 @@ abstract class BaseWiremockStubStrategy { } return withAssertionHeaders(headers) { Map.Entry entry -> [(entry.key): buildClientHeaderFromValuePattern(entry.value)] - } << headers?.valueHeaders() + } << headers.valueHeaders() } protected Map buildServerHeadersSection(Headers headers) { 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 9ea3348dbd..225d5dce52 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 @@ -8,7 +8,7 @@ import io.coderate.accurest.dsl.internal.Response @TypeChecked @EqualsAndHashCode(includeFields = true) -@ToString(includePackage = false) +@ToString(includeFields = true, includePackage = false) class GroovyDsl { Request request @@ -32,4 +32,5 @@ class GroovyDsl { closure.delegate = response 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 index 5487b10b53..f2b5a5649b 100644 --- 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 @@ -4,7 +4,7 @@ import groovy.transform.EqualsAndHashCode import groovy.transform.ToString @EqualsAndHashCode(includeFields = true) -@ToString(includePackage = false) +@ToString(includePackage = false, includeFields = true, ignoreNulls = true) class Headers { private Map assertionHeaders = [:] @@ -28,4 +28,5 @@ class Headers { Set> assertionEntries() { return Collections.unmodifiableSet(assertionHeaders.entrySet()) } + }