[#22] Rework generate server tests task

This commit is contained in:
Marcin Zajaczkowski
2015-02-21 12:15:13 +01:00
parent 4dc4f1d37c
commit 10fb15190b
6 changed files with 72 additions and 56 deletions

View File

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

View File

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

View File

@@ -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<String> ignoredFiles = []
String generatedTestSourcesDir = 'build/generated-sources/accurest'
File generatedTestSourcesDir
String[] imports = []
String[] staticImports = []
File groovyDslDir

View File

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

View File

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

View File

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