-
Notifications
You must be signed in to change notification settings - Fork 32
/
RestBuilderSpec.groovy
262 lines (215 loc) · 10.4 KB
/
RestBuilderSpec.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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
package grails.plugins.rest.client
import grails.converters.JSON
import grails.test.mixin.TestMixin
import grails.test.mixin.web.ControllerUnitTestMixin
import grails.web.JSONBuilder
import groovy.util.slurpersupport.GPathResult
import org.codehaus.groovy.grails.web.json.JSONArray
import org.codehaus.groovy.grails.web.json.JSONObject
import spock.lang.Issue
import spock.lang.Specification
@TestMixin(ControllerUnitTestMixin)
class RestBuilderSpec extends Specification {
def "Test proxy configuration"() {
when:"RestBuilder is configured with proxy settings"
def rest = new RestBuilder(proxy:['localhost':8888])
def proxyAddress = rest.restTemplate.requestFactory?.@proxy?.address()
then:"The proxy settings are correct"
proxyAddress != null
proxyAddress.hostName == "localhost"
proxyAddress.port == 8888
}
def "Test that a basic GET request returns a JSON result of the response type is JSON"(){
given:"A rest client instance"
def rest = new RestBuilder()
when:"A get request is issued for a response that returns XML"
def resp = rest.get("http://grails.org/api/v1.0/plugin/acegi/")
then:"The response is a gpath result"
resp != null
resp.json instanceof JSONObject
resp.json.name == 'acegi'
}
def "Test that obtaining a 404 response doesn't throw an exception but instead returns the response object for inspection"() {
given:"A rest client instance"
def rest = new RestBuilder()
when:"A get request is issued to a URL that returns a 404"
def resp = rest.get("http://grails.org/api/v1.0/plugin/nonsense") {
accept "application/xml"
}
then:"Check the status"
resp.status == 404
resp.text instanceof String
resp.body instanceof byte[]
}
def "Test that a basic GET request returns a JSON result of the response type is JSON with custom settings"(){
given:"A rest client instance"
def rest = new RestBuilder(connectTimeout:1000, readTimeout:20000)
when:"A get request is issued for a response that returns XML"
def resp = rest.get("http://grails.org/api/v1.0/plugin/acegi/")
then:"The response is a gpath result"
resp != null
resp.json instanceof JSONObject
resp.json.name == 'acegi'
}
def "Test that a basic GET request returns a XML result of the response type is XML"(){
given:"A rest client instance"
def rest = new RestBuilder()
when:"A get request is issued for a response that returns XML"
def resp = rest.get("http://grails.org/api/v1.0/plugin/acegi/") {
accept 'application/xml'
}
then:"The response is a gpath result"
resp != null
resp.xml instanceof GPathResult
resp.xml.name == 'acegi'
}
def "Test basic authentication with GET request"() {
given:"A rest client instance"
def rest = new RestBuilder()
when:"A get request is issued for a response that returns XML"
def resp = rest.get("http://repo.grails.org/grails/api/security/users"){
auth System.getProperty("artifactory.user"), System.getProperty("artifactory.pass")
}
then:"The response is a gpath result"
resp != null
resp.json instanceof JSONArray
}
def "Test basic authentication with PUT request"() {
given:"A rest client instance"
def rest = new RestBuilder()
when:"A get request is issued for a response that returns XML"
def resp = rest.put("http://repo.grails.org/grails/api/security/groups/test-group"){
auth System.getProperty("artifactory.user"), System.getProperty("artifactory.pass")
contentType "application/vnd.org.jfrog.artifactory.security.Group+json"
json {
name = "test-group"
description = "A temporary test group"
}
}
then:"The response is a gpath result"
resp != null
resp.status == 201
resp.text == "Created"
when:"The resource contents are requested"
resp = rest.get("http://repo.grails.org/grails/api/security/groups/test-group") {
auth System.getProperty("artifactory.user"), System.getProperty("artifactory.pass")
}
then:"The contents are valid"
resp != null
resp.json.name == 'test-group'
when:"The resource is deleted"
resp = rest.delete("http://repo.grails.org/grails/api/security/groups/test-group") {
auth System.getProperty("artifactory.user"), System.getProperty("artifactory.pass")
}
then:"The resource is gone"
resp != null
resp.status == 200
resp.text == "Group 'test-group' has been removed successfully."
}
def "Test basic authentication with PUT request and JSON body"() {
given:"A rest client instance"
def rest = new RestBuilder()
when:"A get request is issued for a response that returns XML"
def builder = new JSONBuilder()
JSON j = builder.build {
name = "test-group"
description = "A temporary test group"
}
def resp = rest.put("http://repo.grails.org/grails/api/security/groups/test-group"){
auth System.getProperty("artifactory.user"), System.getProperty("artifactory.pass")
contentType "application/vnd.org.jfrog.artifactory.security.Group+json"
body j
}
then:"The response is a gpath result"
resp != null
resp.status == 201
resp.text == "Created"
when:"The resource contents are requested"
resp = rest.get("http://repo.grails.org/grails/api/security/groups/test-group") {
auth System.getProperty("artifactory.user"), System.getProperty("artifactory.pass")
}
then:"The contents are valid"
resp != null
resp.json.name == 'test-group'
when:"The resource is deleted"
resp = rest.delete("http://repo.grails.org/grails/api/security/groups/test-group") {
auth System.getProperty("artifactory.user"), System.getProperty("artifactory.pass")
}
then:"The resource is gone"
resp != null
resp.status == 200
resp.text == "Group 'test-group' has been removed successfully."
}
def "Test basic authentication with PUT request and JSON as map"() {
given:"A rest client instance"
def rest = new RestBuilder()
when:"A get request is issued for a response that returns XML"
def builder = new JSONBuilder()
def j = [
name : "test-group",
description : "A temporary test group"
]
def resp = rest.put("http://repo.grails.org/grails/api/security/groups/test-group"){
auth System.getProperty("artifactory.user"), System.getProperty("artifactory.pass")
contentType "application/vnd.org.jfrog.artifactory.security.Group+json"
json j
}
then:"The response is a gpath result"
resp != null
resp.status == 201
resp.text == "Created"
when:"The resource contents are requested"
resp = rest.get("http://repo.grails.org/grails/api/security/groups/test-group") {
auth System.getProperty("artifactory.user"), System.getProperty("artifactory.pass")
}
then:"The contents are valid"
resp != null
resp.json.name == 'test-group'
when:"The resource is deleted"
resp = rest.delete("http://repo.grails.org/grails/api/security/groups/test-group") {
auth System.getProperty("artifactory.user"), System.getProperty("artifactory.pass")
}
then:"The resource is gone"
resp != null
resp.status == 200
resp.text == "Group 'test-group' has been removed successfully."
}
def "Test PUT request passing binary content in the body"() {
setup:
def rest = new RestBuilder(connectTimeout: 1000, readTimeout:10000)
rest.delete("http://repo.grails.org/grails/libs-snapshots-local/org/mycompany/1.0/foo-1.0.jar") {
auth System.getProperty("artifactory.user"), System.getProperty("artifactory.pass")
}
when:"A put request is issued that contains binary content"
def resp = rest.put("http://repo.grails.org/grails/libs-snapshots-local/org/mycompany/1.0/foo-1.0.jar") {
auth System.getProperty("artifactory.user"), System.getProperty("artifactory.pass")
body "foo".bytes
}
then:"The response JSON is correct"
resp.json.uri == "http://repo.grails.org/grails/libs-snapshots-local/org/mycompany/1.0/foo-1.0.jar"
new URL( "http://repo.grails.org/grails/libs-snapshots-local/org/mycompany/1.0/foo-1.0.jar").text == "foo"
}
// Note that this test uses JSON query parameters, but they are not actually validated due to the call
// not using them. If a call that processes JSON URL parameters if used, this test would mean much more.
@Issue("https://github.com/grails-plugins/grails-rest-client-builder/issues/3")
def "Test URL variables for JSON URL paremeters"() {
given:"A rest client instance"
def rest = new RestBuilder()
when:"A get request with URL parameters defined as an implicit map"
def resp = rest.get("http://grails.org/api/v1.0/plugin/acegi/?query={query}&filter={filter}") {
urlVariables query:'{"query":true}', filter:'{"filter":true}'
}
then:"The response is a gpath result"
resp != null
resp.json instanceof JSONObject
resp.json.name == 'acegi'
when:"A get request with URL parameters defined as an explicit map"
resp = rest.get("http://grails.org/api/v1.0/plugin/acegi/?query={query}&filter={filter}") {
urlVariables([query:'{"query":true}', filter:'{"filter":true}'])
}
then:"The response is a gpath result"
resp != null
resp.json instanceof JSONObject
resp.json.name == 'acegi'
}
}