From 468547c561104f941d91b9d569b725a06a101ec8 Mon Sep 17 00:00:00 2001 From: Marcin Zajaczkowski Date: Thu, 19 Feb 2015 10:10:01 +0100 Subject: [PATCH] [#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,)' } }