Copilot commented on code in PR #16111:
URL: https://github.com/apache/grails-core/pull/16111#discussion_r3731547471
##########
grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/lang/GrailsApplicationSpec.groovy:
##########
@@ -58,11 +59,26 @@ class GrailsApplicationSpec extends BeanContextSpec
implements CommandOutputFixt
output.containsKey("grails-app/init/example/grails/Application.${Language.GROOVY.extension}".toString())
def applicationGroovyFile =
output.get("grails-app/init/example/grails/Application.${Language.GROOVY.extension}".toString())
applicationGroovyFile.contains("@PluginSource")
+ applicationGroovyFile.contains("@ComponentScan(value =
'example.grails')")
where:
applicationType << [ApplicationType.PLUGIN, ApplicationType.WEB_PLUGIN]
}
+ void 'profile Application skeletons configure base-package component
scanning'() {
+ given:
+ File profiles = new File('../../grails-profiles').canonicalFile
Review Comment:
Using a hard-coded relative path makes this test sensitive to the JVM
working directory (e.g., different CI runners / IDEs). Prefer resolving the
repository root via a known project/system property (or a
classpath/resource-based approach) and then resolving `grails-profiles` from
that stable base.
##########
grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/lang/GrailsApplicationSpec.groovy:
##########
@@ -58,11 +59,26 @@ class GrailsApplicationSpec extends BeanContextSpec
implements CommandOutputFixt
output.containsKey("grails-app/init/example/grails/Application.${Language.GROOVY.extension}".toString())
def applicationGroovyFile =
output.get("grails-app/init/example/grails/Application.${Language.GROOVY.extension}".toString())
applicationGroovyFile.contains("@PluginSource")
+ applicationGroovyFile.contains("@ComponentScan(value =
'example.grails')")
where:
applicationType << [ApplicationType.PLUGIN, ApplicationType.WEB_PLUGIN]
}
+ void 'profile Application skeletons configure base-package component
scanning'() {
+ given:
+ File profiles = new File('../../grails-profiles').canonicalFile
+
+ expect:
+ ['base', 'plugin'].every { String profile ->
+ File application = new File(profiles,
"${profile}/skeleton/grails-app/init/@grails.codegen.defaultPackage.path@/Application.groovy")
+ assert application.file, "missing profile Application skeleton
${application}"
+ assert application.text.contains('import
org.springframework.context.annotation.ComponentScan')
Review Comment:
`application` is a `java.io.File`, and `application.file` is not a valid
property/method on `File` (this will throw at runtime). Use an existence check
such as `application.exists()` / `application.isFile()` instead so the
assertion reliably validates the skeleton file is present.
##########
grails-forge/test-core/src/test/groovy/org/grails/forge/create/CreateAppSpec.groovy:
##########
@@ -60,72 +61,158 @@ class CreateAppSpec extends CommandSpec {
new File(dir, "grails-app/i18n").exists()
}
- void "test create-app creates a correct Application.groovy"() {
+ @Unroll
+ void "test create-app #applicationType creates a correct
Application.groovy"() {
given:
- generateProject(OperatingSystem.MACOS_ARCH64, [],
ApplicationType.DEFAULT_OPTION)
+ generateProject(OperatingSystem.MACOS_ARCH64, [], applicationType)
def applicationClassSourceFile = new File(dir,
'grails-app/init/example/grails/Application.groovy')
expect:
applicationClassSourceFile.exists()
- applicationClassSourceFile.text == '''\
+ applicationClassSourceFile.text == applicationSource.stripIndent(8)
+
+ where:
+ applicationType | applicationSource
+ ApplicationType.WEB | '''\
package example.grails
import groovy.transform.CompileStatic
+ import org.springframework.context.annotation.ComponentScan
+
import grails.boot.GrailsApp
import grails.boot.config.GrailsAutoConfiguration
@CompileStatic
+ @ComponentScan(value = 'example.grails')
class Application extends GrailsAutoConfiguration {
static void main(String[] args) {
GrailsApp.run(Application, args)
}
}
- '''.stripIndent(8)
- }
+ '''
+ ApplicationType.REST_API | '''\
+ package example.grails
- void "test create-app with micronaut feature"() {
- given:
- // Micronaut features require JDK 25+ because micronaut-core's
ScopedValues
- // references java.lang.ScopedValue.CallableOp (JEP 506, finalized in
JDK 25).
- generateProject(OperatingSystem.MACOS_ARCH64, ['grails-micronaut'],
ApplicationType.WEB,
- DevelopmentReloading.DEFAULT_OPTION, JdkVersion.JDK_25)
+ import groovy.transform.CompileStatic
- def gradleProperties = new File(dir, 'gradle.properties')
- def gradleBuildFile = new File(dir, 'build.gradle')
+ import org.springframework.context.annotation.ComponentScan
- expect:
- gradleProperties.exists()
- gradleProperties.text.contains('micronautPlatformVersion=4.10.16')
- gradleBuildFile.exists()
- gradleBuildFile.text.contains('implementation
"org.apache.grails:grails-micronaut"')
- }
+ import grails.boot.GrailsApp
+ import grails.boot.config.GrailsAutoConfiguration
- void "test create-app web-plugin creates a correct Application.groovy"() {
- given:
- generateProject(OperatingSystem.MACOS_ARCH64, [],
ApplicationType.WEB_PLUGIN)
+ @CompileStatic
+ @ComponentScan(value = 'example.grails')
+ class Application extends GrailsAutoConfiguration {
+ static void main(String[] args) {
+ GrailsApp.run(Application, args)
+ }
+ }
+ '''
+ ApplicationType.PLUGIN | '''\
+ package example.grails
- def applicationClassSourceFile = new File(dir,
'grails-app/init/example/grails/Application.groovy')
+ import groovy.transform.CompileStatic
- expect:
- applicationClassSourceFile.exists()
- applicationClassSourceFile.text == '''\
+ import org.springframework.context.annotation.ComponentScan
+
+ import grails.boot.GrailsApp
+ import grails.boot.config.GrailsAutoConfiguration
+ import grails.plugins.metadata.PluginSource
+
+ @PluginSource
+ @CompileStatic
+ @ComponentScan(value = 'example.grails')
+ class Application extends GrailsAutoConfiguration {
+ static void main(String[] args) {
+ GrailsApp.run(Application, args)
+ }
+ }
+ '''
+ ApplicationType.WEB_PLUGIN | '''\
package example.grails
import groovy.transform.CompileStatic
+ import org.springframework.context.annotation.ComponentScan
+
import grails.boot.GrailsApp
import grails.boot.config.GrailsAutoConfiguration
import grails.plugins.metadata.PluginSource
@PluginSource
@CompileStatic
+ @ComponentScan(value = 'example.grails')
class Application extends GrailsAutoConfiguration {
static void main(String[] args) {
GrailsApp.run(Application, args)
}
}
- '''.stripIndent(8)
+ '''
+ }
+
+ void "test generated application scans standard Spring components"() {
+ given:
+ generateProject(OperatingSystem.MACOS_ARCH64)
+ File componentSourceFile = new File(dir,
'src/main/groovy/example/grails/components/ScannedComponent.groovy')
+ componentSourceFile.parentFile.mkdirs()
+ componentSourceFile.text = '''\
+ package example.grails.components
+
+ import org.springframework.stereotype.Component
+
+ @Component
+ class ScannedComponent {
+ String value() {
+ 'scanned'
+ }
+ }
+ '''.stripIndent()
+ File componentSpecFile = new File(dir,
'src/test/groovy/example/grails/ComponentScanningSpec.groovy')
+ componentSpecFile.parentFile.mkdirs()
+ componentSpecFile.text = '''\
+ package example.grails
+
+ import example.grails.components.ScannedComponent
+ import grails.testing.mixin.integration.Integration
+ import org.springframework.beans.factory.annotation.Autowired
+ import spock.lang.Specification
+
+ @Integration
+ class ComponentScanningSpec extends Specification {
+
+ @Autowired
+ ScannedComponent scannedComponent
+
+ void "standard Spring component is injected"() {
+ expect:
+ scannedComponent.value() == 'scanned'
+ }
+ }
+ '''.stripIndent()
+
+ when:
+ String output = executeGradle('test', '--tests',
'example.grails.ComponentScanningSpec').output
+
+ then:
+ output.contains('BUILD SUCCESSFUL')
Review Comment:
Asserting success via console output text is brittle (Gradle output can
change with logging level/version). If `executeGradle(...)` exposes an exit
status or task outcomes, assert on those instead (e.g., exit code == 0 and/or
the `:test` task outcome is `SUCCESS`).
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]