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]

Reply via email to