ework.profiles.base.2023.1.0-M2.source-code.test-app.groovy Maven / Gradle / Ivy
import org.grails.io.watch.*
description("Runs the applications tests") {
usage "grace test-app [TEST NAME]"
completer TestsCompleter
synonyms 'test'
argument name:"Test Name", description:"The name of the test to run (optional)", required:false
flag name:'debug-jvm', description:"Starts the JVM in debug mode allowing attachment of a remote debugger"
flag name:'unit', description:"Run unit tests (test target)"
flag name:'integration', description:"Run integration tests (integrationTest target)"
flag name:'clean', description:"Re-run all tests (cleanTest cleanIntegrationTest target)"
flag name:'continuous', description:"Monitor the project for changes and reruns tests automatically on each change"
}
// configure environment to test is not specified
if(!commandLine.isEnvironmentSet()) {
System.setProperty('grails.env', 'test')
} else {
System.setProperty('grails.env', commandLine.environment)
}
// add test.single argument if specified
def testsFilter = commandLine.remainingArgs.collect { "--tests $it".toString() }.join(' ')?.trim()
boolean debugJvm = flag('debug-jvm')
def handleTestPhase = { targetName ->
def args = []
if(flag('clean')) {
args << "clean${targetName.capitalize()}"
}
args << targetName
if(testsFilter) {
args << testsFilter
}
// add debug flag if present
if(debugJvm) {
args << "--debug-jvm"
}
args
}
def gradleArgs = []
boolean executeUnitTests = flag('unit') || !flag('integration')
if(executeUnitTests) {
gradleArgs.addAll handleTestPhase('test')
}
boolean hasIntegrationTests = file("src/integration-test").isDirectory()
boolean executeIntegrationTests = hasIntegrationTests && (flag('integration') || !flag('unit'))
if(executeIntegrationTests) {
gradleArgs.addAll handleTestPhase('integrationTest')
}
runTests = { List args ->
def additionalArguments = []
commandLine.systemProperties.each { key, value ->
additionalArguments << "-D${key}=$value".toString()
}
additionalArguments << "-Dgrails.run.active=true"
try {
gradle."${args.join(' ')}"(*additionalArguments)
addStatus "Tests PASSED"
return true
} catch(e) {
console.error "Tests FAILED", "Test execution failed"
return false
}
}
if(flag('continuous')) {
def watcher = new DirectoryWatcher()
def ext = ['groovy', 'java']
watcher.addWatchDirectory( file("app"), ext)
watcher.addWatchDirectory( file("src/main/groovy"), ext)
watcher.addWatchDirectory( file("src/test/groovy"), ext)
watcher.addWatchDirectory( file("src/integration-test/groovy"), ext)
watcher.addListener( new FileExtensionFileChangeListener(ext) {
void onChange(File file, List extensions) {
console.addStatus "File ${projectPath(file)} changed. Running tests..."
runTests(gradleArgs)
}
void onNew(File file, List extensions) {
console.addStatus "File ${projectPath(file)} changed. Running tests..."
runTests(gradleArgs)
}
})
watcher.sleepTime = 0
watcher.start()
console.addStatus "Started continuous test runner. Monitoring files for changes..."
}
else {
runTests(gradleArgs)
}