From 71adb9f1ff249cb6ae131dbf6c120a76d1566f56 Mon Sep 17 00:00:00 2001 From: Olga Maciaszek-Sharma Date: Sun, 21 Feb 2016 18:55:13 +0100 Subject: [PATCH] Fixed multipart support in JUnit tests. --- .../builder/JUnitMethodBodyBuilder.groovy | 25 +++++++++++++------ .../accurest/builder/MethodBodyBuilder.groovy | 19 +++++++++++--- .../builder/SpockMethodBodyBuilder.groovy | 20 ++++++++------- .../accurest/util/ContentUtils.groovy | 8 +++++- .../MockMvcJunitMethodBuilderSpec.groovy | 13 +++------- .../MockMvcSpockMethodBuilderSpec.groovy | 2 +- 6 files changed, 55 insertions(+), 32 deletions(-) diff --git a/accurest-core/src/main/groovy/io/codearte/accurest/builder/JUnitMethodBodyBuilder.groovy b/accurest-core/src/main/groovy/io/codearte/accurest/builder/JUnitMethodBodyBuilder.groovy index d3365490d0..c5f33b921a 100644 --- a/accurest-core/src/main/groovy/io/codearte/accurest/builder/JUnitMethodBodyBuilder.groovy +++ b/accurest-core/src/main/groovy/io/codearte/accurest/builder/JUnitMethodBodyBuilder.groovy @@ -6,8 +6,12 @@ import groovy.transform.TypeChecked import io.codearte.accurest.dsl.GroovyDsl import io.codearte.accurest.dsl.internal.ExecutionProperty import io.codearte.accurest.dsl.internal.Header +import io.codearte.accurest.dsl.internal.NamedProperty import io.codearte.accurest.dsl.internal.Request +import static groovy.json.StringEscapeUtils.escapeJava +import static io.codearte.accurest.util.ContentUtils.getJavaMultipartFileParameterContent + /** * @author Jakub Kubrynski * @author Olga Maciaszek-Sharma @@ -41,11 +45,6 @@ abstract class JUnitMethodBodyBuilder extends MethodBodyBuilder { return "assertThat(responseBody${property}).isEqualTo(\"${value}\");" } - @Override - protected String getMultipartParameterLine(Map.Entry parameter) { - return null //TODO - } - @Override protected void processBodyElement(BlockBuilder blockBuilder, String property, ExecutionProperty exec) { blockBuilder.addLine("${exec.insertValue("parsedJson.read(\"\\\$$property\")")};") @@ -59,7 +58,7 @@ abstract class JUnitMethodBodyBuilder extends MethodBodyBuilder { @Override protected String convertUnicodeEscapesIfRequired(String json) { String unescapedJson = StringEscapeUtils.unescapeJavaScript(json) - return StringEscapeUtils.escapeJava(unescapedJson) + return escapeJava(unescapedJson) } @Override @@ -68,10 +67,10 @@ abstract class JUnitMethodBodyBuilder extends MethodBodyBuilder { } private String getMapKeyReferenceString(Map.Entry entry) { - if (entry.value instanceof ExecutionProperty){ + if (entry.value instanceof ExecutionProperty) { return "." + entry.key } - return """.get(\\\"$entry.key\\\")""" + return """.get(\\\"$entry.key\\\")""" } @Override @@ -103,4 +102,14 @@ abstract class JUnitMethodBodyBuilder extends MethodBodyBuilder { protected String getBodyString(String bodyAsString) { return ".body(\"$bodyAsString\")" } + + @Override + protected String getMultipartFileParameterContent(String propertyName, NamedProperty propertyValue) { + return getJavaMultipartFileParameterContent(propertyName, propertyValue) + } + + @Override + protected String getParameterString(Map.Entry parameter) { + return """.param("${escapeJava(parameter.key)}", "${escapeJava(parameter.value as String)}")""" + } } diff --git a/accurest-core/src/main/groovy/io/codearte/accurest/builder/MethodBodyBuilder.groovy b/accurest-core/src/main/groovy/io/codearte/accurest/builder/MethodBodyBuilder.groovy index 1702962476..a795923e0e 100644 --- a/accurest-core/src/main/groovy/io/codearte/accurest/builder/MethodBodyBuilder.groovy +++ b/accurest-core/src/main/groovy/io/codearte/accurest/builder/MethodBodyBuilder.groovy @@ -9,6 +9,7 @@ import io.codearte.accurest.dsl.internal.DslProperty import io.codearte.accurest.dsl.internal.ExecutionProperty import io.codearte.accurest.dsl.internal.Header import io.codearte.accurest.dsl.internal.MatchingStrategy +import io.codearte.accurest.dsl.internal.NamedProperty import io.codearte.accurest.dsl.internal.QueryParameter import io.codearte.accurest.dsl.internal.Request import io.codearte.accurest.dsl.internal.Response @@ -19,6 +20,7 @@ import io.codearte.accurest.util.JsonToJsonPathsConverter import io.codearte.accurest.util.MapConverter import static io.codearte.accurest.util.ContentUtils.extractValue +import static io.codearte.accurest.util.ContentUtils.getGroovyMultipartFileParameterContent import static io.codearte.accurest.util.ContentUtils.recognizeContentTypeFromContent import static io.codearte.accurest.util.ContentUtils.recognizeContentTypeFromHeader @@ -50,8 +52,6 @@ abstract class MethodBodyBuilder { protected abstract String getResponseBodyPropertyComparisonString(String property, String value) - protected abstract String getMultipartParameterLine(Map.Entry parameter) - protected abstract void processBodyElement(BlockBuilder blockBuilder, String property, ExecutionProperty exec) protected abstract void processBodyElement(BlockBuilder blockBuilder, String property, Map.Entry entry) @@ -72,6 +72,10 @@ abstract class MethodBodyBuilder { protected abstract String getBodyString(String bodyAsString) + protected abstract String getMultipartFileParameterContent(String propertyName, NamedProperty propertyValue) + + protected abstract String getParameterString(Map.Entry parameter) + void appendTo(BlockBuilder blockBuilder) { blockBuilder.startBlock() @@ -126,7 +130,8 @@ abstract class MethodBodyBuilder { String url = buildUrl(request) String method = request.method.serverValue.toString().toLowerCase() - bb.addLine(/.${method}("$url");/) + bb.addLine(/.${method}("$url")/) + addColonIfRequired(bb) bb.unindent() } @@ -275,7 +280,6 @@ abstract class MethodBodyBuilder { throw new IllegalStateException("URL is not set!") } - @TypeChecked(TypeCheckingMode.SKIP) protected String buildUrlFromUrlPath(Url url) { if (hasQueryParams(url)) { @@ -290,6 +294,13 @@ abstract class MethodBodyBuilder { return MapConverter.getTestSideValues(url.serverValue) } + protected String getMultipartParameterLine(Map.Entry parameter) { + if (parameter.value instanceof NamedProperty) { + return ".multiPart(${getMultipartFileParameterContent(parameter.key, (NamedProperty) parameter.value)})" + } + return getParameterString(parameter) + } + private boolean hasQueryParams(Url url) { return url.queryParameters diff --git a/accurest-core/src/main/groovy/io/codearte/accurest/builder/SpockMethodBodyBuilder.groovy b/accurest-core/src/main/groovy/io/codearte/accurest/builder/SpockMethodBodyBuilder.groovy index b61807f689..55dba94b57 100644 --- a/accurest-core/src/main/groovy/io/codearte/accurest/builder/SpockMethodBodyBuilder.groovy +++ b/accurest-core/src/main/groovy/io/codearte/accurest/builder/SpockMethodBodyBuilder.groovy @@ -9,7 +9,7 @@ import io.codearte.accurest.dsl.internal.Header import io.codearte.accurest.dsl.internal.NamedProperty import io.codearte.accurest.dsl.internal.Request -import static io.codearte.accurest.util.ContentUtils.getMultipartFileParameterContent +import static io.codearte.accurest.util.ContentUtils.getGroovyMultipartFileParameterContent /** * @author Jakub Kubrynski @@ -27,14 +27,6 @@ abstract class SpockMethodBodyBuilder extends MethodBodyBuilder { return "responseBody$property == \"${value}\"" } - @Override - protected String getMultipartParameterLine(Map.Entry parameter) { - if (parameter.value instanceof NamedProperty) { - return ".multiPart(${getMultipartFileParameterContent(parameter.key, (NamedProperty) parameter.value)})" - } - return ".param('$parameter.key', '$parameter.value')" - } - @Override protected void processBodyElement(BlockBuilder blockBuilder, String property, ExecutionProperty exec) { blockBuilder.addLine("${exec.insertValue("parsedJson.read('\\\$$property')")}") @@ -95,4 +87,14 @@ abstract class SpockMethodBodyBuilder extends MethodBodyBuilder { return ".body('''$bodyAsString''')" } + @Override + protected String getMultipartFileParameterContent(String propertyName, NamedProperty propertyValue) { + return getGroovyMultipartFileParameterContent(propertyName, propertyValue) + } + + @Override + protected String getParameterString(Map.Entry parameter) { + return ".param('$parameter.key', '$parameter.value')" + } + } diff --git a/accurest-core/src/main/groovy/io/codearte/accurest/util/ContentUtils.groovy b/accurest-core/src/main/groovy/io/codearte/accurest/util/ContentUtils.groovy index e73990d9f4..87e93b4e9e 100644 --- a/accurest-core/src/main/groovy/io/codearte/accurest/util/ContentUtils.groovy +++ b/accurest-core/src/main/groovy/io/codearte/accurest/util/ContentUtils.groovy @@ -15,6 +15,7 @@ import org.codehaus.groovy.runtime.GStringImpl import java.util.regex.Matcher import java.util.regex.Pattern +import static org.apache.commons.lang3.StringEscapeUtils.escapeJava import static org.apache.commons.lang3.StringEscapeUtils.escapeJson import static org.apache.commons.lang3.StringEscapeUtils.escapeXml11 @@ -321,8 +322,13 @@ class ContentUtils { return ContentType.UNKNOWN } - static String getMultipartFileParameterContent(String propertyName, NamedProperty propertyValue) { + static String getGroovyMultipartFileParameterContent(String propertyName, NamedProperty propertyValue) { return "'$propertyName', '$propertyValue.name.serverValue', '$propertyValue.value.serverValue'.bytes" } + static String getJavaMultipartFileParameterContent(String propertyName, NamedProperty propertyValue) { + return """"${escapeJava(propertyName)}", "${escapeJava(propertyValue.name.serverValue as String)}", "${escapeJava(propertyValue.value.serverValue as String)}".getBytes()""" + } + + } diff --git a/accurest-core/src/test/groovy/io/codearte/accurest/builder/MockMvcJunitMethodBuilderSpec.groovy b/accurest-core/src/test/groovy/io/codearte/accurest/builder/MockMvcJunitMethodBuilderSpec.groovy index 0fa9e420f0..91c5ffb18f 100644 --- a/accurest-core/src/test/groovy/io/codearte/accurest/builder/MockMvcJunitMethodBuilderSpec.groovy +++ b/accurest-core/src/test/groovy/io/codearte/accurest/builder/MockMvcJunitMethodBuilderSpec.groovy @@ -4,7 +4,6 @@ import io.codearte.accurest.dsl.GroovyDsl import io.codearte.accurest.dsl.WireMockStubStrategy import io.codearte.accurest.dsl.WireMockStubVerifier import io.codearte.accurest.file.Contract -import spock.lang.Ignore import spock.lang.Issue import spock.lang.Specification import spock.lang.Unroll @@ -904,8 +903,6 @@ World.'''""") } @Issue('180') - @Ignore - //TODO: fix multiparts in JUnit def "should generate proper test code when having multipart parameters"() { given: GroovyDsl contractDsl = GroovyDsl.make { @@ -931,15 +928,13 @@ World.'''""") builder.given(blockBuilder) def jUnitTest = blockBuilder.toString() then: - jUnitTest.contains("""'content-type', 'multipart/form-data;boundary=AaB03x'""") - jUnitTest.contains(""".param('formParameter', '"formParameterValue"'""") - jUnitTest.contains(""".param('someBooleanParameter', 'true')""") - jUnitTest.contains(""".multiPart('file', 'filename.csv', 'file content'.bytes)""") + jUnitTest.contains('"content-type", "multipart/form-data;boundary=AaB03x"') + jUnitTest.contains('.param("formParameter", "\\"formParameterValue\\"")') + jUnitTest.contains('.param("someBooleanParameter", "true")') + jUnitTest.contains('.multiPart("file", "filename.csv", "file content".getBytes());') } @Issue('180') - //TODO: fix multiparts in JUnit - @Ignore def "should generate proper test code when having multipart parameters with named as map"() { given: GroovyDsl contractDsl = GroovyDsl.make { diff --git a/accurest-core/src/test/groovy/io/codearte/accurest/builder/MockMvcSpockMethodBuilderSpec.groovy b/accurest-core/src/test/groovy/io/codearte/accurest/builder/MockMvcSpockMethodBuilderSpec.groovy index c88781b155..3b7df919f0 100644 --- a/accurest-core/src/test/groovy/io/codearte/accurest/builder/MockMvcSpockMethodBuilderSpec.groovy +++ b/accurest-core/src/test/groovy/io/codearte/accurest/builder/MockMvcSpockMethodBuilderSpec.groovy @@ -922,7 +922,7 @@ World.'''""") MockMvcSpockMethodBodyBuilder builder = new MockMvcSpockMethodBodyBuilder(contractDsl) BlockBuilder blockBuilder = new BlockBuilder(" ") when: - builder.given(blockBuilder) + builder.appendTo(blockBuilder) def spockTest = blockBuilder.toString() then: spockTest.contains("""'content-type', 'multipart/form-data;boundary=AaB03x'""")