jdx-sinatra-param 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Parameter' do
4
+ it 'only sets parameters present in request or with a default value' do
5
+ get('/', a: 'a', b: 'b') do |response|
6
+ response_body = JSON.parse(response.body)
7
+ expect(response_body).to be_member('a')
8
+ expect(response_body).to be_member('b')
9
+ expect(response_body).to be_member('c')
10
+ expect(response_body).to_not be_member('d')
11
+ end
12
+ end
13
+
14
+ it 'stringifies parameters' do
15
+ get('/keys/stringify', q: 'test') do |response|
16
+ expect(response.body).to eq 'TEST'
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Parameter Transformations' do
4
+ describe 'default' do
5
+ it 'sets a default value when none is given' do
6
+ get('/default') do |response|
7
+ expect(response.status).to eql 200
8
+ expect(JSON.parse(response.body)['sort']).to eql 'title'
9
+ end
10
+ end
11
+
12
+ it 'sets a default value from an empty hash' do
13
+ get('/default/hash') do |response|
14
+ expect(response.status).to eql 200
15
+ expect(JSON.parse(response.body)['attributes']).to eql Hash.new
16
+ end
17
+ end
18
+
19
+ it 'sets a default value from a proc' do
20
+ get('/default/proc') do |response|
21
+ expect(response.status).to eql 200
22
+ expect(JSON.parse(response.body)['year']).to eql 2014
23
+ end
24
+ end
25
+ end
26
+
27
+ describe 'transform' do
28
+ it 'transforms the input using to_proc' do
29
+ get('/transform', order: 'asc') do |response|
30
+ expect(response.status).to eql 200
31
+ expect(JSON.parse(response.body)['order']).to eql 'ASC'
32
+ end
33
+ end
34
+
35
+ it 'skips transformations when the value is nil' do
36
+ get('/transform/required') do |response|
37
+ expect(response.status).to eql 400
38
+ expect(JSON.parse(response.body)['message']).to eq("Parameter is required")
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,202 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Parameter Types' do
4
+ describe 'String' do
5
+ it 'coerces strings' do
6
+ get('/coerce/string', arg: '1234') do |response|
7
+ expect(response.status).to eql 200
8
+ expect(JSON.parse(response.body)['arg']).to eq('1234')
9
+ end
10
+ end
11
+ end
12
+
13
+ describe 'Integer' do
14
+ it 'coerces integers' do
15
+ get('/coerce/integer', arg: '1234') do |response|
16
+ expect(response.status).to eql 200
17
+ expect(JSON.parse(response.body)['arg']).to eq(1234)
18
+ end
19
+ end
20
+
21
+ it 'returns 400 on requests when integer is invalid' do
22
+ get('/coerce/integer', arg: '123abc') do |response|
23
+ expect(response.status).to eql 400
24
+ expect(JSON.parse(response.body)['message']).to eq("'123abc' is not a valid Integer")
25
+ end
26
+ end
27
+ end
28
+
29
+ describe 'Float' do
30
+ it 'coerces floats' do
31
+ get('/coerce/float', arg: '1234') do |response|
32
+ expect(response.status).to eql 200
33
+ expect(JSON.parse(response.body)['arg']).to eq(1234.0)
34
+ end
35
+ end
36
+
37
+ it 'returns 400 on requests when float is invalid' do
38
+ get('/coerce/float', arg: '123abc') do |response|
39
+ expect(response.status).to eql 400
40
+ expect(JSON.parse(response.body)['message']).to eq("'123abc' is not a valid Float")
41
+ end
42
+ end
43
+ end
44
+
45
+ describe 'Time' do
46
+ it 'coerces time' do
47
+ get('/coerce/time', arg: '20130117') do |response|
48
+ expect(response.status).to eql 200
49
+ expect(JSON.parse(response.body)['arg']).to match(/2013-01-17 00:00:00/)
50
+ end
51
+ end
52
+
53
+ it 'returns 400 on requests when time is invalid' do
54
+ get('/coerce/time', arg: 'noon') do |response|
55
+ expect(response.status).to eql 400
56
+ expect(JSON.parse(response.body)['message']).to eq("'noon' is not a valid Time")
57
+ end
58
+ end
59
+ end
60
+
61
+ describe 'Date' do
62
+ it 'coerces date' do
63
+ get('/coerce/date', arg: '20130117') do |response|
64
+ expect(response.status).to eql 200
65
+ expect(JSON.parse(response.body)['arg']).to eq('2013-01-17')
66
+ end
67
+ end
68
+
69
+ it 'returns 400 on requests when date is invalid' do
70
+ get('/coerce/date', arg: 'abc') do |response|
71
+ expect(response.status).to eql 400
72
+ expect(JSON.parse(response.body)['message']).to eq("'abc' is not a valid Date")
73
+ end
74
+ end
75
+ end
76
+
77
+ describe 'DateTime' do
78
+ it 'coerces datetimes' do
79
+ get('/coerce/datetime', arg: '20130117') do |response|
80
+ expect(response.status).to eql 200
81
+ expect(JSON.parse(response.body)['arg']).to eq('2013-01-17T00:00:00+00:00')
82
+ end
83
+ end
84
+
85
+ it 'returns 400 on requests when datetime is invalid' do
86
+ get('/coerce/datetime', arg: 'abc') do |response|
87
+ expect(response.status).to eql 400
88
+ expect(JSON.parse(response.body)['message']).to eq("'abc' is not a valid DateTime")
89
+ end
90
+ end
91
+ end
92
+
93
+ describe 'Array' do
94
+ it 'coerces arrays' do
95
+ get('/coerce/array', arg: '1,2,3,4,5') do |response|
96
+ expect(response.status).to eql 200
97
+ parsed_body = JSON.parse(response.body)
98
+ expect(parsed_body['arg']).to be_an(Array)
99
+ expect(parsed_body['arg']).to eq(%w(1 2 3 4 5))
100
+ end
101
+ end
102
+
103
+ it 'coerces arrays of size 1' do
104
+ get('/coerce/array', arg: '1') do |response|
105
+ expect(response.status).to eql 200
106
+ parsed_body = JSON.parse(response.body)
107
+ expect(parsed_body['arg']).to be_an(Array)
108
+ expect(parsed_body['arg']).to eq(%w(1))
109
+ end
110
+ end
111
+
112
+ it 'coerces arrays with arg[] style' do
113
+ get('/coerce/array', 'arg[]' => ['1','2','3','4','5']) do |response|
114
+ expect(response.status).to eql 200
115
+ parsed_body = JSON.parse(response.body)
116
+ expect(parsed_body['arg']).to be_an(Array)
117
+ expect(parsed_body['arg']).to eq(%w(1 2 3 4 5))
118
+ end
119
+ end
120
+ end
121
+
122
+ describe 'Hash' do
123
+ it 'coerces hashes' do
124
+ get('/coerce/hash', arg: 'a:b,c:d') do |response|
125
+ expect(response.status).to eql 200
126
+ parsed_body = JSON.parse(response.body)
127
+ expect(parsed_body['arg']).to be_an(Hash)
128
+ expect(parsed_body['arg']).to eq({ 'a' => 'b', 'c' => 'd'})
129
+ end
130
+ end
131
+ end
132
+
133
+ describe 'Boolean' do
134
+ it 'coerces truthy booleans to true' do
135
+ %w(1 true t yes y).each do |bool|
136
+ get('/coerce/boolean', arg: bool) do |response|
137
+ expect(response.status).to eql 200
138
+ expect(JSON.parse(response.body)['arg']).to be true
139
+ end
140
+ end
141
+ end
142
+
143
+ it 'coerces falsey booleans to false' do
144
+ %w(0 false f no n).each do |bool|
145
+ get('/coerce/boolean', arg: bool) do |response|
146
+ expect(response.status).to eql 200
147
+ expect(JSON.parse(response.body)['arg']).to be false
148
+ expect(JSON.parse(response.body)['arg']).to_not be_nil
149
+ end
150
+ end
151
+ end
152
+
153
+ it 'coerces truthy booleans to true when default is false' do
154
+ %w(1 true t yes y).each do |bool|
155
+ get('/default/boolean/false', arg: bool) do |response|
156
+ expect(response.status).to eql 200
157
+ expect(JSON.parse(response.body)['arg']).to be true
158
+ end
159
+ end
160
+ end
161
+
162
+ it 'coerces falsey booleans to false when default is true' do
163
+ %w(0 false f no n).each do |bool|
164
+ get('/default/boolean/true', arg: bool) do |response|
165
+ expect(response.status).to eql 200
166
+ expect(JSON.parse(response.body)['arg']).to be false
167
+ expect(JSON.parse(response.body)['arg']).to_not be_nil
168
+ end
169
+ end
170
+ end
171
+
172
+ it 'coerces default booleans to true when default is true and its not provided' do
173
+ get('/default/boolean/true') do |response|
174
+ expect(response.status).to eql 200
175
+ expect(JSON.parse(response.body)['arg']).to be true
176
+ expect(JSON.parse(response.body)['arg']).to_not be_nil
177
+ end
178
+ end
179
+
180
+ it 'coerces default booleans to false when default is false and its not provided' do
181
+ get('/default/boolean/false') do |response|
182
+ expect(response.status).to eql 200
183
+ expect(JSON.parse(response.body)['arg']).to be false
184
+ expect(JSON.parse(response.body)['arg']).to_not be_nil
185
+ end
186
+ end
187
+
188
+ it 'returns 400 on requests when true is not a truthy value' do
189
+ get('/default/boolean/true', arg: 'abc') do |response|
190
+ expect(response.status).to eql 400
191
+ expect(JSON.parse(response.body)['message']).to eq("'abc' is not a valid boolean")
192
+ end
193
+ end
194
+
195
+ it 'returns 400 on requests when false is not a falsey value' do
196
+ get('/default/boolean/false', arg: 'abc') do |response|
197
+ expect(response.status).to eql 400
198
+ expect(JSON.parse(response.body)['message']).to eq("'abc' is not a valid boolean")
199
+ end
200
+ end
201
+ end
202
+ end
@@ -0,0 +1,216 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Parameter Validations' do
4
+ describe 'required' do
5
+ it 'returns 400 on requests without required fields' do
6
+ get('/validation/required') do |response|
7
+ expect(response.status).to eq(400)
8
+ expect(JSON.parse(response.body)['message']).to eq("Parameter is required")
9
+ end
10
+ end
11
+
12
+ it 'returns 200 on requests when required field present' do
13
+ get('/validation/required', arg: 'foo') do |response|
14
+ expect(response.status).to eq(200)
15
+ end
16
+ end
17
+ end
18
+
19
+ describe 'blank' do
20
+ it 'returns 400 on requests when string is blank' do
21
+ get('/validation/blank/string', arg: '') do |response|
22
+ expect(response.status).to eq(400)
23
+ expect(JSON.parse(response.body)['message']).to eq("Parameter cannot be blank")
24
+ end
25
+ end
26
+
27
+ it 'returns 400 on requests when array is blank' do
28
+ get('/validation/blank/array', arg: '') do |response|
29
+ expect(response.status).to eq(400)
30
+ expect(JSON.parse(response.body)['message']).to eq("Parameter cannot be blank")
31
+ end
32
+ end
33
+
34
+ it 'returns 400 on requests when hash is blank' do
35
+ get('/validation/blank/hash', arg: '') do |response|
36
+ expect(response.status).to eq(400)
37
+ expect(JSON.parse(response.body)['message']).to eq("Parameter cannot be blank")
38
+ end
39
+ end
40
+
41
+ it 'returns 400 on requests when hash is blank' do
42
+ get('/validation/blank/other', arg: '') do |response|
43
+ expect(response.status).to eq(400)
44
+ expect(JSON.parse(response.body)['message']).to eq("Parameter cannot be blank")
45
+ end
46
+ end
47
+
48
+ it 'returns 200 on request when blank is true' do
49
+ get('/validation/nonblank/string', arg: '') do |response|
50
+ expect(response.status).to eq(200)
51
+ end
52
+ end
53
+ end
54
+
55
+ describe 'format' do
56
+ it 'returns 200 on requests when value matches the param regex' do
57
+ get('/validation/format/hello', arg: 'hello world') do |response|
58
+ expect(response.status).to eq(200)
59
+ end
60
+ end
61
+
62
+ it 'returns 400 on requests when value does not match the param regex' do
63
+ get('/validation/format/hello', arg: 'world') do |response|
64
+ expect(response.status).to eq(400)
65
+ end
66
+ end
67
+
68
+ it 'returns 400 on requests when value is not a string' do
69
+ get('/validation/format/9000', arg: 9000) do |response|
70
+ expect(response.status).to eq(400)
71
+ end
72
+ end
73
+ end
74
+
75
+ describe 'is' do
76
+ it 'returns 400 on requests when value is other than defined' do
77
+ get('/validation/is', arg: 'bar') do |response|
78
+ expect(response.status).to eq(400)
79
+ expect(JSON.parse(response.body)['message']).to eq("Parameter must be foo")
80
+ end
81
+ end
82
+
83
+ it 'returns 200 on requests with a value is other than defined' do
84
+ get('/validation/is', arg: 'foo') do |response|
85
+ expect(response.status).to eq(200)
86
+ end
87
+ end
88
+ end
89
+
90
+ describe 'in' do
91
+ it 'returns 400 on requests with a value not in the set' do
92
+ get('/validation/in', arg: 'MISC') do |response|
93
+ expect(response.status).to eq(400)
94
+ expect(JSON.parse(response.body)['message']).to eq("Parameter must be within [\"ASC\", \"DESC\"]")
95
+ end
96
+ end
97
+
98
+ it 'returns 200 on requests with a value in the set' do
99
+ get('/validation/in', arg: 'ASC') do |response|
100
+ expect(response.status).to eq(200)
101
+ end
102
+ end
103
+ end
104
+
105
+ describe 'within' do
106
+ it 'returns 400 on requests with a value outside the range' do
107
+ get('/validation/within', arg: 20) do |response|
108
+ expect(response.status).to eq(400)
109
+ expect(JSON.parse(response.body)['message']).to eq("Parameter must be within 1..10")
110
+ end
111
+ end
112
+
113
+ it 'returns 200 on requests with a value within the range' do
114
+ get('/validation/within', arg: 5) do |response|
115
+ expect(response.status).to eq(200)
116
+ end
117
+ end
118
+ end
119
+
120
+ describe 'range' do
121
+ it 'returns 400 on requests with a value outside the range' do
122
+ get('/validation/range', arg: 20) do |response|
123
+ expect(response.status).to eq(400)
124
+ expect(JSON.parse(response.body)['message']).to eq("Parameter must be within 1..10")
125
+ end
126
+ end
127
+
128
+ it 'returns 200 on requests within the range' do
129
+ get('/validation/range', arg: 10) do |response|
130
+ expect(response.status).to eq(200)
131
+ end
132
+ end
133
+ end
134
+
135
+ describe 'min' do
136
+ it 'returns 400 on requests with a value smaller than min' do
137
+ get('/validation/min', arg: 5) do |response|
138
+ expect(response.status).to eq(400)
139
+ expect(JSON.parse(response.body)['message']).to eq("Parameter cannot be less than 12")
140
+ end
141
+ end
142
+
143
+ it 'returns 200 on requests with a value larger than min' do
144
+ get('/validation/min', arg: 200) do |response|
145
+ expect(response.status).to eq(200)
146
+ end
147
+ end
148
+ end
149
+
150
+ describe 'max' do
151
+ it 'returns 400 on requests with a value larger than max' do
152
+ get('/validation/max', arg: 100) do |response|
153
+ expect(response.status).to eq(400)
154
+ expect(JSON.parse(response.body)['message']).to eq("Parameter cannot be greater than 20")
155
+ end
156
+ end
157
+
158
+ it 'returns 200 on requests with a value smaller than max' do
159
+ get('/validation/max', arg: 2) do |response|
160
+ expect(response.status).to eq(200)
161
+ end
162
+ end
163
+ end
164
+
165
+ describe 'min_length' do
166
+ it 'returns 400 on requests with a string shorter than min_length' do
167
+ get('/validation/min_length', arg: 'hi') do |response|
168
+ expect(response.status).to eq(400)
169
+ expect(JSON.parse(response.body)['message']).to eq("Parameter cannot have length less than 5")
170
+ end
171
+ end
172
+
173
+ it 'returns 200 on requests with a string longer than min_length' do
174
+ get('/validation/max_length', arg: 'longer') do |response|
175
+ expect(response.status).to eq(200)
176
+ end
177
+ end
178
+ end
179
+
180
+ describe 'max_length' do
181
+ it 'returns 400 on requests with a string longer than max_length' do
182
+ get('/validation/max_length', arg: 'reallylongstringlongerthanmax') do |response|
183
+ expect(response.status).to eq(400)
184
+ expect(JSON.parse(response.body)['message']).to eq("Parameter cannot have length greater than 10")
185
+ end
186
+ end
187
+
188
+ it 'returns 200 on requests with a string shorter than max_length' do
189
+ get('/validation/max_length', arg: 'short') do |response|
190
+ expect(response.status).to eq(200)
191
+ end
192
+ end
193
+ end
194
+
195
+ context 'content-type header' do
196
+ it 'returns application/json for JSON APIs' do
197
+ get('/validation/max_length', arg: 'reallylongstringlongerthanmax') do |response|
198
+ expect(response.headers['Content-Type']).to eq('application/json')
199
+ end
200
+ end
201
+
202
+ it 'returns text/plain for non-JSON APIs' do
203
+ get('/xml', arg: 'reallylongstringlongerthanmax') do |response|
204
+ expect(response.headers['Content-Type']).to include('text/plain')
205
+ end
206
+ end
207
+ end
208
+
209
+ context 'custom message ' do
210
+ it 'returns a custom message when configured' do
211
+ get('/custommessage') do |response|
212
+ expect(JSON.parse(response.body)['message']).to eq("'a' must be less than 10")
213
+ end
214
+ end
215
+ end
216
+ end