/
ControllerDomainTransformerSpec.groovy
116 lines (94 loc) · 3.05 KB
/
ControllerDomainTransformerSpec.groovy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package org.codehaus.groovy.grails.compiler.web
import grails.spring.WebBeanBuilder
import grails.util.GrailsWebUtil
import grails.core.DefaultGrailsApplication
import org.grails.core.DomainClassArtefactHandler
import grails.core.GrailsApplication
import org.grails.core.metaclass.MetaClassEnhancer
import grails.compiler.ast.ClassInjector
import org.grails.compiler.injection.GrailsAwareClassLoader
import org.codehaus.groovy.grails.plugins.web.api.ControllersDomainBindingApi
import org.grails.web.servlet.mvc.GrailsWebRequest
import org.springframework.web.context.WebApplicationContext
import org.springframework.web.context.request.RequestContextHolder
import spock.lang.Specification
/**
* Tests for ControllerDomainTransformer
*/
class ControllerDomainTransformerSpec extends Specification {
void setup() {
GrailsWebUtil.bindMockWebRequest(applicationContext)
}
void cleanup() {
RequestContextHolder.setRequestAttributes(null)
}
void "Test binding constructor adding via AST"() {
given:
def cls = getTestClass()
when:
def test = cls.newInstance(age:"10")
then:
test.age == 10
}
void "Test setProperties method added via AST"() {
given:
def cls = getTestClass()
when:
def test = cls.newInstance()
test.properties = [age:"10"]
then:
test.age == 10
}
void "Test getProperties method added via AST"() {
given:
def cls = getTestClass()
when:
def test = cls.newInstance()
test.properties['age', 'name'] = [age:"10"]
then:
test.age == 10
}
void "Test transforming a @grails.persistence.Entity marked class doesn't generate duplication methods"() {
when:
def cls = classLoader.parseClass('''
@grails.persistence.Entity
class TestEntity {
Long id
}
''')
then:
cls
}
Class getTestClass() {
def cls = classLoader.parseClass('''
class Test {
Long id
Long version
Integer age
}
''')
GrailsApplication application = GrailsWebRequest.lookup().applicationContext.grailsApplication
application.initialise()
application.addArtefact(DomainClassArtefactHandler.TYPE,cls)
MetaClassEnhancer enhancer = new MetaClassEnhancer()
enhancer.addApi(new ControllersDomainBindingApi())
enhancer.enhance(cls.metaClass)
return cls
}
GroovyClassLoader getClassLoader() {
def gcl = new GrailsAwareClassLoader()
def transformer = new ControllerDomainTransformer() {
@Override
boolean shouldInject(URL url) { true }
}
gcl.classInjectors = [transformer] as ClassInjector[]
return gcl
}
WebApplicationContext getApplicationContext() {
def bb = new WebBeanBuilder()
bb.beans {
grailsApplication(DefaultGrailsApplication)
}
bb.createApplicationContext()
}
}