/
ValidatorGroupsSpec.groovy
162 lines (129 loc) · 4.54 KB
/
ValidatorGroupsSpec.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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
package io.micronaut.validation.validator
import io.micronaut.annotation.processing.TypeElementVisitorProcessor
import io.micronaut.annotation.processing.test.AbstractTypeElementSpec
import io.micronaut.annotation.processing.test.JavaParser
import io.micronaut.context.ApplicationContext
import io.micronaut.core.annotation.Introspected
import io.micronaut.inject.beans.visitor.IntrospectedTypeElementVisitor
import io.micronaut.inject.visitor.TypeElementVisitor
import spock.lang.AutoCleanup
import spock.lang.Shared
import javax.annotation.processing.SupportedAnnotationTypes
import javax.validation.constraints.NotBlank
import javax.validation.constraints.NotEmpty
import javax.validation.constraints.Size
import javax.validation.groups.Default
class ValidatorGroupsSpec extends AbstractTypeElementSpec {
@Shared
@AutoCleanup
ApplicationContext applicationContext = ApplicationContext.run()
@Shared
Validator validator = applicationContext.getBean(Validator)
void "test validate groups"() {
given:
def address = new Address(street: "")
when:
def violations = validator.validate(address, GroupThree)
then:
violations.size() == 1
violations.iterator().next().message == 'different message'
when:
violations = validator.validate(address, GroupThree, GroupTwo)
List messageTemplates = violations*.messageTemplate
then:
violations.size() == 2
messageTemplates.contains('{javax.validation.constraints.Size.message}')
messageTemplates.contains('different message')
when:
violations = validator.validate(address, InheritedGroup)
messageTemplates = violations*.messageTemplate
then:
violations.size() == 2
messageTemplates.contains('{javax.validation.constraints.Size.message}')
messageTemplates.contains('message for default')
}
void "test validate with default group"() {
def address = new AddressTwo(street: "", city: "", zipCode: "")
when:
def violations = validator.validate(address)
List properties = violations*.propertyPath*.toString()
then:
violations.size() == 2
properties.contains("zipCode")
properties.contains("city")
when:
violations = validator.validate(address, GroupOne)
properties = violations*.propertyPath*.toString()
then:
violations.size() == 2
properties.contains("zipCode")
properties.contains("street")
when:
violations = validator.validate(address, GroupOne, Default)
properties = violations*.propertyPath*.toString()
then:
violations.size() == 3
properties.contains("zipCode")
properties.contains("street")
properties.contains("city")
}
void "test build introspection"() {
given:
def introspection = buildBeanIntrospection('test.Address', '''
package test;
import javax.validation.constraints.*;
@io.micronaut.core.annotation.Introspected
class Address {
@NotBlank(groups = GroupOne.class)
@NotBlank(groups = GroupThree.class, message = "different message")
@Size(min = 5, max = 20, groups = GroupTwo.class)
private String street;
public String getStreet() {
return this.street;
}
}
interface GroupOne {}
interface GroupTwo {}
interface GroupThree {}
''')
expect:
introspection != null
}
@Override
protected JavaParser newJavaParser() {
return new JavaParser() {
@Override
protected TypeElementVisitorProcessor getTypeElementVisitorProcessor() {
return new MyTypeElementVisitorProcessor()
}
}
}
@SupportedAnnotationTypes("*")
static class MyTypeElementVisitorProcessor extends TypeElementVisitorProcessor {
@Override
protected Collection<TypeElementVisitor> findTypeElementVisitors() {
return [new IntrospectedTypeElementVisitor()]
}
}
}
@Introspected
class Address {
@NotBlank(groups = GroupOne)
@NotBlank(groups = GroupThree, message = "different message")
@NotBlank(message = "message for default")
@Size(min = 5, max = 20, groups = GroupTwo)
String street
}
interface GroupOne {}
interface GroupTwo {}
interface GroupThree {}
interface InheritedGroup extends Default, GroupTwo {}
@Introspected
class AddressTwo {
@NotEmpty(groups = GroupOne.class)
String street
@NotEmpty
String city
@NotEmpty(groups = [GroupOne.class, Default.class])
String zipCode
}