Merge pull request #191 from Codearte/issues/189-wiremock-generators
Make Wiremock generator use ContractFileScanner. Fix #189
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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()))
|
||||
|
||||
@@ -70,6 +70,7 @@ class AccurestGradlePlugin implements Plugin<Project> {
|
||||
task.conventionMapping.with {
|
||||
contractsDslDir = { extension.contractsDslDir }
|
||||
stubsOutputDir = { extension.stubsOutputDir }
|
||||
configProperties = { extension }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user