apirunner 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION +1 -1
- data/apirunner.gemspec +1 -1
- data/examples/test/api_runner/001_create_user.yml +3 -5
- data/examples/test/api_runner/002_update_resources.yml +236 -0
- data/examples/test/api_runner/003_update_ratings.yml +26 -0
- data/examples/test/api_runner/999_delete_user.yml +25 -0
- data/lib/expectation_matcher.rb +14 -1
- data/lib/http_client.rb +0 -1
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.1
|
data/apirunner.gemspec
CHANGED
@@ -87,7 +87,6 @@
|
|
87
87
|
method: 'PUT'
|
88
88
|
body:
|
89
89
|
"m1035": 1
|
90
|
-
"m2087": 0.5
|
91
90
|
"m1554": 2
|
92
91
|
"m2981": 1.0
|
93
92
|
"m1590": 2
|
@@ -122,7 +121,6 @@
|
|
122
121
|
- m78
|
123
122
|
ratings:
|
124
123
|
"m1035": "1.0"
|
125
|
-
"m2087": "0.5"
|
126
124
|
"m1554": "2.0"
|
127
125
|
"m2981": "1.0"
|
128
126
|
"m1590": "2.0"
|
@@ -130,7 +128,7 @@
|
|
130
128
|
"m1875": "5.0"
|
131
129
|
"m7258": "2.5"
|
132
130
|
- name: 'User creation should fail on wrong username'
|
133
|
-
priority:
|
131
|
+
priority: 1
|
134
132
|
request:
|
135
133
|
headers:
|
136
134
|
Content-Type: 'application/json'
|
@@ -141,7 +139,7 @@
|
|
141
139
|
response_expectation:
|
142
140
|
status_code: 409
|
143
141
|
- name: 'User creation should fail on wrong fsk'
|
144
|
-
priority:
|
142
|
+
priority: 1
|
145
143
|
request:
|
146
144
|
headers:
|
147
145
|
Content-Type: 'application/json'
|
@@ -153,7 +151,7 @@
|
|
153
151
|
response_expectation:
|
154
152
|
status_code: 409
|
155
153
|
- name: 'User creation should fail on wrong expiration_date'
|
156
|
-
priority:
|
154
|
+
priority: 1
|
157
155
|
request:
|
158
156
|
headers:
|
159
157
|
Content-Type: 'application/json'
|
@@ -1 +1,237 @@
|
|
1
1
|
---
|
2
|
+
- name: 'Update existing user - update watchlist'
|
3
|
+
request:
|
4
|
+
headers:
|
5
|
+
Content-Type: 'application/json'
|
6
|
+
path: '/users/duffyduck/watchlist'
|
7
|
+
method: 'PUT'
|
8
|
+
body:
|
9
|
+
- m367
|
10
|
+
- m73
|
11
|
+
- m42
|
12
|
+
- m23
|
13
|
+
response_expectation:
|
14
|
+
status_code: 204
|
15
|
+
body:
|
16
|
+
- name: 'Check users watchlist afterwards'
|
17
|
+
request:
|
18
|
+
headers:
|
19
|
+
Content-Type: 'application/json'
|
20
|
+
path: '/users/duffyduck'
|
21
|
+
method: 'GET'
|
22
|
+
response_expectation:
|
23
|
+
status_code: 200
|
24
|
+
headers:
|
25
|
+
Last-Modified: /.*/
|
26
|
+
body:
|
27
|
+
username: 'duffyduck'
|
28
|
+
watchlist:
|
29
|
+
- m367
|
30
|
+
- m73
|
31
|
+
- m42
|
32
|
+
- m23
|
33
|
+
- name: 'Update existing user - clean watchlist'
|
34
|
+
request:
|
35
|
+
headers:
|
36
|
+
Content-Type: 'application/json'
|
37
|
+
path: '/users/duffyduck/watchlist'
|
38
|
+
method: 'PUT'
|
39
|
+
body: []
|
40
|
+
response_expectation:
|
41
|
+
status_code: 204
|
42
|
+
- name: 'Check users watchlist for emptyness afterwards'
|
43
|
+
request:
|
44
|
+
headers:
|
45
|
+
Content-Type: 'application/json'
|
46
|
+
path: '/users/duffyduck'
|
47
|
+
method: 'GET'
|
48
|
+
response_expectation:
|
49
|
+
status_code: 200
|
50
|
+
headers:
|
51
|
+
Last-Modified: /.*/
|
52
|
+
body:
|
53
|
+
username: 'duffyduck'
|
54
|
+
watchlist: []
|
55
|
+
- name: 'Update existing user - update skiplist'
|
56
|
+
request:
|
57
|
+
headers:
|
58
|
+
Content-Type: 'application/json'
|
59
|
+
path: '/users/duffyduck/skiplist'
|
60
|
+
method: 'PUT'
|
61
|
+
body:
|
62
|
+
- m366
|
63
|
+
- m72
|
64
|
+
- m41
|
65
|
+
- m22
|
66
|
+
response_expectation:
|
67
|
+
status_code: 204
|
68
|
+
body:
|
69
|
+
- name: 'Check users skiplist afterwards'
|
70
|
+
request:
|
71
|
+
headers:
|
72
|
+
Content-Type: 'application/json'
|
73
|
+
path: '/users/duffyduck'
|
74
|
+
method: 'GET'
|
75
|
+
response_expectation:
|
76
|
+
status_code: 200
|
77
|
+
headers:
|
78
|
+
Last-Modified: /.*/
|
79
|
+
body:
|
80
|
+
username: 'duffyduck'
|
81
|
+
skiplist:
|
82
|
+
- m366
|
83
|
+
- m72
|
84
|
+
- m41
|
85
|
+
- m22
|
86
|
+
- name: 'Update existing user - clean skiplist'
|
87
|
+
request:
|
88
|
+
headers:
|
89
|
+
Content-Type: 'application/json'
|
90
|
+
path: '/users/duffyduck/skiplist'
|
91
|
+
method: 'PUT'
|
92
|
+
body: []
|
93
|
+
response_expectation:
|
94
|
+
status_code: 204
|
95
|
+
body:
|
96
|
+
- name: 'Check users skiplist emptyness afterwards'
|
97
|
+
request:
|
98
|
+
headers:
|
99
|
+
Content-Type: 'application/json'
|
100
|
+
path: '/users/duffyduck'
|
101
|
+
method: 'GET'
|
102
|
+
response_expectation:
|
103
|
+
status_code: 200
|
104
|
+
headers:
|
105
|
+
Last-Modified: /.*/
|
106
|
+
body:
|
107
|
+
username: 'duffyduck'
|
108
|
+
skiplist: []
|
109
|
+
- name: 'Update existing user - update blacklist'
|
110
|
+
request:
|
111
|
+
headers:
|
112
|
+
Content-Type: 'application/json'
|
113
|
+
path: '/users/duffyduck/blacklist'
|
114
|
+
method: 'PUT'
|
115
|
+
body:
|
116
|
+
- m365
|
117
|
+
- m71
|
118
|
+
- m40
|
119
|
+
- m21
|
120
|
+
response_expectation:
|
121
|
+
status_code: 204
|
122
|
+
body:
|
123
|
+
- name: 'Check Users blacklist afterwards'
|
124
|
+
request:
|
125
|
+
headers:
|
126
|
+
Content-Type: 'application/json'
|
127
|
+
path: '/users/duffyduck'
|
128
|
+
method: 'GET'
|
129
|
+
response_expectation:
|
130
|
+
status_code: 200
|
131
|
+
headers:
|
132
|
+
Last-Modified: /.*/
|
133
|
+
body:
|
134
|
+
username: 'duffyduck'
|
135
|
+
blacklist:
|
136
|
+
- m365
|
137
|
+
- m71
|
138
|
+
- m40
|
139
|
+
- m21
|
140
|
+
- name: 'Update existing user - clean blacklist'
|
141
|
+
request:
|
142
|
+
headers:
|
143
|
+
Content-Type: 'application/json'
|
144
|
+
path: '/users/duffyduck/blacklist'
|
145
|
+
method: 'PUT'
|
146
|
+
body: []
|
147
|
+
response_expectation:
|
148
|
+
status_code: 204
|
149
|
+
body:
|
150
|
+
- name: 'Check users blacklist emptyness afterwards'
|
151
|
+
request:
|
152
|
+
headers:
|
153
|
+
Content-Type: 'application/json'
|
154
|
+
path: '/users/duffyduck'
|
155
|
+
method: 'GET'
|
156
|
+
response_expectation:
|
157
|
+
status_code: 200
|
158
|
+
headers:
|
159
|
+
Last-Modified: /.*/
|
160
|
+
body:
|
161
|
+
username: 'duffyduck'
|
162
|
+
blacklist: []
|
163
|
+
- name : 'Watchlist update of a non existing profile should return 404'
|
164
|
+
request:
|
165
|
+
headers:
|
166
|
+
Content-Type: 'application/json'
|
167
|
+
path: '/users/foobarfooz/watchlist'
|
168
|
+
method: 'PUT'
|
169
|
+
body:
|
170
|
+
watchlist:
|
171
|
+
- m365
|
172
|
+
- m71
|
173
|
+
response_expectation:
|
174
|
+
status_code: 404
|
175
|
+
- name : 'Skiplist update of a non existing profile should return 404'
|
176
|
+
request:
|
177
|
+
headers:
|
178
|
+
Content-Type: 'application/json'
|
179
|
+
path: '/users/foobarfooz/skiplist'
|
180
|
+
method: 'PUT'
|
181
|
+
body:
|
182
|
+
skiplist:
|
183
|
+
- m365
|
184
|
+
- m71
|
185
|
+
response_expectation:
|
186
|
+
status_code: 404
|
187
|
+
- name : 'Blacklist update of a non existing profile should return 404'
|
188
|
+
request:
|
189
|
+
headers:
|
190
|
+
Content-Type: 'application/json'
|
191
|
+
path: '/users/foobarfooz/blacklist'
|
192
|
+
method: 'PUT'
|
193
|
+
body:
|
194
|
+
blacklist:
|
195
|
+
- m365
|
196
|
+
- m71
|
197
|
+
response_expectation:
|
198
|
+
status_code: 404
|
199
|
+
- name : 'Watchlist update with non existing movies should return 409'
|
200
|
+
request:
|
201
|
+
headers:
|
202
|
+
Content-Type: 'application/json'
|
203
|
+
path: '/users/duffyduck/watchlist'
|
204
|
+
method: 'PUT'
|
205
|
+
body:
|
206
|
+
watchlist:
|
207
|
+
- m9999999999999999
|
208
|
+
- m8888888888888888
|
209
|
+
- m7777777777777777
|
210
|
+
response_expectation:
|
211
|
+
status_code: 409
|
212
|
+
- name : 'Blacklist update with non existing movies should return 409'
|
213
|
+
request:
|
214
|
+
headers:
|
215
|
+
Content-Type: 'application/json'
|
216
|
+
path: '/users/duffyduck/blacklist'
|
217
|
+
method: 'PUT'
|
218
|
+
body:
|
219
|
+
blacklist:
|
220
|
+
- m9999999999999999
|
221
|
+
- m8888888888888888
|
222
|
+
- m7777777777777777
|
223
|
+
response_expectation:
|
224
|
+
status_code: 409
|
225
|
+
- name : 'Skiplist update with non existing movies should return 409'
|
226
|
+
request:
|
227
|
+
headers:
|
228
|
+
Content-Type: 'application/json'
|
229
|
+
path: '/users/duffyduck/skiplist'
|
230
|
+
method: 'PUT'
|
231
|
+
body:
|
232
|
+
skiplist:
|
233
|
+
- m9999999999999999
|
234
|
+
- m8888888888888888
|
235
|
+
- m7777777777777777
|
236
|
+
response_expectation:
|
237
|
+
status_code: 409
|
@@ -1 +1,27 @@
|
|
1
1
|
---
|
2
|
+
- name: "Without per_page there should come out 1 rateable movie"
|
3
|
+
request:
|
4
|
+
path: '/users/duffyduck/rateables'
|
5
|
+
method: 'GET'
|
6
|
+
headers:
|
7
|
+
Content-Type: 'application/json'
|
8
|
+
body: {}
|
9
|
+
response_expectation:
|
10
|
+
status_code: 200
|
11
|
+
headers:
|
12
|
+
Last-Modified: /.*/
|
13
|
+
body: /^\["m\d+"\]$/
|
14
|
+
- name: "With per_page 10 there should come out 10 rateable movies"
|
15
|
+
request:
|
16
|
+
path: '/users/duffyduck/rateables?per_page=10'
|
17
|
+
parameters:
|
18
|
+
per_page: 10
|
19
|
+
method: 'GET'
|
20
|
+
headers:
|
21
|
+
Content-Type: 'application/json'
|
22
|
+
body: {}
|
23
|
+
response_expectation:
|
24
|
+
status_code: 200
|
25
|
+
headers:
|
26
|
+
Last-Modified: /.*/
|
27
|
+
body: /^\[("m\d+",?){10}\]$/
|
@@ -6,17 +6,42 @@
|
|
6
6
|
body: {}
|
7
7
|
response_expectation:
|
8
8
|
status_code: 202
|
9
|
+
- name: 'User 1 should be nonexistant afterwards'
|
10
|
+
request:
|
11
|
+
path: '/users/duffyduck'
|
12
|
+
method: 'GET'
|
13
|
+
body: {}
|
14
|
+
response_expectation:
|
15
|
+
status_code: 404
|
9
16
|
- name: 'Delete User 2'
|
17
|
+
priority: 1
|
10
18
|
request:
|
11
19
|
path: '/users/duffyduck2'
|
12
20
|
method: 'DELETE'
|
13
21
|
body: {}
|
14
22
|
response_expectation:
|
15
23
|
status_code: 202
|
24
|
+
- name: 'User 2 should be nonexistant afterwards'
|
25
|
+
priority: 1
|
26
|
+
request:
|
27
|
+
path: '/users/duffyduck2'
|
28
|
+
method: 'GET'
|
29
|
+
body: {}
|
30
|
+
response_expectation:
|
31
|
+
status_code: 404
|
16
32
|
- name: 'Delete User 3'
|
33
|
+
priority: 1
|
17
34
|
request:
|
18
35
|
path: '/users/duffyduck3'
|
19
36
|
method: 'DELETE'
|
20
37
|
body: {}
|
21
38
|
response_expectation:
|
22
39
|
status_code: 202
|
40
|
+
- name: 'User 3 should be nonexistant afterwards'
|
41
|
+
priority: 1
|
42
|
+
request:
|
43
|
+
path: '/users/duffyduck3'
|
44
|
+
method: 'GET'
|
45
|
+
body: {}
|
46
|
+
response_expectation:
|
47
|
+
status_code: 404
|
data/lib/expectation_matcher.rb
CHANGED
@@ -66,6 +66,15 @@ class ExpectationMatcher
|
|
66
66
|
def response_body(response, testcase)
|
67
67
|
result = Result.new(testcase, response)
|
68
68
|
|
69
|
+
# special case: the whole body has to be matched via a regular expression
|
70
|
+
if is_regex?(testcase['response_expectation']['body'])
|
71
|
+
if not regex_matches?(testcase['response_expectation']['body'], response.body)
|
72
|
+
result.succeeded = false
|
73
|
+
result.error_message = " expected the whole body to match regex --#{testcase['response_expectation']['body']}--\n got --#{response.body}--"
|
74
|
+
end
|
75
|
+
return result
|
76
|
+
end
|
77
|
+
|
69
78
|
expected_body_hash = testcase['response_expectation']['body']
|
70
79
|
|
71
80
|
# in case we have no body expectation we simply return success
|
@@ -76,7 +85,7 @@ class ExpectationMatcher
|
|
76
85
|
responded_body_hash = JSON.parse(response.body)
|
77
86
|
rescue
|
78
87
|
result = Result.new(testcase, response)
|
79
|
-
result.
|
88
|
+
result.succeeded = false
|
80
89
|
result.error_message = " expected response to have a body\n got raw body --#{response.body}-- which is nil or an unparseable hash"
|
81
90
|
return result
|
82
91
|
end
|
@@ -90,6 +99,10 @@ class ExpectationMatcher
|
|
90
99
|
expectation_node = expectation_tree.xpath(path).first
|
91
100
|
response_node = response_tree.xpath(path).first
|
92
101
|
|
102
|
+
debugger
|
103
|
+
# in some (not awesome) cases the root node occures as leaf, so we have to skip him here
|
104
|
+
next if expectation_node.name == "hash"
|
105
|
+
|
93
106
|
# return error if response body does not have the expected entry
|
94
107
|
if response_node.nil?
|
95
108
|
result.succeeded = false
|
data/lib/http_client.rb
CHANGED
@@ -17,7 +17,6 @@ class HttpClient
|
|
17
17
|
# returns struct containing response.code, headers, body and message
|
18
18
|
# this is only for easily interfaceing another http client
|
19
19
|
def build_response(raw_response)
|
20
|
-
debugger
|
21
20
|
response_struct = Struct.new(:code, :message, :headers, :body)
|
22
21
|
response = response_struct.new
|
23
22
|
response.code = raw_response.code
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 2
|
8
|
-
-
|
9
|
-
version: 0.2.
|
8
|
+
- 1
|
9
|
+
version: 0.2.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- jan@moviepilot.com
|
@@ -271,7 +271,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
271
271
|
requirements:
|
272
272
|
- - ">="
|
273
273
|
- !ruby/object:Gem::Version
|
274
|
-
hash: -
|
274
|
+
hash: -3503113694537890218
|
275
275
|
segments:
|
276
276
|
- 0
|
277
277
|
version: "0"
|