diff --git a/pom.xml b/pom.xml index 76c45c3fb3..18562cbc40 100644 --- a/pom.xml +++ b/pom.xml @@ -31,6 +31,18 @@ 2.4.0 test + + org.spockframework + spock-core + 0.7-groovy-2.0 + test + + + + com.github.tomakehurst + wiremock + 1.53 + diff --git a/src/main/groovy/eu/coderate/accurest/TestGenerator.groovy b/src/main/groovy/eu/coderate/accurest/TestGenerator.groovy index e44342920e..d7427db151 100644 --- a/src/main/groovy/eu/coderate/accurest/TestGenerator.groovy +++ b/src/main/groovy/eu/coderate/accurest/TestGenerator.groovy @@ -1,6 +1,7 @@ package eu.coderate.accurest import eu.coderate.accurest.builder.ClassBuilder +import eu.coderate.accurest.builder.Lang import eu.coderate.accurest.util.NamesUtil import static eu.coderate.accurest.builder.ClassBuilder.createClass @@ -15,12 +16,18 @@ class TestGenerator { private final String basePackageForTests private final String baseClassForTests private final String ruleClassForTests + private final Lang lang - TestGenerator(String mocksBaseDirectory, String basePackageForTests, String baseClassForTests, String ruleClassForTests) { + TestGenerator(String mocksBaseDirectory, String basePackageForTests, String baseClassForTests, String ruleClassForTests, Lang lang) { this.mocksBaseDirectory = getClass().getClassLoader().getResource(mocksBaseDirectory).path this.basePackageForTests = basePackageForTests - this.baseClassForTests = baseClassForTests + if (lang == Lang.GROOVY && !baseClassForTests) { + this.baseClassForTests = 'spock.lang.Specification' + } else { + this.baseClassForTests = baseClassForTests + } this.ruleClassForTests = ruleClassForTests + this.lang = lang } public String generate() { @@ -42,20 +49,26 @@ class TestGenerator { } private String addClass(File directory) { - ClassBuilder clazz = createClass(NamesUtil.capitalize(NamesUtil.afterLast(directory.path, '/')), basePackageForTests, baseClassForTests) - .addImport('org.junit.Test') - .addImport('org.junit.Rule') - .addStaticImport('org.hamcrest.Matchers.*') + ClassBuilder clazz = createClass(NamesUtil.capitalize(NamesUtil.afterLast(directory.path, '/')), basePackageForTests, baseClassForTests, lang) .addStaticImport('com.jayway.restassured.RestAssured.*') - .addStaticImport('com.jayway.restassured.matcher.RestAssuredMatchers.*') - .addRule('com.test.MyRule') + .addImport('java.util.regex.Pattern') + + if (lang == Lang.JAVA) { + clazz.addImport('org.junit.Test') + } + + if (ruleClassForTests) { + clazz.addImport('org.junit.Rule') + .addRule(ruleClassForTests) + } + directory.listFiles().each { - clazz.addMethod(createTestMethod(it)) + clazz.addMethod(createTestMethod(it, lang)) } return clazz.build() } public static void main(String[] args) { - print new TestGenerator("", 'io.test', 'com.test.BaseClass', "").generate() + print new TestGenerator('stubs', 'io.test', '', '', Lang.GROOVY).generate() } } \ No newline at end of file diff --git a/src/main/groovy/eu/coderate/accurest/builder/ClassBuilder.groovy b/src/main/groovy/eu/coderate/accurest/builder/ClassBuilder.groovy index 32296dd222..b893cbb5a6 100644 --- a/src/main/groovy/eu/coderate/accurest/builder/ClassBuilder.groovy +++ b/src/main/groovy/eu/coderate/accurest/builder/ClassBuilder.groovy @@ -14,22 +14,33 @@ class ClassBuilder { private final List staticImports = [] private final List rules = [] private final List methods = [] + private final String modifier + private final String suffix - private ClassBuilder(String className, String packageName, String baseClass) { + private ClassBuilder(String className, String packageName, String baseClass, Lang lang) { if (baseClass) { imports << baseClass } this.baseClass = NamesUtil.afterLastDot(baseClass) this.packageName = packageName this.className = className + switch (lang) { + case Lang.JAVA: + modifier = "public " + suffix = ";" + break + case Lang.GROOVY: + modifier = "" + suffix = "" + } } - static ClassBuilder createClass(String className, String packageName) { - return createClass(className, packageName, null) + static ClassBuilder createClass(String className, String packageName, Lang lang) { + return createClass(className, packageName, null, lang) } - static ClassBuilder createClass(String className, String packageName, String baseClass) { - return new ClassBuilder(className, packageName, baseClass) + static ClassBuilder createClass(String className, String packageName, String baseClass, Lang lang) { + return new ClassBuilder(className, packageName, baseClass, lang) } ClassBuilder addImport(String importToAdd) { @@ -54,21 +65,25 @@ class ClassBuilder { } String build() { - BlockBuilder clazz = new BlockBuilder(" ") - .addLine("package $packageName;") + BlockBuilder clazz = new BlockBuilder("\t") + .addLine("package $packageName" + suffix) .addEmptyLine() imports.sort().each { - clazz.addLine("import $it;") + clazz.addLine("import $it" + suffix) + } + if (!imports.empty) { + clazz.addEmptyLine() } - clazz.addEmptyLine() staticImports.sort().each { - clazz.addLine("static import $it;") + clazz.addLine("import static $it" + suffix) + } + if (!staticImports.empty) { + clazz.addEmptyLine() } - clazz.addEmptyLine() - def classLine = "public class $className" + def classLine = modifier + "class $className" if (baseClass) { classLine += " extends $baseClass" } @@ -78,10 +93,12 @@ class ClassBuilder { clazz.startBlock() rules.sort().each { clazz.addLine("@Rule") - clazz.addLine("public " + it + " " + NamesUtil.uncapitalize(it) + " = new $it();") + clazz.addLine("public " + it + " " + NamesUtil.uncapitalize(it) + " = new $it()" + suffix) } clazz.endBlock() - clazz.addEmptyLine() + if (!rules.empty) { + clazz.addEmptyLine() + } methods.each { clazz.addBlock(it) diff --git a/src/main/groovy/eu/coderate/accurest/builder/JavaMethodBodyBuilder.groovy b/src/main/groovy/eu/coderate/accurest/builder/JavaMethodBodyBuilder.groovy new file mode 100644 index 0000000000..c8a54548ce --- /dev/null +++ b/src/main/groovy/eu/coderate/accurest/builder/JavaMethodBodyBuilder.groovy @@ -0,0 +1,18 @@ +package eu.coderate.accurest.builder + +/** + * @author Jakub Kubrynski + */ +class JavaMethodBodyBuilder { +/* + given() + .contentType("application/json") + .header("Accept", "application/json") + .body("{'name': 'MyApp', 'description' : 'awesome app'}".replaceAll("'", "\"")). + + expect() + .statusCode(200).body("id", is(not(nullValue()))). + + when() + .post(root.toString() + "rest/applications").asString();*/ +} diff --git a/src/main/groovy/eu/coderate/accurest/builder/Lang.groovy b/src/main/groovy/eu/coderate/accurest/builder/Lang.groovy new file mode 100644 index 0000000000..dd7f7b07ee --- /dev/null +++ b/src/main/groovy/eu/coderate/accurest/builder/Lang.groovy @@ -0,0 +1,10 @@ +package eu.coderate.accurest.builder + +/** + * @author Jakub Kubrynski + */ +enum Lang { + + JAVA, GROOVY + +} \ No newline at end of file diff --git a/src/main/groovy/eu/coderate/accurest/builder/MethodBodyBuilder.groovy b/src/main/groovy/eu/coderate/accurest/builder/MethodBodyBuilder.groovy deleted file mode 100644 index 17c6a5cc3d..0000000000 --- a/src/main/groovy/eu/coderate/accurest/builder/MethodBodyBuilder.groovy +++ /dev/null @@ -1,19 +0,0 @@ -package eu.coderate.accurest.builder - -/** - * @author Jakub Kubrynski - */ -class MethodBodyBuilder { - private final Map stubDefinition - - MethodBodyBuilder(Map stubDefinition) { - this.stubDefinition = stubDefinition - } - - void appendTo(BlockBuilder blockBuilder) { - blockBuilder.startBlock() - blockBuilder.addLine("//" + stubDefinition.request.method) - blockBuilder.addLine("//" + stubDefinition.response.status) - blockBuilder.endBlock() - } -} diff --git a/src/main/groovy/eu/coderate/accurest/builder/MethodBuilder.groovy b/src/main/groovy/eu/coderate/accurest/builder/MethodBuilder.groovy index 25692663d2..07f11e3987 100644 --- a/src/main/groovy/eu/coderate/accurest/builder/MethodBuilder.groovy +++ b/src/main/groovy/eu/coderate/accurest/builder/MethodBuilder.groovy @@ -10,22 +10,30 @@ class MethodBuilder { private final String methodName private final Map stubContent + private final Lang lang - private MethodBuilder(String methodName, Map stubContent) { + private MethodBuilder(String methodName, Map stubContent, Lang lang) { this.stubContent = stubContent this.methodName = methodName + this.lang = lang } - static MethodBuilder createTestMethod(File stubsFile) { + static MethodBuilder createTestMethod(File stubsFile, Lang lang) { Map stubContent = new JsonSlurper().parse(stubsFile) String methodName = NamesUtil.uncapitalize(NamesUtil.toLastDot(NamesUtil.afterLast(stubsFile.path, File.separator))) - return new MethodBuilder(methodName, stubContent) + return new MethodBuilder(methodName, stubContent, lang) } void appendTo(BlockBuilder blockBuilder) { - blockBuilder.addLine('@Test') - blockBuilder.addLine("public void $methodName() {") - new MethodBodyBuilder(stubContent).appendTo(blockBuilder) + String modifier + if (lang == Lang.JAVA) { + blockBuilder.addLine('@Test') + modifier = "public void " + } else { + modifier = "def " + } + blockBuilder.addLine(modifier + "$methodName() {") + new SpockMethodBodyBuilder(stubContent).appendTo(blockBuilder) blockBuilder.addLine('}') } } diff --git a/src/main/groovy/eu/coderate/accurest/builder/SpockMethodBodyBuilder.groovy b/src/main/groovy/eu/coderate/accurest/builder/SpockMethodBodyBuilder.groovy new file mode 100644 index 0000000000..1c6fc1924e --- /dev/null +++ b/src/main/groovy/eu/coderate/accurest/builder/SpockMethodBodyBuilder.groovy @@ -0,0 +1,49 @@ +package eu.coderate.accurest.builder + +import groovy.transform.PackageScope + +/** + * @author Jakub Kubrynski + */ +@PackageScope +class SpockMethodBodyBuilder { + private final Map stubDefinition + + SpockMethodBodyBuilder(Map stubDefinition) { + this.stubDefinition = stubDefinition + } + + void appendTo(BlockBuilder blockBuilder) { + blockBuilder.startBlock() + blockBuilder.addLine('given:').startBlock() + blockBuilder.addLine('def request = given()') + blockBuilder.startBlock().startBlock() + stubDefinition.request.headers.each { + blockBuilder.addLine(".header('$it.key', '$it.value.equalTo')") + } + if (stubDefinition.request.bodyPatterns) { + blockBuilder.addLine('.body(\'' + stubDefinition.request.bodyPatterns[0].matches + '\')') + } + + blockBuilder.endBlock().endBlock().endBlock().addEmptyLine() + + blockBuilder.addLine('when:').startBlock() + blockBuilder.addLine('def response = given().spec(request)') + blockBuilder.startBlock().startBlock() + blockBuilder.addLine('.' + stubDefinition.request.method.toLowerCase() + '("' + stubDefinition.request.url + '")') + blockBuilder.endBlock().endBlock().endBlock().addEmptyLine() + + blockBuilder.addLine('then:').startBlock() + blockBuilder.addLine('response.statusCode == ' + stubDefinition.response.status) + + stubDefinition.response.headers.each { + blockBuilder.addLine("response.header('$it.key') == '$it.value'") + } + if (stubDefinition.response.body) { + blockBuilder.addLine("Pattern.compile('$stubDefinition.response.body', Pattern.DOTALL).matcher(response.body.asString()).matches()") + } + blockBuilder.endBlock() + + blockBuilder.endBlock() + } +} diff --git a/src/main/resources/wiremocks/sample.json b/src/main/resources/stubs/wiremocks/sample.json similarity index 87% rename from src/main/resources/wiremocks/sample.json rename to src/main/resources/stubs/wiremocks/sample.json index 1f97ce2a57..822c33c545 100644 --- a/src/main/resources/wiremocks/sample.json +++ b/src/main/resources/stubs/wiremocks/sample.json @@ -1,7 +1,7 @@ { "request": { "method": "GET", - "url": "/some/thing" + "url": "/some" }, "response": { "status": 200, diff --git a/src/main/resources/stubs/wiremocks/shouldFail.json b/src/main/resources/stubs/wiremocks/shouldFail.json new file mode 100644 index 0000000000..2325c7c614 --- /dev/null +++ b/src/main/resources/stubs/wiremocks/shouldFail.json @@ -0,0 +1,17 @@ +{ + "request": { + "method": "POST", + "url": "/some/thing", + "headers": { + "Accept": { + "equalTo": "text/plain" + } + }, + "bodyPatterns" : [ { + "matches" : "{\"client\":\"1234\"}" + } ] + }, + "response": { + "status": 400 + } +} \ No newline at end of file diff --git a/src/main/resources/wiremocks/shouldFail.json b/src/main/resources/wiremocks/shouldFail.json deleted file mode 100644 index 7fd4b69fba..0000000000 --- a/src/main/resources/wiremocks/shouldFail.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "request": { - "method": "POST", - "url": "/some/thing" - }, - "response": { - "status": 400 - } -} \ No newline at end of file