[#22] Dsl to Wiremock converters - clean up

This commit is contained in:
Marcin Zajaczkowski
2015-02-19 16:32:59 +01:00
parent 468547c561
commit 442c3abe40
7 changed files with 70 additions and 20 deletions

View File

@@ -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)
}
}

View File

@@ -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

View File

@@ -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')
}

View File

@@ -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

View File

@@ -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
}
}

View File

@@ -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)
}

View File

@@ -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<File> createdFiles = FileUtils.listFiles(targetRootDirectory, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE)
Set<String> 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<String> getRelativePathsForFilesInDirectory(Collection<File> createdFiles, File targetRootDirectory) {
Path rootSourcePath = Paths.get(targetRootDirectory.toURI())
Set<String> relativizedCreatedFiles = createdFiles.collect { File file ->