@@ -5,17 +5,19 @@ import grails.test.mixin.integration.Integration
55import groovy.transform.CompileStatic
66import org.codehaus.groovy.ast.*
77import org.codehaus.groovy.ast.expr.*
8- import org.codehaus.groovy.ast.stmt.BlockStatement
9- import org.codehaus.groovy.ast.stmt.ExpressionStatement
8+ import org.codehaus.groovy.ast.stmt.*
109import org.codehaus.groovy.control.CompilePhase
1110import org.codehaus.groovy.control.SourceUnit
11+ import org.codehaus.groovy.syntax.Token
12+ import org.codehaus.groovy.syntax.Types
1213import org.codehaus.groovy.transform.ASTTransformation
1314import org.codehaus.groovy.transform.GroovyASTTransformation
1415import org.grails.compiler.injection.GrailsASTUtils
1516import org.grails.io.support.MainClassFinder
1617import org.grails.test.context.junit4.GrailsJunit4ClassRunner
1718import org.grails.test.context.junit4.GrailsTestConfiguration
1819import org.junit.runner.RunWith
20+ import org.springframework.beans.factory.annotation.Autowired
1921import org.springframework.beans.factory.annotation.Value
2022import org.springframework.beans.factory.config.AutowireCapableBeanFactory
2123import org.springframework.boot.test.IntegrationTest
@@ -168,20 +170,36 @@ class IntegrationTestMixinTransformation implements ASTTransformation {
168170
169171 protected void enhanceGebSpecWithPort (ClassNode classNode ) {
170172 if (GrailsASTUtils . isSubclassOf(classNode, " geb.spock.GebSpec" )) {
171- def integerClassNode = ClassHelper . make(Integer )
172- def param = new Parameter (integerClassNode, " port" )
173- def setterBody = new BlockStatement ()
173+ def contextPathParameter = new Parameter (ClassHelper . make(String ), ' serverContextPath' )
174+ def cpValueAnnotation = new AnnotationNode (ClassHelper . make(Value ))
175+ cpValueAnnotation. setMember(' value' , new ConstantExpression (' ${server.contextPath:/}' ))
176+ contextPathParameter. addAnnotation(cpValueAnnotation)
177+
178+ def serverPortParameter = new Parameter (ClassHelper . make(Integer . TYPE ), ' serverPort' )
179+ def spValueAnnotation = new AnnotationNode (ClassHelper . make(Value ))
180+ spValueAnnotation. setMember(' value' , new ConstantExpression (' ${local.server.port}' ))
181+ serverPortParameter. addAnnotation(spValueAnnotation)
182+
183+ Expression urlExpression = new GStringExpression (' http://localhost:${serverPort}${serverContextPath}' , [new ConstantExpression (' http://localhost:' ), new ConstantExpression (" " ), new ConstantExpression (" " )], [new VariableExpression (' serverPort' ), new VariableExpression (' serverContextPath' )] as List<Expression > )
184+
185+ Expression baseUrlVariableExpression = new VariableExpression (' $baseUrl' , ClassHelper . make(String ))
186+ Expression declareBaseUrlExpression = new DeclarationExpression (baseUrlVariableExpression, Token . newSymbol(Types . EQUALS , 0 , 0 ), new MethodCallExpression (urlExpression, ' toString' , new ArgumentListExpression ()))
187+
188+ Expression constantSlashExpression = new ConstantExpression (' /' )
189+ Expression endsWithMethodCall = new MethodCallExpression (baseUrlVariableExpression, ' endsWith' , new ArgumentListExpression (constantSlashExpression))
190+ Expression appendSlashExpression = new BinaryExpression (baseUrlVariableExpression, Token . newSymbol(Types . PLUS_EQUAL , 0 , 0 ), constantSlashExpression)
191+ Statement ifUrlEndsWithSlashStatement = new IfStatement (new BooleanExpression (endsWithMethodCall), new EmptyStatement (), new ExpressionStatement (appendSlashExpression))
192+ def methodBody = new BlockStatement ()
193+ methodBody. addStatement(new ExpressionStatement (declareBaseUrlExpression))
194+ methodBody. addStatement(ifUrlEndsWithSlashStatement)
174195 def systemClassExpression = new ClassExpression (ClassHelper . make(System ))
175196 def args = new ArgumentListExpression ()
176197 args. addExpression(new ConstantExpression (" geb.build.baseUrl" ))
177- args. addExpression(new GStringExpression (' http://localhost:${port}' , [new ConstantExpression (" http://localhost:" ), new ConstantExpression (" " )], [new VariableExpression (param)] as List<Expression > ))
178- setterBody. addStatement(new ExpressionStatement (new MethodCallExpression (systemClassExpression, " setProperty" , args)))
179- def method = new MethodNode (" setGebPort" , Modifier . PUBLIC , ClassHelper . VOID_TYPE , [param] as Parameter [], null , setterBody)
180- def valueAnnotation = new AnnotationNode (ClassHelper . make(Value ))
181- valueAnnotation. setMember(" value" , new ConstantExpression (' ${local.server.port}' ))
182- method. addAnnotation(valueAnnotation)
198+ args. addExpression(baseUrlVariableExpression)
199+ methodBody. addStatement(new ExpressionStatement (new MethodCallExpression (systemClassExpression, " setProperty" , args)))
200+ def method = new MethodNode (" configureGebBaseUrl" , Modifier . PUBLIC , ClassHelper . VOID_TYPE , [contextPathParameter, serverPortParameter] as Parameter [], null , methodBody)
201+ method. addAnnotation(new AnnotationNode (ClassHelper . make(Autowired )))
183202 classNode. addMethod(method)
184203 }
185204 }
186-
187205}
0 commit comments