This commit is contained in:
Olga Maciaszek-Sharma
2015-07-29 12:44:34 +02:00
11 changed files with 172 additions and 102 deletions

View File

@@ -33,7 +33,7 @@ class RecursiveFilesConverter {
File newGroovyFile = createTargetFileWithProperName(absoluteTargetPath, sourceFile)
newGroovyFile.text = convertedContent
} catch (Exception e) {
throw new ConversionAccurestException("Unable to convertion of ${sourceFile.name}", e)
throw new ConversionAccurestException("Unable to make convertion of ${sourceFile.name}", e)
}
}
}

View File

@@ -1,6 +1,8 @@
package io.codearte.accurest.wiremock
import groovy.io.FileType
import groovy.json.JsonOutput
import groovy.json.JsonParserType
import groovy.json.JsonSlurper
import groovy.xml.XmlUtil
import io.codearte.accurest.dsl.GroovyDsl
@@ -14,7 +16,7 @@ class WireMockToDslConverter {
}
private String convertFromWireMockStub(String wireMockStringStub) {
Object wireMockStub = new JsonSlurper().parseText(wireMockStringStub)
Object wireMockStub = parseStubDefinition(wireMockStringStub)
def request = wireMockStub.request
def response = wireMockStub.response
def bodyPatterns = request.bodyPatterns
@@ -55,6 +57,10 @@ class WireMockToDslConverter {
"""
}
private Object parseStubDefinition(String wireMockStringStub) {
new JsonSlurper().setType(JsonParserType.LAX).parseText(wireMockStringStub)
}
private String buildHeader(String method, Object value) {
switch (method) {
case 'equalTo':

View File

@@ -24,7 +24,7 @@ class WireMockToDslConverterSpec extends Specification {
},
"response": {
"status": 200,
"body": "{ \\"id\\": { \\"value\\": \\"132\\" }, \\"surname\\": \\"Kowalsky\\", \\"name\\": \\"Jan\\", \\"created\\": \\"2014-02-02 12:23:43\\" }",
"body": '{"id": { "value": "132" }, "surname": "Kowalsky", "name": "Jan", "created": "2014-02-02 12:23:43" }',
"headers": {
"Content-Type": "text/plain"
}
@@ -74,7 +74,7 @@ class WireMockToDslConverterSpec extends Specification {
}
def 'should convert WireMock stub with response body containing simple JSON'() {
def 'should convert WireMock stub with response body containing JSON with escaped double quotes'() {
given:
String wireMockStub = '''\
{
@@ -193,7 +193,7 @@ class WireMockToDslConverterSpec extends Specification {
},
"response": {
"status": 200,
"body": "[ {\\"a\\":1, \\"c\\":\\"3\\"}, \\"b\\", \\"a\\" ]",
"body": '[ {"a":1, "c":"3"}, "b", "a" ]',
"headers": {
"Content-Type": "application/json"
}
@@ -232,7 +232,6 @@ class WireMockToDslConverterSpec extends Specification {
}""") == expectedGroovyDsl
}
def 'should convert WireMock stub with response body containing a nested list'() {
given:
String wireMockStub = '''\
@@ -248,7 +247,7 @@ class WireMockToDslConverterSpec extends Specification {
},
"response": {
"status": 200,
"body":"[{\\"amount\\":1.01,\\"name\\":\\"Name\\",\\"info\\":{\\"title\\":\\"title1\\",\\"payload\\":null},\\"booleanvalue\\":true,\\"user\\":null},{\\"amount\\":2.01,\\"name\\":\\"Name2\\",\\"info\\":{\\"title\\":\\"title2\\",\\"payload\\":null},\\"booleanvalue\\":true,\\"user\\":null}]"
"body": '[{"amount":1.01, "name":"Name", "info":{"title":"title1", "payload":null}, "booleanvalue":true, "user":null}, {"amount":2.01, "name":"Name2", "info":{"title":"title2", "payload":null}, "booleanvalue":true, "user":null}]'
}
}
'''
@@ -306,7 +305,7 @@ class WireMockToDslConverterSpec extends Specification {
"method": "POST",
"url": "/test",
"bodyPatterns": [{
"equalTo": "{\\"property1\\":\\"abc\\",\\"property2\\":\\"2017-01\\",\\"property3\\":\\"666\\",\\"property4\\":1428566412}"
"equalTo": '{"property1":"abc", "property2":"2017-01", "property3":"666", "property4":1428566412}'
}]
},
"response": {
@@ -386,7 +385,7 @@ class WireMockToDslConverterSpec extends Specification {
"url" : "/test",
"method" : "POST",
"bodyPatterns" : [ {
"equalToJson" : "{\\"pan\\":\\"4855141150107894\\",\\"expirationDate\\":\\"2017-01\\",\\"dcvx\\":\\"178\\"}",
"equalToJson" : '{"pan":"4855141150107894", "expirationDate":"2017-01", "dcvx":"178"}',
"jsonCompareMode" : "LENIENT"
} ]
},
@@ -427,7 +426,7 @@ class WireMockToDslConverterSpec extends Specification {
"url" : "/test",
"method" : "POST",
"bodyPatterns" : [ {
"equalTo" : "{\\"pan\\":\\"4855141150107894\\",\\"expirationDate\\":\\"2017-01\\",\\"dcvx\\":\\"178\\"}"
"equalTo" : '{"pan":"4855141150107894", "expirationDate":"2017-01", "dcvx":"178"}'
} ]
},
"response" : {
@@ -502,5 +501,4 @@ class WireMockToDslConverterSpec extends Specification {
void stubMappingIsValidWireMockStub(String mappingDefinition) {
StubMapping.buildFrom(mappingDefinition)
}
}

View File

@@ -81,8 +81,10 @@ class SpockMethodBodyBuilder {
addLine('def responseBody = new JsonSlurper().parseText(response.body.asString())')
if (responseBody instanceof List) {
processArrayElements(responseBody, "", blockBuilder)
} else {
} else if (responseBody instanceof Map) {
processMapElement(responseBody, blockBuilder, "")
} else {
processBodyElement(blockBuilder, '', responseBody)
}
} else if (contentType == ContentType.XML) {
addLine('def responseBody = new XmlSlurper().parseText(response.body.asString())')

View File

@@ -34,6 +34,9 @@ class ContentUtils {
* @return JSON structure with replaced client / server side parts
*/
public static Object extractValue(GString bodyAsValue, ContentType contentType, Closure valueProvider) {
if (bodyAsValue.isEmpty()){
return bodyAsValue
}
if (contentType == ContentType.JSON) {
return extractValueForJSON(bodyAsValue, valueProvider)
}
@@ -164,6 +167,9 @@ class ContentUtils {
}
public static boolean isJsonType(GString gstring) {
if (gstring.isEmpty()) {
return false
}
GString stringWithoutValues = new GStringImpl(
gstring.values.collect({
it instanceof String || it instanceof GString ? it.toString() : escapeJson(it.toString())

View File

@@ -286,5 +286,24 @@ class SpockMethodBuilderSpec extends Specification {
spockTest.contains('responseBody.property2 == "b"')
}
def "should generate test for empty body"() {
given:
GroovyDsl contractDsl = GroovyDsl.make {
request {
method('POST')
url("/ws/payments")
body("")
}
response {
status 406
}
}
SpockMethodBodyBuilder builder = new SpockMethodBodyBuilder(contractDsl)
BlockBuilder blockBuilder = new BlockBuilder(" ")
when:
builder.appendTo(blockBuilder)
def spockTest = blockBuilder.toString()
then:
spockTest.contains(".body('')")
}
}

View File

@@ -111,7 +111,11 @@ class WireMockGroovyDslSpec extends WireMockSpec {
headers {
header("Content-Type": 'application/x-www-form-urlencoded')
}
body("""paymentType=INCOMING&transferType=BANK&amount=${value(client(regex('[0-9]{3}\\.[0-9]{2}')), server(500.00))}&bookingDate=${value(client(regex('[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])')), server('2015-05-18'))}""")
body("""paymentType=INCOMING&transferType=BANK&amount=${
value(client(regex('[0-9]{3}\\.[0-9]{2}')), server(500.00))
}&bookingDate=${
value(client(regex('[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])')), server('2015-05-18'))
}""")
}
response {
status 204
@@ -290,7 +294,7 @@ class WireMockGroovyDslSpec extends WireMockSpec {
}
''')
and:
stubMappingIsValidWireMockStub(wireMockStub)
stubMappingIsValidWireMockStub(wireMockStub)
}
def 'should use equalToJson when content type ends with json'() {
@@ -349,7 +353,9 @@ class WireMockGroovyDslSpec extends WireMockSpec {
headers {
header "Content-Type", "customtype/xml"
}
body """<name>${value(client('Jozo'), server('Denis'))}</name><jobId>${value(client("<test>"), server('1234567890'))}</jobId>"""
body """<name>${value(client('Jozo'), server('Denis'))}</name><jobId>${
value(client("<test>"), server('1234567890'))
}</jobId>"""
}
response {
status 200
@@ -389,7 +395,9 @@ class WireMockGroovyDslSpec extends WireMockSpec {
request {
method 'GET'
url "/users"
body """<user><name>${value(client('Jozo'), server('Denis'))}</name><jobId>${value(client("<test>"), server('1234567890'))}</jobId></user>"""
body """<user><name>${value(client('Jozo'), server('Denis'))}</name><jobId>${
value(client("<test>"), server('1234567890'))
}</jobId></user>"""
}
response {
status 200
@@ -427,7 +435,9 @@ class WireMockGroovyDslSpec extends WireMockSpec {
}
response {
status 200
body """<user><name>${value(client('Jozo'), server('Denis'))}</name><jobId>${value(client("<test>"), server('1234567890'))}</jobId></user>"""
body """<user><name>${value(client('Jozo'), server('Denis'))}</name><jobId>${
value(client("<test>"), server('1234567890'))
}</jobId></user>"""
}
}
when:
@@ -490,7 +500,9 @@ class WireMockGroovyDslSpec extends WireMockSpec {
request {
method 'GET'
url "/users"
body equalToXml("""<name>${value(client('Jozo'), server('Denis'))}</name><jobId>${value(client("<test>"), server('1234567890'))}</jobId>""")
body equalToXml("""<name>${value(client('Jozo'), server('Denis'))}</name><jobId>${
value(client("<test>"), server('1234567890'))
}</jobId>""")
}
response {
status 200
@@ -522,28 +534,28 @@ class WireMockGroovyDslSpec extends WireMockSpec {
def 'should convert groovy dsl stub with regexp Body as String to wireMock stub for the client side'() {
given:
GroovyDsl groovyDsl = GroovyDsl.make {
request {
method('GET')
url $(client(regex('/[0-9]{2}')), server('/12'))
body """
request {
method('GET')
url $(client(regex('/[0-9]{2}')), server('/12'))
body """
{
"personalId": "${value(client(regex('^[0-9]{11}$')), server('57593728525'))}"
}
"""
}
response {
status 200
body("""\
}
response {
status 200
body("""\
{
"name": "Jan"
}
"""
)
headers {
header 'Content-Type': 'text/plain'
)
headers {
header 'Content-Type': 'text/plain'
}
}
}
}
when:
String wireMockStub = new WireMockStubStrategy(groovyDsl).toWireMockClientStub()
then:
@@ -827,43 +839,43 @@ class WireMockGroovyDslSpec extends WireMockSpec {
def "should not allow regexp in query parameter for server value"() {
when:
GroovyDsl.make {
request {
method 'GET'
url("abc") {
queryParameters {
parameter 'age': $(client(notMatching("^\\w*\$")), server(regex(".*")))
}
}
}
response {
status 200
}
}
GroovyDsl.make {
request {
method 'GET'
url("abc") {
queryParameters {
parameter 'age': $(client(notMatching("^\\w*\$")), server(regex(".*")))
}
}
}
response {
status 200
}
}
then:
def e = thrown(IllegalStateException)
e.message.contains "Query parameter 'age' can't be a pattern for the server side"
def e = thrown(IllegalStateException)
e.message.contains "Query parameter 'age' can't be a pattern for the server side"
}
def "should not allow query parameter unresolvable for a server value"() {
when:
GroovyDsl.make {
request {
method 'GET'
urlPath("users") {
queryParameters {
parameter 'age': notMatching("^\\w*\$")
parameter 'name': matching("Denis.*")
}
}
}
response {
status 200
}
}
GroovyDsl.make {
request {
method 'GET'
urlPath("users") {
queryParameters {
parameter 'age': notMatching("^\\w*\$")
parameter 'name': matching("Denis.*")
}
}
}
response {
status 200
}
}
then:
def e = thrown(IllegalStateException)
e.message.contains "Query parameter 'age' can't be of a matching type: NOT_MATCHING for the server side"
def e = thrown(IllegalStateException)
e.message.contains "Query parameter 'age' can't be of a matching type: NOT_MATCHING for the server side"
}
def "should not allow query parameter with a different absent variation for server/client"() {
@@ -874,45 +886,45 @@ class WireMockGroovyDslSpec extends WireMockSpec {
e.message.contains "Absent cannot only be used only on one side"
where:
dsl << [
{
request {
method 'GET'
urlPath("users") {
queryParameters {
parameter 'name': $(client(absent()), server(""))
{
request {
method 'GET'
urlPath("users") {
queryParameters {
parameter 'name': $(client(absent()), server(""))
}
}
}
}
response {
status 200
}
},
{
request {
method 'GET'
urlPath("users") {
queryParameters {
parameter 'name': $(client(""), server(absent()))
response {
status 200
}
},
{
request {
method 'GET'
urlPath("users") {
queryParameters {
parameter 'name': $(client(""), server(absent()))
}
}
}
}
response {
status 200
}
},
{
request {
method 'GET'
urlPath("users") {
queryParameters {
parameter 'name': $(client(absent()), server(matching("abc")))
response {
status 200
}
},
{
request {
method 'GET'
urlPath("users") {
queryParameters {
parameter 'name': $(client(absent()), server(matching("abc")))
}
}
}
response {
status 200
}
}
response {
status 200
}
}
]
}
@@ -1107,6 +1119,39 @@ class WireMockGroovyDslSpec extends WireMockSpec {
''')
}
def "should generate stub for empty body"() {
given:
GroovyDsl groovyDsl = GroovyDsl.make {
request {
method('POST')
url("test")
body("")
}
response {
status 406
}
}
when:
def json = toWireMockClientJsonStub(groovyDsl)
then:
parseJson(json) == parseJson('''
{
"request": {
"method": "POST",
"url": "test",
"bodyPatterns": [
{
"equalTo": ""
}
]
},
"response": {
"status": 406
}
}
''')
}
String toJsonString(value) {
new JsonBuilder(value).toPrettyString()
}

View File

@@ -2,9 +2,6 @@ buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath "io.codearte.accurest:accurest-gradle-plugin:$accurestVersion"
}
}
apply plugin: 'groovy'
@@ -49,7 +46,6 @@ dependencies {
testCompile "org.spockframework:spock-spring:0.7-groovy-2.0"
testCompile "com.jayway.restassured:rest-assured:$restAssuredVersion"
testCompile "com.jayway.restassured:spring-mock-mvc:$restAssuredVersion"
testCompile "io.codearte.accurest:accurest-core:$accurestVersion"
testCompile "javax.servlet:javax.servlet-api:3.0.1" //provided
testCompile "ch.qos.logback:logback-classic:1.1.2"
}

View File

@@ -1,5 +1,4 @@
groupId=com.ofg
jacksonMapper=1.9.13
restAssuredVersion=2.4.0
accurestVersion=0.4.1
springVersion=4.1.4.RELEASE

View File

@@ -5,7 +5,6 @@ buildscript {
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:1.2.1.RELEASE")
classpath 'io.codearte.accurest:accurest-gradle-plugin:0.6.2'
}
}

View File

@@ -91,7 +91,7 @@ project(':accurest-core') {
compile 'org.apache.commons:commons-lang3:[3.3,)'
testCompile 'cglib:cglib-nodep:2.2'
testCompile 'org.objenesis:objenesis:2.1'
testCompile 'com.github.tomakehurst:wiremock:1.53'
testCompile 'com.github.tomakehurst:wiremock:1.57'
}
}
@@ -101,7 +101,7 @@ project(':accurest-converters') {
compile 'org.apache.commons:commons-lang3:[3.0,)'
compile 'commons-io:commons-io:[2.0,)'
compile 'dk.brics.automaton:automaton:1.11-8' // needed for Xeger
testCompile 'com.github.tomakehurst:wiremock:1.53'
testCompile 'com.github.tomakehurst:wiremock:1.57'
testCompile 'org.hamcrest:hamcrest-all:1.3'
}
}