From 468547c561104f941d91b9d569b725a06a101ec8 Mon Sep 17 00:00:00 2001 From: Marcin Zajaczkowski Date: Thu, 19 Feb 2015 10:10:01 +0100 Subject: [PATCH 1/4] [#22] Dsl to Wiremock converters --- .../DslToWiremockClientConverter.groovy | 11 +++++ .../wiremock/DslToWiremockConverter.groovy | 20 ++++++++ .../DslToWiremockServerConverter.groovy | 11 +++++ .../wiremock/RecursiveFilesConverter.groovy | 40 ++++++++++++++++ .../wiremock/SingleFileConverter.groovy | 10 ++++ .../wiremock/WiremockToDslConverter.groovy | 1 + .../DslToWiremockClientConverterSpec.groovy | 29 +++++++++++ .../DslToWiremockServerConverterSpec.groovy | 29 +++++++++++ .../RecursiveFilesConverterSpec.groovy | 48 +++++++++++++++++++ .../converter/source/dir1/dsl1.groovy | 12 +++++ .../converter/source/dir1/dsl1b.groovy | 12 +++++ .../converter/source/dir2/dsl2.groovy | 12 +++++ .../resources/converter/source/dslRoot.groovy | 12 +++++ build.gradle | 3 +- 14 files changed, 249 insertions(+), 1 deletion(-) create mode 100644 accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockClientConverter.groovy create mode 100644 accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockConverter.groovy create mode 100644 accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockServerConverter.groovy create mode 100644 accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverter.groovy create mode 100644 accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/SingleFileConverter.groovy create mode 100644 accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/DslToWiremockClientConverterSpec.groovy create mode 100644 accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/DslToWiremockServerConverterSpec.groovy create mode 100644 accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverterSpec.groovy create mode 100644 accurest-converters/src/test/resources/converter/source/dir1/dsl1.groovy create mode 100644 accurest-converters/src/test/resources/converter/source/dir1/dsl1b.groovy create mode 100644 accurest-converters/src/test/resources/converter/source/dir2/dsl2.groovy create mode 100644 accurest-converters/src/test/resources/converter/source/dslRoot.groovy diff --git a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockClientConverter.groovy b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockClientConverter.groovy new file mode 100644 index 0000000000..bfd46e5d3d --- /dev/null +++ b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockClientConverter.groovy @@ -0,0 +1,11 @@ +package io.codearte.accurest.wiremock + +import io.coderate.accurest.dsl.WiremockStubStrategy + +class DslToWiremockClientConverter extends DslToWiremockConverter { + + @Override + String convertContent(String dslBody) { + return new WiremockStubStrategy(createGroovyDSLfromStringContent(dslBody)).toWiremockClientStub() + } +} diff --git a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockConverter.groovy b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockConverter.groovy new file mode 100644 index 0000000000..82d81a924f --- /dev/null +++ b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockConverter.groovy @@ -0,0 +1,20 @@ +package io.codearte.accurest.wiremock + +import io.coderate.accurest.dsl.GroovyDsl + +abstract class DslToWiremockConverter implements SingleFileConverter { + + @Override + boolean canHandleFileName(String fileName) { + return fileName.endsWith('.groovy') + } + + @Override + String getOutputFileNameForInputFileName(String inputFileName) { + return inputFileName.replaceAll('.groovy', '.json') + } + + protected GroovyDsl createGroovyDSLfromStringContent(String groovyDslAsString) { + return (GroovyDsl)new GroovyShell(this.class.classLoader).evaluate("$groovyDslAsString") + } +} diff --git a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockServerConverter.groovy b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockServerConverter.groovy new file mode 100644 index 0000000000..d0e13e7526 --- /dev/null +++ b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockServerConverter.groovy @@ -0,0 +1,11 @@ +package io.codearte.accurest.wiremock + +import io.coderate.accurest.dsl.WiremockStubStrategy + +class DslToWiremockServerConverter extends DslToWiremockConverter { + + @Override + String convertContent(String dslBody) { + return new WiremockStubStrategy(createGroovyDSLfromStringContent(dslBody)).toWiremockServerStub() + } +} diff --git a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverter.groovy b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverter.groovy new file mode 100644 index 0000000000..6273b54849 --- /dev/null +++ b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverter.groovy @@ -0,0 +1,40 @@ +package io.codearte.accurest.wiremock + +import groovy.io.FileType +import groovy.util.logging.Slf4j + +import java.nio.file.Files +import java.nio.file.Path +import java.nio.file.Paths + +@Slf4j +class RecursiveFilesConverter { + + private final SingleFileConverter singleFileConverter + + RecursiveFilesConverter(SingleFileConverter singleFileConverter) { + this.singleFileConverter = singleFileConverter + } + + void processDirectory(File sourceRootDirectory, File targetRootDirectory) { + sourceRootDirectory.eachFileRecurse(FileType.FILES) { File sourceFile -> + try { + if (!singleFileConverter.canHandleFileName(sourceFile.name)) { + return + } + + String convertedContent = singleFileConverter.convertContent(sourceFile.text) + + Path relativePath = Paths.get(sourceRootDirectory.toURI()).relativize(sourceFile.parentFile.toPath()) + Path absoluteTargetPath = targetRootDirectory.toPath().resolve(relativePath) + Files.createDirectories(absoluteTargetPath) + + File newGroovyFile = new File(absoluteTargetPath.toFile(), singleFileConverter.getOutputFileNameForInputFileName(sourceFile.name)) + log.info("Creating new json [$newGroovyFile.path]") + newGroovyFile.text = convertedContent + } catch (Exception e) { + throw e + } + } + } +} diff --git a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/SingleFileConverter.groovy b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/SingleFileConverter.groovy new file mode 100644 index 0000000000..216b573be0 --- /dev/null +++ b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/SingleFileConverter.groovy @@ -0,0 +1,10 @@ +package io.codearte.accurest.wiremock + +interface SingleFileConverter { + + boolean canHandleFileName(String fileName) + + String convertContent(String content) + + String getOutputFileNameForInputFileName(String inputFileName) +} \ No newline at end of file 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 101260ac3a..7b249f0d33 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 @@ -1,4 +1,5 @@ package io.codearte.accurest.wiremock + import groovy.io.FileType import groovy.json.JsonOutput import groovy.json.JsonSlurper diff --git a/accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/DslToWiremockClientConverterSpec.groovy b/accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/DslToWiremockClientConverterSpec.groovy new file mode 100644 index 0000000000..1c447be017 --- /dev/null +++ b/accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/DslToWiremockClientConverterSpec.groovy @@ -0,0 +1,29 @@ +package io.codearte.accurest.wiremock + +import groovy.json.JsonSlurper +import spock.lang.Specification + +class DslToWiremockClientConverterSpec extends Specification { + + def "should convert DSL file to Wiremock JSON"() { + given: + def converter = new DslToWiremockClientConverter() + and: + String dslBody = """ + io.coderate.accurest.dsl.GroovyDsl.make { + request { + method('PUT') + urlPattern \$(client('/[0-9]{2}'), server('/12')) + } + response { + status 200 + } + } +""" + when: + String json = converter.convertContent(dslBody) + then: + new JsonSlurper().parseText(json) == new JsonSlurper().parseText(""" +{"request":{"method":"PUT","urlPattern":"/[0-9]{2}"},"response":{"status":200}}""") + } +} diff --git a/accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/DslToWiremockServerConverterSpec.groovy b/accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/DslToWiremockServerConverterSpec.groovy new file mode 100644 index 0000000000..063cbab6a3 --- /dev/null +++ b/accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/DslToWiremockServerConverterSpec.groovy @@ -0,0 +1,29 @@ +package io.codearte.accurest.wiremock + +import groovy.json.JsonSlurper +import spock.lang.Specification + +class DslToWiremockServerConverterSpec extends Specification { + + def "should convert DSL file to Wiremock JSON"() { + given: + def converter = new DslToWiremockServerConverter() + and: + String dslBody = """ + io.coderate.accurest.dsl.GroovyDsl.make { + request { + method('PUT') + urlPattern \$(client('/[0-9]{2}'), server('/12')) + } + response { + status 200 + } + } +""" + when: + String json = converter.convertContent(dslBody) + then: + new JsonSlurper().parseText(json) == new JsonSlurper().parseText(""" +{"request":{"method":"PUT","urlPattern":"/12"},"response":{"status":200}}""") + } +} diff --git a/accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverterSpec.groovy b/accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverterSpec.groovy new file mode 100644 index 0000000000..ca3dd46ce0 --- /dev/null +++ b/accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverterSpec.groovy @@ -0,0 +1,48 @@ +package io.codearte.accurest.wiremock + +import org.apache.commons.io.FileUtils +import org.apache.commons.io.filefilter.TrueFileFilter +import org.junit.Rule +import org.junit.rules.TemporaryFolder +import spock.lang.Specification + +import java.nio.file.Path +import java.nio.file.Paths + +class RecursiveFilesConverterSpec extends Specification { + + private static final Set EXPECTED_TARGET_FILES = ["dslRoot.json", "dir1/dsl1.json", "dir1/dsl1b.json", "dir2/dsl2.json"] + + @Rule + public TemporaryFolder tmpFolder = new TemporaryFolder(); + + def "should recursively convert all matching files"() { + given: + def singleFileConverterStub = Stub(SingleFileConverter) + singleFileConverterStub.canHandleFileName(_) >> { String fileName -> fileName.endsWith(".groovy") } + singleFileConverterStub.convertContent(_) >> { "converted" } + singleFileConverterStub.getOutputFileNameForInputFileName(_) >> { String inputFileName -> inputFileName.replaceAll('.groovy', '.json') } + RecursiveFilesConverter recursiveFilesConverter = new RecursiveFilesConverter(singleFileConverterStub) + and: + File originalSourceRootDirectory = new File(this.getClass().getResource("/converter/source").toURI()) + File sourceRootDirectory = tmpFolder.newFolder("source") + File targetRootDirectory = tmpFolder.newFolder("target") + FileUtils.copyDirectory(originalSourceRootDirectory, sourceRootDirectory) + when: + recursiveFilesConverter.processDirectory(sourceRootDirectory, targetRootDirectory) + then: + Collection createdFiles = FileUtils.listFiles(targetRootDirectory, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE) + Set relativizedCreatedFiles = getRelativePathsForFilesInDirectory(createdFiles, targetRootDirectory) + EXPECTED_TARGET_FILES == relativizedCreatedFiles + and: + createdFiles.each { it.text == "converted" } + } + + private static Set getRelativePathsForFilesInDirectory(Collection createdFiles, File targetRootDirectory) { + Path rootSourcePath = Paths.get(targetRootDirectory.toURI()) + Set relativizedCreatedFiles = createdFiles.collect { File file -> + rootSourcePath.relativize(Paths.get(file.toURI())).toString() + } + relativizedCreatedFiles + } +} diff --git a/accurest-converters/src/test/resources/converter/source/dir1/dsl1.groovy b/accurest-converters/src/test/resources/converter/source/dir1/dsl1.groovy new file mode 100644 index 0000000000..69afddb8bd --- /dev/null +++ b/accurest-converters/src/test/resources/converter/source/dir1/dsl1.groovy @@ -0,0 +1,12 @@ +io.coderate.accurest.dsl.GroovyDsl.make { + request { + method('PUT') + headers { + header 'Content-Type': 'application/json' + } + urlPattern $(client('/[0-9]{2}'), server('/12')) + } + response { + status 200 + } +} diff --git a/accurest-converters/src/test/resources/converter/source/dir1/dsl1b.groovy b/accurest-converters/src/test/resources/converter/source/dir1/dsl1b.groovy new file mode 100644 index 0000000000..69afddb8bd --- /dev/null +++ b/accurest-converters/src/test/resources/converter/source/dir1/dsl1b.groovy @@ -0,0 +1,12 @@ +io.coderate.accurest.dsl.GroovyDsl.make { + request { + method('PUT') + headers { + header 'Content-Type': 'application/json' + } + urlPattern $(client('/[0-9]{2}'), server('/12')) + } + response { + status 200 + } +} diff --git a/accurest-converters/src/test/resources/converter/source/dir2/dsl2.groovy b/accurest-converters/src/test/resources/converter/source/dir2/dsl2.groovy new file mode 100644 index 0000000000..69afddb8bd --- /dev/null +++ b/accurest-converters/src/test/resources/converter/source/dir2/dsl2.groovy @@ -0,0 +1,12 @@ +io.coderate.accurest.dsl.GroovyDsl.make { + request { + method('PUT') + headers { + header 'Content-Type': 'application/json' + } + urlPattern $(client('/[0-9]{2}'), server('/12')) + } + response { + status 200 + } +} diff --git a/accurest-converters/src/test/resources/converter/source/dslRoot.groovy b/accurest-converters/src/test/resources/converter/source/dslRoot.groovy new file mode 100644 index 0000000000..69afddb8bd --- /dev/null +++ b/accurest-converters/src/test/resources/converter/source/dslRoot.groovy @@ -0,0 +1,12 @@ +io.coderate.accurest.dsl.GroovyDsl.make { + request { + method('PUT') + headers { + header 'Content-Type': 'application/json' + } + urlPattern $(client('/[0-9]{2}'), server('/12')) + } + response { + status 200 + } +} diff --git a/build.gradle b/build.gradle index 29b11d04f5..571cfb3c35 100644 --- a/build.gradle +++ b/build.gradle @@ -47,10 +47,10 @@ subprojects { project(':accurest-core') { dependencies { + compile 'org.slf4j:slf4j-api:[1.6.0,)' compile 'org.codehaus.plexus:plexus-utils:3.0.21' testCompile 'cglib:cglib-nodep:2.2' testCompile 'org.objenesis:objenesis:2.1' - } } @@ -58,6 +58,7 @@ project(':accurest-converters') { dependencies { compile project(':accurest-core') compile 'org.apache.commons:commons-lang3:3.3.2' + compile 'commons-io:commons-io:[2.4,)' } } From 442c3abe40c2e6e4fca955bfb2dddf2c52df3d95 Mon Sep 17 00:00:00 2001 From: Marcin Zajaczkowski Date: Thu, 19 Feb 2015 16:32:59 +0100 Subject: [PATCH 2/4] [#22] Dsl to Wiremock converters - clean up --- .../ConversionAccurestException.groovy | 11 ++++++ .../DslToWiremockClientConverter.groovy | 2 ++ .../wiremock/DslToWiremockConverter.groovy | 4 ++- .../DslToWiremockServerConverter.groovy | 2 ++ .../wiremock/RecursiveFilesConverter.groovy | 35 +++++++++++++------ .../wiremock/SingleFileConverter.groovy | 5 ++- .../RecursiveFilesConverterSpec.groovy | 31 ++++++++++++---- 7 files changed, 70 insertions(+), 20 deletions(-) create mode 100644 accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/ConversionAccurestException.groovy diff --git a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/ConversionAccurestException.groovy b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/ConversionAccurestException.groovy new file mode 100644 index 0000000000..1d111eea7b --- /dev/null +++ b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/ConversionAccurestException.groovy @@ -0,0 +1,11 @@ +package io.codearte.accurest.wiremock + +import groovy.transform.CompileStatic + +@CompileStatic +class ConversionAccurestException extends RuntimeException { + + ConversionAccurestException(String message, Throwable cause) { + super(message, cause) + } +} diff --git a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockClientConverter.groovy b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockClientConverter.groovy index bfd46e5d3d..1d28f2b9ee 100644 --- a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockClientConverter.groovy +++ b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockClientConverter.groovy @@ -1,7 +1,9 @@ package io.codearte.accurest.wiremock +import groovy.transform.CompileStatic import io.coderate.accurest.dsl.WiremockStubStrategy +@CompileStatic class DslToWiremockClientConverter extends DslToWiremockConverter { @Override diff --git a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockConverter.groovy b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockConverter.groovy index 82d81a924f..3f2b81c14b 100644 --- a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockConverter.groovy +++ b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockConverter.groovy @@ -1,7 +1,9 @@ package io.codearte.accurest.wiremock +import groovy.transform.CompileStatic import io.coderate.accurest.dsl.GroovyDsl +@CompileStatic abstract class DslToWiremockConverter implements SingleFileConverter { @Override @@ -10,7 +12,7 @@ abstract class DslToWiremockConverter implements SingleFileConverter { } @Override - String getOutputFileNameForInputFileName(String inputFileName) { + String generateOutputFileNameForInput(String inputFileName) { return inputFileName.replaceAll('.groovy', '.json') } diff --git a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockServerConverter.groovy b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockServerConverter.groovy index d0e13e7526..caf3b3a199 100644 --- a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockServerConverter.groovy +++ b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockServerConverter.groovy @@ -1,7 +1,9 @@ package io.codearte.accurest.wiremock +import groovy.transform.CompileStatic import io.coderate.accurest.dsl.WiremockStubStrategy +@CompileStatic class DslToWiremockServerConverter extends DslToWiremockConverter { @Override diff --git a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverter.groovy b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverter.groovy index 6273b54849..ca79645cc8 100644 --- a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverter.groovy +++ b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverter.groovy @@ -1,6 +1,7 @@ package io.codearte.accurest.wiremock import groovy.io.FileType +import groovy.transform.CompileStatic import groovy.util.logging.Slf4j import java.nio.file.Files @@ -8,33 +9,45 @@ import java.nio.file.Path import java.nio.file.Paths @Slf4j +@CompileStatic class RecursiveFilesConverter { private final SingleFileConverter singleFileConverter + private final File sourceRootDirectory + private final File targetRootDirectory - RecursiveFilesConverter(SingleFileConverter singleFileConverter) { + RecursiveFilesConverter(SingleFileConverter singleFileConverter, File sourceRootDirectory, File targetRootDirectory) { this.singleFileConverter = singleFileConverter + this.sourceRootDirectory = sourceRootDirectory + this.targetRootDirectory = targetRootDirectory } - void processDirectory(File sourceRootDirectory, File targetRootDirectory) { + void processFiles() { sourceRootDirectory.eachFileRecurse(FileType.FILES) { File sourceFile -> try { if (!singleFileConverter.canHandleFileName(sourceFile.name)) { return } - String convertedContent = singleFileConverter.convertContent(sourceFile.text) - - Path relativePath = Paths.get(sourceRootDirectory.toURI()).relativize(sourceFile.parentFile.toPath()) - Path absoluteTargetPath = targetRootDirectory.toPath().resolve(relativePath) - Files.createDirectories(absoluteTargetPath) - - File newGroovyFile = new File(absoluteTargetPath.toFile(), singleFileConverter.getOutputFileNameForInputFileName(sourceFile.name)) - log.info("Creating new json [$newGroovyFile.path]") + Path absoluteTargetPath = createAndReturnTargetDirectory(sourceFile) + File newGroovyFile = createTargetFileWithProperName(absoluteTargetPath, sourceFile) newGroovyFile.text = convertedContent } catch (Exception e) { - throw e + throw new ConversionAccurestException("Unable to convertion of ${sourceFile.name}", e) } } } + + private Path createAndReturnTargetDirectory(File sourceFile) { + Path relativePath = Paths.get(sourceRootDirectory.toURI()).relativize(sourceFile.parentFile.toPath()) + Path absoluteTargetPath = targetRootDirectory.toPath().resolve(relativePath) + Files.createDirectories(absoluteTargetPath) + absoluteTargetPath + } + + private File createTargetFileWithProperName(Path absoluteTargetPath, File sourceFile) { + File newGroovyFile = new File(absoluteTargetPath.toFile(), singleFileConverter.generateOutputFileNameForInput(sourceFile.name)) + log.info("Creating new json [$newGroovyFile.path]") + newGroovyFile + } } diff --git a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/SingleFileConverter.groovy b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/SingleFileConverter.groovy index 216b573be0..4b76be8357 100644 --- a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/SingleFileConverter.groovy +++ b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/SingleFileConverter.groovy @@ -1,10 +1,13 @@ package io.codearte.accurest.wiremock +import groovy.transform.CompileStatic + +@CompileStatic interface SingleFileConverter { boolean canHandleFileName(String fileName) String convertContent(String content) - String getOutputFileNameForInputFileName(String inputFileName) + String generateOutputFileNameForInput(String inputFileName) } \ No newline at end of file diff --git a/accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverterSpec.groovy b/accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverterSpec.groovy index ca3dd46ce0..5972e00122 100644 --- a/accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverterSpec.groovy +++ b/accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverterSpec.groovy @@ -18,18 +18,18 @@ class RecursiveFilesConverterSpec extends Specification { def "should recursively convert all matching files"() { given: - def singleFileConverterStub = Stub(SingleFileConverter) - singleFileConverterStub.canHandleFileName(_) >> { String fileName -> fileName.endsWith(".groovy") } - singleFileConverterStub.convertContent(_) >> { "converted" } - singleFileConverterStub.getOutputFileNameForInputFileName(_) >> { String inputFileName -> inputFileName.replaceAll('.groovy', '.json') } - RecursiveFilesConverter recursiveFilesConverter = new RecursiveFilesConverter(singleFileConverterStub) - and: File originalSourceRootDirectory = new File(this.getClass().getResource("/converter/source").toURI()) File sourceRootDirectory = tmpFolder.newFolder("source") File targetRootDirectory = tmpFolder.newFolder("target") FileUtils.copyDirectory(originalSourceRootDirectory, sourceRootDirectory) + and: + def singleFileConverterStub = Stub(SingleFileConverter) + singleFileConverterStub.canHandleFileName(_) >> { String fileName -> fileName.endsWith(".groovy") } + singleFileConverterStub.convertContent(_) >> { "converted" } + singleFileConverterStub.generateOutputFileNameForInput(_) >> { String inputFileName -> inputFileName.replaceAll('.groovy', '.json') } + RecursiveFilesConverter recursiveFilesConverter = new RecursiveFilesConverter(singleFileConverterStub, sourceRootDirectory, targetRootDirectory) when: - recursiveFilesConverter.processDirectory(sourceRootDirectory, targetRootDirectory) + recursiveFilesConverter.processFiles() then: Collection createdFiles = FileUtils.listFiles(targetRootDirectory, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE) Set relativizedCreatedFiles = getRelativePathsForFilesInDirectory(createdFiles, targetRootDirectory) @@ -38,6 +38,23 @@ class RecursiveFilesConverterSpec extends Specification { createdFiles.each { it.text == "converted" } } + def "on failure should break processing and throw meaningful exception"() { + given: + def sourceFile = tmpFolder.newFile() + and: + def singleFileConverterStub = Stub(SingleFileConverter) + singleFileConverterStub.canHandleFileName(_) >> { true } + singleFileConverterStub.convertContent(_) >> { throw new NullPointerException("Test conversion error") } + singleFileConverterStub.generateOutputFileNameForInput(_) >> { String inputFileName -> "${inputFileName}2" } + RecursiveFilesConverter recursiveFilesConverter = new RecursiveFilesConverter(singleFileConverterStub, tmpFolder.root, tmpFolder.root) + when: + recursiveFilesConverter.processFiles() + then: + def e = thrown(ConversionAccurestException) + e.message?.contains(sourceFile.name) + e.cause?.message == "Test conversion error" + } + private static Set getRelativePathsForFilesInDirectory(Collection createdFiles, File targetRootDirectory) { Path rootSourcePath = Paths.get(targetRootDirectory.toURI()) Set relativizedCreatedFiles = createdFiles.collect { File file -> From 4dc4f1d37cd13f5e125636bfe1d36866dadd29ba Mon Sep 17 00:00:00 2001 From: Marcin Zajaczkowski Date: Fri, 20 Feb 2015 15:52:29 +0100 Subject: [PATCH 3/4] [#22] Add generateWiremockClientStubs task --- .../ConversionAccurestException.groovy | 3 +- .../accurest/AccurestException.groovy | 5 ++- .../config/AccurestConfigProperties.groovy | 2 + .../accurest/dsl/WiremockStubStrategy.groovy | 8 ++-- .../accurest/dsl/internal/Body.groovy | 8 ++-- .../plugin/AccurestGradlePlugin.groovy | 45 ++++++++++++------- ...erateWiremockClientStubsFromDslTask.groovy | 24 ++++++++++ build.gradle | 3 +- 8 files changed, 72 insertions(+), 26 deletions(-) create mode 100644 accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/GenerateWiremockClientStubsFromDslTask.groovy diff --git a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/ConversionAccurestException.groovy b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/ConversionAccurestException.groovy index 1d111eea7b..b12d46917f 100644 --- a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/ConversionAccurestException.groovy +++ b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/ConversionAccurestException.groovy @@ -1,9 +1,10 @@ package io.codearte.accurest.wiremock import groovy.transform.CompileStatic +import io.coderate.accurest.AccurestException @CompileStatic -class ConversionAccurestException extends RuntimeException { +class ConversionAccurestException extends AccurestException { ConversionAccurestException(String message, Throwable cause) { super(message, cause) diff --git a/accurest-core/src/main/groovy/io/coderate/accurest/AccurestException.groovy b/accurest-core/src/main/groovy/io/coderate/accurest/AccurestException.groovy index d564661933..740e13e620 100644 --- a/accurest-core/src/main/groovy/io/coderate/accurest/AccurestException.groovy +++ b/accurest-core/src/main/groovy/io/coderate/accurest/AccurestException.groovy @@ -5,8 +5,11 @@ package io.coderate.accurest */ class AccurestException extends RuntimeException { - def AccurestException(String message) { + AccurestException(String message) { super(message) } + AccurestException(String message, Throwable cause) { + super(message, cause) + } } diff --git a/accurest-core/src/main/groovy/io/coderate/accurest/config/AccurestConfigProperties.groovy b/accurest-core/src/main/groovy/io/coderate/accurest/config/AccurestConfigProperties.groovy index 794c6f9635..3cf1edb274 100644 --- a/accurest-core/src/main/groovy/io/coderate/accurest/config/AccurestConfigProperties.groovy +++ b/accurest-core/src/main/groovy/io/coderate/accurest/config/AccurestConfigProperties.groovy @@ -14,4 +14,6 @@ class AccurestConfigProperties { String generatedTestSourcesDir = 'build/generated-sources/accurest' String[] imports = [] String[] staticImports = [] + File groovyDslDir + File generatedWiremockClientStubsDir } 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 c4ced294d6..a3d3924fc0 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 @@ -15,12 +15,12 @@ class WiremockStubStrategy { } String toWiremockClientStub() { - return JsonOutput.toJson([request: wiremockRequestStubStrategy.buildClientRequestContent(), - response: wiremockResponseStubStrategy.buildClientResponseContent()]) + return JsonOutput.prettyPrint(JsonOutput.toJson([request: wiremockRequestStubStrategy.buildClientRequestContent(), + response: wiremockResponseStubStrategy.buildClientResponseContent()])) } String toWiremockServerStub() { - return JsonOutput.toJson([request: wiremockRequestStubStrategy.buildServerRequestContent(), - response: wiremockResponseStubStrategy.buildServerResponseContent()]) + return JsonOutput.prettyPrint(JsonOutput.toJson([request: wiremockRequestStubStrategy.buildServerRequestContent(), + response: wiremockResponseStubStrategy.buildServerResponseContent()])) } } diff --git a/accurest-core/src/main/groovy/io/coderate/accurest/dsl/internal/Body.groovy b/accurest-core/src/main/groovy/io/coderate/accurest/dsl/internal/Body.groovy index 502e18a2ca..dcf033be1d 100644 --- a/accurest-core/src/main/groovy/io/coderate/accurest/dsl/internal/Body.groovy +++ b/accurest-core/src/main/groovy/io/coderate/accurest/dsl/internal/Body.groovy @@ -55,8 +55,8 @@ class Body { } else if(bodyAsList) { bodyAsList.collect { it.clientValue } } - return body.collectEntries { - Map.Entry entry -> [(entry.key) : entry.value.clientValue] + return body.collectEntries { Map.Entry entry -> + [(entry.key) : entry.value.clientValue] } as Map } @@ -66,8 +66,8 @@ class Body { } else if(bodyAsList) { bodyAsList.collect { it.serverValue } } - return body.collectEntries { - Map.Entry entry -> [(entry.key) : entry.value.serverValue] + return body.collectEntries { Map.Entry entry -> + [(entry.key) : entry.value.serverValue] } as Map } } diff --git a/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/AccurestGradlePlugin.groovy b/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/AccurestGradlePlugin.groovy index b3bd8d6509..b7561ea393 100644 --- a/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/AccurestGradlePlugin.groovy +++ b/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/AccurestGradlePlugin.groovy @@ -3,15 +3,18 @@ package io.codearte.accurest.plugin import io.coderate.accurest.AccurestException import io.coderate.accurest.TestGenerator import io.coderate.accurest.config.AccurestConfigProperties +import org.gradle.api.GradleException import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.api.Task /** * @author Jakub Kubrynski */ class AccurestGradlePlugin implements Plugin { - private static final String TASK_NAME = 'generateAccurest' + private static final String GENERATE_SERVER_TESTS_TASK_NAME = 'generateAccurest' + private static final String DSL_TO_WIREMOCK_CLIENT_TASK_NAME = 'generateWiremockClientStubs' private static final Class IDEA_PLUGIN_CLASS = org.gradle.plugins.ide.idea.IdeaPlugin @@ -19,9 +22,25 @@ class AccurestGradlePlugin implements Plugin { void apply(Project project) { AccurestConfigProperties extension = project.extensions.create('accurest', AccurestConfigProperties) - project.compileTestGroovy.dependsOn(TASK_NAME) + project.compileTestGroovy.dependsOn(GENERATE_SERVER_TESTS_TASK_NAME) - project.task(TASK_NAME) << { + createGenerateTestsTask(project, extension) + createAndConfigureGenerateWiremockClientStubsFromDslTask(project, extension) + + project.afterEvaluate { + def hasIdea = project.plugins.findPlugin(IDEA_PLUGIN_CLASS) + if (hasIdea) { + project.idea { + module { + testSourceDirs += project.file(buildGeneratedSourcesDir(project, extension)) + } + } + } + } + } + + private Task createGenerateTestsTask(Project project, AccurestConfigProperties extension) { + project.task(GENERATE_SERVER_TESTS_TASK_NAME) << { project.logger.info("Accurest Plugin: Invoking test sources generation") extension.stubsBaseDirectory = project.projectDir.path + File.separator + extension.stubsBaseDirectory @@ -38,21 +57,18 @@ class AccurestGradlePlugin implements Plugin { int generatedClasses = generator.generate() project.logger.info("Generated {} test classes", generatedClasses) } catch (AccurestException e) { - project.logger.error("Accurest Plugin exception: {}", e.getMessage()) + throw new GradleException("Accurest Plugin exception: ${e.message}", e) } } + } - project.afterEvaluate { - def hasIdea = project.plugins.findPlugin(IDEA_PLUGIN_CLASS) - if (hasIdea) { - project.idea { - module { - testSourceDirs += new File(buildGeneratedSourcesDir(project, extension)) - } - } - } + private void createAndConfigureGenerateWiremockClientStubsFromDslTask(Project project, AccurestConfigProperties extension) { + Task task = project.tasks.create(DSL_TO_WIREMOCK_CLIENT_TASK_NAME, GenerateWiremockClientStubsFromDslTask) + task.description = "Generate" + task.conventionMapping.with { + groovyDslDir = { extension.groovyDslDir } + generatedWiremockClientStubsDir = { extension.generatedWiremockClientStubsDir } } - } private String buildGeneratedSourcesDir(Project project, def extension) { @@ -64,5 +80,4 @@ class AccurestGradlePlugin implements Plugin { } moduleDir } - } diff --git a/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/GenerateWiremockClientStubsFromDslTask.groovy b/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/GenerateWiremockClientStubsFromDslTask.groovy new file mode 100644 index 0000000000..46111dc736 --- /dev/null +++ b/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/GenerateWiremockClientStubsFromDslTask.groovy @@ -0,0 +1,24 @@ +package io.codearte.accurest.plugin + +import io.codearte.accurest.wiremock.DslToWiremockClientConverter +import io.codearte.accurest.wiremock.RecursiveFilesConverter +import org.gradle.api.DefaultTask +import org.gradle.api.tasks.InputDirectory +import org.gradle.api.tasks.TaskAction + +//TODO: Implement as an incremental task: https://gradle.org/docs/current/userguide/custom_tasks.html#incremental_tasks ? +class GenerateWiremockClientStubsFromDslTask extends DefaultTask { + + @InputDirectory File groovyDslDir + @InputDirectory File generatedWiremockClientStubsDir + + @TaskAction + void generate() { + project.logger.info("Accurest Plugin: Invoking GroovyDSL to Wiremock client stubs conversion") + project.logger.debug("From '${getGroovyDslDir()}' to '${getGeneratedWiremockClientStubsDir()}'") + + RecursiveFilesConverter converter = new RecursiveFilesConverter(new DslToWiremockClientConverter(), getGroovyDslDir(), + getGeneratedWiremockClientStubsDir()) + converter.processFiles() + } +} diff --git a/build.gradle b/build.gradle index 571cfb3c35..e0130574b9 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ ext { - projectVersion = '0.3.0-SNAPSHOT' + projectVersion = '0.3.1-SNAPSHOT' projectGroup = 'io.codearte.accurest' } @@ -65,6 +65,7 @@ project(':accurest-converters') { project(':accurest-gradle-plugin') { dependencies { compile project(':accurest-core') + compile project(':accurest-converters') compile gradleApi() } } From 10fb15190b1dd37b7a8f51d9fb698d592ac6cd98 Mon Sep 17 00:00:00 2001 From: Marcin Zajaczkowski Date: Sat, 21 Feb 2015 12:15:13 +0100 Subject: [PATCH 4/4] [#22] Rework generate server tests task --- .../io/coderate/accurest/FileSaver.groovy | 7 +-- .../io/coderate/accurest/TestGenerator.groovy | 12 ++-- .../config/AccurestConfigProperties.groovy | 6 +- .../accurest/TestGeneratorSpec.groovy | 6 +- .../plugin/AccurestGradlePlugin.groovy | 61 +++++++------------ .../plugin/GenerateServerTestsTask.groovy | 36 +++++++++++ 6 files changed, 72 insertions(+), 56 deletions(-) create mode 100644 accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/GenerateServerTestsTask.groovy diff --git a/accurest-core/src/main/groovy/io/coderate/accurest/FileSaver.groovy b/accurest-core/src/main/groovy/io/coderate/accurest/FileSaver.groovy index 8d76595c4a..74d54d188a 100644 --- a/accurest-core/src/main/groovy/io/coderate/accurest/FileSaver.groovy +++ b/accurest-core/src/main/groovy/io/coderate/accurest/FileSaver.groovy @@ -13,18 +13,17 @@ import static io.coderate.accurest.util.NamesUtil.capitalize @CompileStatic class FileSaver { - - String targetDirectory + File targetDirectory TestFramework framework - FileSaver(String targetDirectory, TestFramework framework) { + FileSaver(File targetDirectory, TestFramework framework) { this.targetDirectory = targetDirectory this.framework = framework } void saveClassFile(String fileName, String packageName, byte[] classBytes) { - def testBaseDir = Paths.get(targetDirectory, NamesUtil.packageToDirectory(packageName)) + def testBaseDir = Paths.get(targetDirectory.absolutePath, NamesUtil.packageToDirectory(packageName)) Files.createDirectories(testBaseDir) def classPath = Paths.get(testBaseDir.toString(), capitalize(fileName) + getTestClassSuffix() + getTestClassExtension()) .toAbsolutePath() diff --git a/accurest-core/src/main/groovy/io/coderate/accurest/TestGenerator.groovy b/accurest-core/src/main/groovy/io/coderate/accurest/TestGenerator.groovy index 2358df8362..f01b5398eb 100644 --- a/accurest-core/src/main/groovy/io/coderate/accurest/TestGenerator.groovy +++ b/accurest-core/src/main/groovy/io/coderate/accurest/TestGenerator.groovy @@ -14,23 +14,21 @@ import static io.coderate.accurest.util.NamesUtil.afterLast class TestGenerator { private final AccurestConfigProperties configProperties - private final String stubsBaseDirectory private AtomicInteger counter = new AtomicInteger() private SingleTestGenerator generator private FileSaver saver private DirectoryScanner directoryScanner TestGenerator(AccurestConfigProperties accurestConfigProperties) { - this(accurestConfigProperties, new SingleTestGenerator(accurestConfigProperties), new FileSaver(accurestConfigProperties.generatedTestSourcesDir, accurestConfigProperties.targetFramework)) + this(accurestConfigProperties, new SingleTestGenerator(accurestConfigProperties), + new FileSaver(accurestConfigProperties.generatedTestSourcesDir, accurestConfigProperties.targetFramework)) } TestGenerator(AccurestConfigProperties configProperties, SingleTestGenerator generator, FileSaver saver) { this.configProperties = configProperties - File stubsResource = new File(configProperties.stubsBaseDirectory) - if (stubsResource == null) { + if (configProperties.stubsBaseDirectory == null) { throw new AccurestException("Stubs directory not found under " + configProperties.stubsBaseDirectory) } - this.stubsBaseDirectory = stubsResource.path this.generator = generator this.saver = saver this.directoryScanner = new DirectoryScanner() @@ -61,7 +59,7 @@ class TestGenerator { return includedFile.matches(includedDirectoryRelativePath + File.separator + "[A-Za-z0-9]*\\.json") } .collect { - return new File(stubsBaseDirectory + File.separator + it) + return new File(configProperties.stubsBaseDirectory, it) } if (filesToClass.size()) { def className = afterLast(includedDirectoryRelativePath, File.separator) @@ -71,6 +69,4 @@ class TestGenerator { } } } - - } \ No newline at end of file diff --git a/accurest-core/src/main/groovy/io/coderate/accurest/config/AccurestConfigProperties.groovy b/accurest-core/src/main/groovy/io/coderate/accurest/config/AccurestConfigProperties.groovy index 3cf1edb274..3f6e50c889 100644 --- a/accurest-core/src/main/groovy/io/coderate/accurest/config/AccurestConfigProperties.groovy +++ b/accurest-core/src/main/groovy/io/coderate/accurest/config/AccurestConfigProperties.groovy @@ -6,12 +6,12 @@ package io.coderate.accurest.config class AccurestConfigProperties { TestFramework targetFramework = TestFramework.SPOCK TestMode testMode = TestMode.MOCKMVC - String stubsBaseDirectory = 'src/test/resources/stubs' - String basePackageForTests = 'io.codearte.accurest.tests' + File stubsBaseDirectory + String basePackageForTests String baseClassForTests String ruleClassForTests List ignoredFiles = [] - String generatedTestSourcesDir = 'build/generated-sources/accurest' + File generatedTestSourcesDir String[] imports = [] String[] staticImports = [] File groovyDslDir diff --git a/accurest-core/src/test/groovy/io/codearte/accurest/TestGeneratorSpec.groovy b/accurest-core/src/test/groovy/io/codearte/accurest/TestGeneratorSpec.groovy index 279af858de..f639dfe1cd 100644 --- a/accurest-core/src/test/groovy/io/codearte/accurest/TestGeneratorSpec.groovy +++ b/accurest-core/src/test/groovy/io/codearte/accurest/TestGeneratorSpec.groovy @@ -14,7 +14,7 @@ class TestGeneratorSpec extends Specification { given: File resource = new File(this.getClass().getResource("/directory/with/stubs/stubsRepositoryIndicator").toURI()) AccurestConfigProperties properties = new AccurestConfigProperties() - properties.stubsBaseDirectory = resource.parentFile.path + properties.stubsBaseDirectory = resource.parentFile TestGenerator testGenerator = new TestGenerator(properties, classGenerator, Stub(FileSaver)) when: testGenerator.generateTestClasses("com.ofg") @@ -27,7 +27,7 @@ class TestGeneratorSpec extends Specification { File resource = new File(this.getClass().getResource("/directory/with/stubs/stubsRepositoryIndicator").toURI()) AccurestConfigProperties properties = new AccurestConfigProperties() properties.ignoredFiles << "**/other/**" - properties.stubsBaseDirectory = resource.parentFile.path + properties.stubsBaseDirectory = resource.parentFile TestGenerator testGenerator = new TestGenerator(properties, classGenerator, Stub(FileSaver)) when: testGenerator.generateTestClasses("com.ofg") @@ -40,7 +40,7 @@ class TestGeneratorSpec extends Specification { File resource = new File(this.getClass().getResource("/directory/with/stubs/stubsRepositoryIndicator").toURI()) AccurestConfigProperties properties = new AccurestConfigProperties() properties.ignoredFiles << "**/other.json" - properties.stubsBaseDirectory = resource.parentFile.path + properties.stubsBaseDirectory = resource.parentFile TestGenerator testGenerator = new TestGenerator(properties, classGenerator, Stub(FileSaver)) classGenerator.buildClass(_, _, _) >> "sample" when: diff --git a/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/AccurestGradlePlugin.groovy b/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/AccurestGradlePlugin.groovy index b7561ea393..11c9d75ba8 100644 --- a/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/AccurestGradlePlugin.groovy +++ b/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/AccurestGradlePlugin.groovy @@ -1,9 +1,6 @@ package io.codearte.accurest.plugin -import io.coderate.accurest.AccurestException -import io.coderate.accurest.TestGenerator import io.coderate.accurest.config.AccurestConfigProperties -import org.gradle.api.GradleException import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.Task @@ -18,66 +15,54 @@ class AccurestGradlePlugin implements Plugin { private static final Class IDEA_PLUGIN_CLASS = org.gradle.plugins.ide.idea.IdeaPlugin + private Project project + @Override void apply(Project project) { + this.project = project AccurestConfigProperties extension = project.extensions.create('accurest', AccurestConfigProperties) project.compileTestGroovy.dependsOn(GENERATE_SERVER_TESTS_TASK_NAME) - createGenerateTestsTask(project, extension) - createAndConfigureGenerateWiremockClientStubsFromDslTask(project, extension) + setConfigurationDefaults(extension) + createGenerateTestsTask(extension) + createAndConfigureGenerateWiremockClientStubsFromDslTask(extension) project.afterEvaluate { def hasIdea = project.plugins.findPlugin(IDEA_PLUGIN_CLASS) if (hasIdea) { project.idea { module { - testSourceDirs += project.file(buildGeneratedSourcesDir(project, extension)) + testSourceDirs += extension.generatedTestSourcesDir } } } } } - private Task createGenerateTestsTask(Project project, AccurestConfigProperties extension) { - project.task(GENERATE_SERVER_TESTS_TASK_NAME) << { - project.logger.info("Accurest Plugin: Invoking test sources generation") - - extension.stubsBaseDirectory = project.projectDir.path + File.separator + extension.stubsBaseDirectory - - project.sourceSets.test.groovy { - project.logger.info("Registering $extension.generatedTestSourcesDir as test source directory") - srcDir extension.generatedTestSourcesDir - } - - extension.generatedTestSourcesDir = buildGeneratedSourcesDir(project, extension) - - try { - TestGenerator generator = new TestGenerator(extension) - int generatedClasses = generator.generate() - project.logger.info("Generated {} test classes", generatedClasses) - } catch (AccurestException e) { - throw new GradleException("Accurest Plugin exception: ${e.message}", e) - } + void setConfigurationDefaults(AccurestConfigProperties extension) { + extension.with { + generatedTestSourcesDir = project.file("${project.buildDir}/generated-sources/accurest") + stubsBaseDirectory = project.file("${project.rootDir}/src/test/resources/stubs") //TODO: Use sourceset + basePackageForTests = 'io.codearte.accurest.tests' } } - private void createAndConfigureGenerateWiremockClientStubsFromDslTask(Project project, AccurestConfigProperties extension) { + private void createGenerateTestsTask(AccurestConfigProperties extension) { + Task task = project.tasks.create(GENERATE_SERVER_TESTS_TASK_NAME, GenerateServerTestsTask) + task.description = "Generate server tests from GroovyDSL" + task.conventionMapping.with { + generatedTestSourcesDir = { extension.generatedTestSourcesDir } + configProperties = { extension } + } + } + + private void createAndConfigureGenerateWiremockClientStubsFromDslTask(AccurestConfigProperties extension) { Task task = project.tasks.create(DSL_TO_WIREMOCK_CLIENT_TASK_NAME, GenerateWiremockClientStubsFromDslTask) - task.description = "Generate" + task.description = "Generate Wiremock client stubs from GroovyDSL" task.conventionMapping.with { groovyDslDir = { extension.groovyDslDir } generatedWiremockClientStubsDir = { extension.generatedWiremockClientStubsDir } } } - - private String buildGeneratedSourcesDir(Project project, def extension) { - String moduleDir - if (project.getParent()) { - moduleDir = project.name + File.separator + extension.generatedTestSourcesDir - } else { - moduleDir = extension.generatedTestSourcesDir - } - moduleDir - } } diff --git a/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/GenerateServerTestsTask.groovy b/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/GenerateServerTestsTask.groovy new file mode 100644 index 0000000000..124c226fe4 --- /dev/null +++ b/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/GenerateServerTestsTask.groovy @@ -0,0 +1,36 @@ +package io.codearte.accurest.plugin + +import io.coderate.accurest.AccurestException +import io.coderate.accurest.TestGenerator +import io.coderate.accurest.config.AccurestConfigProperties +import org.gradle.api.DefaultTask +import org.gradle.api.GradleException +import org.gradle.api.tasks.OutputDirectory +import org.gradle.api.tasks.TaskAction + +class GenerateServerTestsTask extends DefaultTask { + + @OutputDirectory File generatedTestSourcesDir + + //TODO: How to deal with @Input*, @Output* and that domain object? + AccurestConfigProperties configProperties + + @TaskAction + void generate() { + project.logger.info("Accurest Plugin: Invoking test sources generation") + + project.sourceSets.test.groovy { + project.logger.info("Registering ${getConfigProperties().generatedTestSourcesDir} as test source directory") + srcDir getConfigProperties().generatedTestSourcesDir + } + + try { + //TODO: What with that? How to pass? + TestGenerator generator = new TestGenerator(getConfigProperties()) + int generatedClasses = generator.generate() + project.logger.info("Generated {} test classes", generatedClasses) + } catch (AccurestException e) { + throw new GradleException("Accurest Plugin exception: ${e.message}", e) + } + } +}