Merge pull request #191 from Codearte/issues/189-wiremock-generators

Make Wiremock generator use ContractFileScanner. Fix #189
This commit is contained in:
Jakub Kubryński
2016-02-07 19:51:11 +01:00
4 changed files with 61 additions and 20 deletions

View File

@@ -1,8 +1,12 @@
package io.codearte.accurest.wiremock
import com.google.common.collect.Multimap
import groovy.io.FileType
import groovy.transform.CompileStatic
import groovy.util.logging.Slf4j
import io.codearte.accurest.config.AccurestConfigProperties
import io.codearte.accurest.file.Contract
import io.codearte.accurest.file.ContractFileScanner
import java.nio.charset.StandardCharsets
import java.nio.file.Files
@@ -14,17 +18,18 @@ import java.nio.file.Paths
class RecursiveFilesConverter {
private final SingleFileConverter singleFileConverter
private final File sourceRootDirectory
private final File targetRootDirectory
private final AccurestConfigProperties properties
RecursiveFilesConverter(SingleFileConverter singleFileConverter, File sourceRootDirectory, File targetRootDirectory) {
RecursiveFilesConverter(SingleFileConverter singleFileConverter, AccurestConfigProperties properties) {
this.properties = properties
this.singleFileConverter = singleFileConverter
this.sourceRootDirectory = sourceRootDirectory
this.targetRootDirectory = targetRootDirectory
}
void processFiles() {
sourceRootDirectory.eachFileRecurse(FileType.FILES) { File sourceFile ->
ContractFileScanner scanner = new ContractFileScanner(properties.contractsDslDir, properties.excludedFiles as Set, [] as Set)
Multimap<Path, Contract> contracts = scanner.findContracts()
contracts.values().each { Contract contract ->
File sourceFile = contract.path.toFile()
try {
if (!singleFileConverter.canHandleFileName(sourceFile.name)) {
return
@@ -40,8 +45,8 @@ class RecursiveFilesConverter {
}
private Path createAndReturnTargetDirectory(File sourceFile) {
Path relativePath = Paths.get(sourceRootDirectory.toURI()).relativize(sourceFile.parentFile.toPath())
Path absoluteTargetPath = targetRootDirectory.toPath().resolve(relativePath)
Path relativePath = Paths.get(properties.contractsDslDir.toURI()).relativize(sourceFile.parentFile.toPath())
Path absoluteTargetPath = properties.stubsOutputDir.toPath().resolve(relativePath)
Files.createDirectories(absoluteTargetPath)
absoluteTargetPath
}

View File

@@ -1,5 +1,6 @@
package io.codearte.accurest.wiremock
import io.codearte.accurest.config.AccurestConfigProperties
import org.apache.commons.io.FileUtils
import org.apache.commons.io.filefilter.TrueFileFilter
import org.junit.Rule
@@ -11,42 +12,73 @@ import java.nio.file.Paths
class RecursiveFilesConverterSpec extends Specification {
private static final Set<Path> EXPECTED_TARGET_FILES = [Paths.get("dslRoot.json"), Paths.get("dir1/dsl1.json"), Paths.get("dir1/dsl1b.json"), Paths.get("dir2/dsl2.json")]
private static
final Set<Path> EXPECTED_TARGET_FILES = [Paths.get("dslRoot.json"), Paths.get("dir1/dsl1.json"), Paths.get("dir1/dsl1b.json"), Paths.get("dir2/dsl2.json")]
@Rule
public TemporaryFolder tmpFolder = new TemporaryFolder();
def "should recursively convert all matching files"() {
given:
AccurestConfigProperties properties = new AccurestConfigProperties()
File originalSourceRootDirectory = new File(this.getClass().getResource("/converter/source").toURI())
File sourceRootDirectory = tmpFolder.newFolder("source")
File targetRootDirectory = tmpFolder.newFolder("target")
FileUtils.copyDirectory(originalSourceRootDirectory, sourceRootDirectory)
properties.contractsDslDir = tmpFolder.newFolder("source")
properties.stubsOutputDir = tmpFolder.newFolder("target")
FileUtils.copyDirectory(originalSourceRootDirectory, properties.contractsDslDir)
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)
RecursiveFilesConverter recursiveFilesConverter = new RecursiveFilesConverter(singleFileConverterStub, properties)
when:
recursiveFilesConverter.processFiles()
then:
Collection<File> createdFiles = FileUtils.listFiles(targetRootDirectory, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE)
Set<String> relativizedCreatedFiles = getRelativePathsForFilesInDirectory(createdFiles, targetRootDirectory)
Collection<File> createdFiles = FileUtils.listFiles(properties.stubsOutputDir, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE)
Set<String> relativizedCreatedFiles = getRelativePathsForFilesInDirectory(createdFiles, properties.stubsOutputDir)
EXPECTED_TARGET_FILES == relativizedCreatedFiles
and:
createdFiles.each { it.text == "converted" }
}
def "should recursively convert matching files with exlusions"() {
given:
AccurestConfigProperties properties = new AccurestConfigProperties()
File originalSourceRootDirectory = new File(this.getClass().getResource("/converter/source").toURI())
properties.contractsDslDir = tmpFolder.newFolder("source")
properties.stubsOutputDir = tmpFolder.newFolder("target")
properties.excludedFiles = ["dir1/**"]
FileUtils.copyDirectory(originalSourceRootDirectory, properties.contractsDslDir)
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, properties)
when:
recursiveFilesConverter.processFiles()
then:
Collection<File> createdFiles = FileUtils.listFiles(properties.stubsOutputDir, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE)
Set<String> relativizedCreatedFiles = getRelativePathsForFilesInDirectory(createdFiles, properties.stubsOutputDir)
[Paths.get("dslRoot.json"), Paths.get("dir2/dsl2.json")] as Set == relativizedCreatedFiles as Set
and:
createdFiles.each { it.text == "converted" }
}
def "on failure should break processing and throw meaningful exception"() {
given:
def sourceFile = tmpFolder.newFile()
def sourceFile = tmpFolder.newFile("test.groovy")
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)
AccurestConfigProperties properties = new AccurestConfigProperties()
properties.contractsDslDir = tmpFolder.root
properties.stubsOutputDir = tmpFolder.root
RecursiveFilesConverter recursiveFilesConverter = new RecursiveFilesConverter(singleFileConverterStub, properties)
when:
recursiveFilesConverter.processFiles()
then:
@@ -55,7 +87,8 @@ class RecursiveFilesConverterSpec extends Specification {
e.cause?.message == "Test conversion error"
}
private static Set<Path> getRelativePathsForFilesInDirectory(Collection<File> createdFiles, File targetRootDirectory) {
private
static Set<Path> getRelativePathsForFilesInDirectory(Collection<File> createdFiles, File targetRootDirectory) {
Path rootSourcePath = Paths.get(targetRootDirectory.toURI())
Set<Path> relativizedCreatedFiles = createdFiles.collect { File file ->
rootSourcePath.relativize(Paths.get(file.toURI()))

View File

@@ -70,6 +70,7 @@ class AccurestGradlePlugin implements Plugin<Project> {
task.conventionMapping.with {
contractsDslDir = { extension.contractsDslDir }
stubsOutputDir = { extension.stubsOutputDir }
configProperties = { extension }
}
}

View File

@@ -1,5 +1,6 @@
package io.codearte.accurest.plugin
import io.codearte.accurest.config.AccurestConfigProperties
import io.codearte.accurest.wiremock.DslToWireMockClientConverter
import io.codearte.accurest.wiremock.RecursiveFilesConverter
import org.gradle.api.internal.ConventionTask
@@ -15,13 +16,14 @@ class GenerateWireMockClientStubsFromDslTask extends ConventionTask {
@OutputDirectory
File stubsOutputDir
AccurestConfigProperties configProperties
@TaskAction
void generate() {
logger.info("Accurest Plugin: Invoking GroovyDSL to WireMock client stubs conversion")
logger.debug("From '${getContractsDslDir()}' to '${getStubsOutputDir()}'")
RecursiveFilesConverter converter = new RecursiveFilesConverter(new DslToWireMockClientConverter(), getContractsDslDir(),
getStubsOutputDir())
RecursiveFilesConverter converter = new RecursiveFilesConverter(new DslToWireMockClientConverter(), getConfigProperties())
converter.processFiles()
}
}