grape 1.8.0 → 2.0.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -0
- data/README.md +19 -22
- data/UPGRADING.md +35 -0
- data/grape.gemspec +1 -4
- data/lib/grape/dsl/desc.rb +1 -1
- data/lib/grape/dsl/inside_route.rb +9 -9
- data/lib/grape/endpoint.rb +9 -1
- data/lib/grape/exceptions/missing_group_type.rb +1 -1
- data/lib/grape/exceptions/unsupported_group_type.rb +1 -1
- data/lib/grape/http/headers.rb +12 -2
- data/lib/grape/middleware/auth/strategies.rb +1 -2
- data/lib/grape/middleware/error.rb +4 -4
- data/lib/grape/middleware/formatter.rb +5 -5
- data/lib/grape/railtie.rb +9 -0
- data/lib/grape/request.rb +8 -2
- data/lib/grape/router/route.rb +1 -1
- data/lib/grape/validations/validators/base.rb +1 -1
- data/lib/grape/validations/validators/values_validator.rb +2 -2
- data/lib/grape/version.rb +1 -1
- data/lib/grape.rb +15 -2
- metadata +8 -243
- data/spec/grape/api/custom_validations_spec.rb +0 -213
- data/spec/grape/api/deeply_included_options_spec.rb +0 -56
- data/spec/grape/api/defines_boolean_in_params_spec.rb +0 -38
- data/spec/grape/api/documentation_spec.rb +0 -59
- data/spec/grape/api/inherited_helpers_spec.rb +0 -114
- data/spec/grape/api/instance_spec.rb +0 -103
- data/spec/grape/api/invalid_format_spec.rb +0 -45
- data/spec/grape/api/namespace_parameters_in_route_spec.rb +0 -38
- data/spec/grape/api/nested_helpers_spec.rb +0 -50
- data/spec/grape/api/optional_parameters_in_route_spec.rb +0 -43
- data/spec/grape/api/parameters_modification_spec.rb +0 -41
- data/spec/grape/api/patch_method_helpers_spec.rb +0 -79
- data/spec/grape/api/recognize_path_spec.rb +0 -21
- data/spec/grape/api/required_parameters_in_route_spec.rb +0 -37
- data/spec/grape/api/required_parameters_with_invalid_method_spec.rb +0 -26
- data/spec/grape/api/routes_with_requirements_spec.rb +0 -59
- data/spec/grape/api/shared_helpers_exactly_one_of_spec.rb +0 -41
- data/spec/grape/api/shared_helpers_spec.rb +0 -36
- data/spec/grape/api_remount_spec.rb +0 -509
- data/spec/grape/api_spec.rb +0 -4356
- data/spec/grape/dsl/callbacks_spec.rb +0 -45
- data/spec/grape/dsl/desc_spec.rb +0 -98
- data/spec/grape/dsl/headers_spec.rb +0 -62
- data/spec/grape/dsl/helpers_spec.rb +0 -100
- data/spec/grape/dsl/inside_route_spec.rb +0 -531
- data/spec/grape/dsl/logger_spec.rb +0 -24
- data/spec/grape/dsl/middleware_spec.rb +0 -60
- data/spec/grape/dsl/parameters_spec.rb +0 -180
- data/spec/grape/dsl/request_response_spec.rb +0 -225
- data/spec/grape/dsl/routing_spec.rb +0 -275
- data/spec/grape/dsl/settings_spec.rb +0 -261
- data/spec/grape/dsl/validations_spec.rb +0 -55
- data/spec/grape/endpoint/declared_spec.rb +0 -846
- data/spec/grape/endpoint_spec.rb +0 -1085
- data/spec/grape/entity_spec.rb +0 -336
- data/spec/grape/exceptions/base_spec.rb +0 -81
- data/spec/grape/exceptions/body_parse_errors_spec.rb +0 -185
- data/spec/grape/exceptions/invalid_accept_header_spec.rb +0 -358
- data/spec/grape/exceptions/invalid_formatter_spec.rb +0 -15
- data/spec/grape/exceptions/invalid_response_spec.rb +0 -11
- data/spec/grape/exceptions/invalid_versioner_option_spec.rb +0 -15
- data/spec/grape/exceptions/missing_group_type_spec.rb +0 -17
- data/spec/grape/exceptions/missing_mime_type_spec.rb +0 -17
- data/spec/grape/exceptions/missing_option_spec.rb +0 -15
- data/spec/grape/exceptions/unknown_options_spec.rb +0 -15
- data/spec/grape/exceptions/unknown_validator_spec.rb +0 -15
- data/spec/grape/exceptions/unsupported_group_type_spec.rb +0 -19
- data/spec/grape/exceptions/validation_errors_spec.rb +0 -92
- data/spec/grape/exceptions/validation_spec.rb +0 -19
- data/spec/grape/extensions/param_builders/hash_spec.rb +0 -83
- data/spec/grape/extensions/param_builders/hash_with_indifferent_access_spec.rb +0 -105
- data/spec/grape/extensions/param_builders/hashie/mash_spec.rb +0 -79
- data/spec/grape/grape_spec.rb +0 -9
- data/spec/grape/integration/global_namespace_function_spec.rb +0 -29
- data/spec/grape/integration/rack_sendfile_spec.rb +0 -48
- data/spec/grape/integration/rack_spec.rb +0 -51
- data/spec/grape/loading_spec.rb +0 -44
- data/spec/grape/middleware/auth/base_spec.rb +0 -31
- data/spec/grape/middleware/auth/dsl_spec.rb +0 -60
- data/spec/grape/middleware/auth/strategies_spec.rb +0 -120
- data/spec/grape/middleware/base_spec.rb +0 -221
- data/spec/grape/middleware/error_spec.rb +0 -85
- data/spec/grape/middleware/exception_spec.rb +0 -294
- data/spec/grape/middleware/formatter_spec.rb +0 -461
- data/spec/grape/middleware/globals_spec.rb +0 -30
- data/spec/grape/middleware/stack_spec.rb +0 -155
- data/spec/grape/middleware/versioner/accept_version_header_spec.rb +0 -122
- data/spec/grape/middleware/versioner/header_spec.rb +0 -345
- data/spec/grape/middleware/versioner/param_spec.rb +0 -171
- data/spec/grape/middleware/versioner/path_spec.rb +0 -62
- data/spec/grape/middleware/versioner_spec.rb +0 -21
- data/spec/grape/named_api_spec.rb +0 -19
- data/spec/grape/parser_spec.rb +0 -86
- data/spec/grape/path_spec.rb +0 -252
- data/spec/grape/presenters/presenter_spec.rb +0 -71
- data/spec/grape/request_spec.rb +0 -126
- data/spec/grape/util/inheritable_setting_spec.rb +0 -242
- data/spec/grape/util/inheritable_values_spec.rb +0 -79
- data/spec/grape/util/reverse_stackable_values_spec.rb +0 -134
- data/spec/grape/util/stackable_values_spec.rb +0 -128
- data/spec/grape/util/strict_hash_configuration_spec.rb +0 -38
- data/spec/grape/validations/attributes_doc_spec.rb +0 -153
- data/spec/grape/validations/instance_behaivour_spec.rb +0 -43
- data/spec/grape/validations/multiple_attributes_iterator_spec.rb +0 -38
- data/spec/grape/validations/params_scope_spec.rb +0 -1420
- data/spec/grape/validations/single_attribute_iterator_spec.rb +0 -56
- data/spec/grape/validations/types/array_coercer_spec.rb +0 -33
- data/spec/grape/validations/types/primitive_coercer_spec.rb +0 -150
- data/spec/grape/validations/types/set_coercer_spec.rb +0 -32
- data/spec/grape/validations/types_spec.rb +0 -111
- data/spec/grape/validations/validators/all_or_none_spec.rb +0 -162
- data/spec/grape/validations/validators/allow_blank_spec.rb +0 -575
- data/spec/grape/validations/validators/at_least_one_of_spec.rb +0 -205
- data/spec/grape/validations/validators/base_spec.rb +0 -38
- data/spec/grape/validations/validators/coerce_spec.rb +0 -1261
- data/spec/grape/validations/validators/default_spec.rb +0 -463
- data/spec/grape/validations/validators/exactly_one_of_spec.rb +0 -233
- data/spec/grape/validations/validators/except_values_spec.rb +0 -192
- data/spec/grape/validations/validators/mutual_exclusion_spec.rb +0 -214
- data/spec/grape/validations/validators/presence_spec.rb +0 -315
- data/spec/grape/validations/validators/regexp_spec.rb +0 -161
- data/spec/grape/validations/validators/same_as_spec.rb +0 -57
- data/spec/grape/validations/validators/values_spec.rb +0 -733
- data/spec/grape/validations/validators/zh-CN.yml +0 -10
- data/spec/grape/validations_spec.rb +0 -2030
- data/spec/integration/eager_load/eager_load_spec.rb +0 -15
- data/spec/integration/multi_json/json_spec.rb +0 -7
- data/spec/integration/multi_xml/xml_spec.rb +0 -7
- data/spec/shared/deprecated_class_examples.rb +0 -16
- data/spec/shared/versioning_examples.rb +0 -215
- data/spec/spec_helper.rb +0 -52
- data/spec/support/basic_auth_encode_helpers.rb +0 -11
- data/spec/support/chunks.rb +0 -14
- data/spec/support/content_type_helpers.rb +0 -15
- data/spec/support/endpoint_faker.rb +0 -25
- data/spec/support/file_streamer.rb +0 -13
- data/spec/support/integer_helpers.rb +0 -13
- data/spec/support/versioned_helpers.rb +0 -55
@@ -1,358 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
describe Grape::Exceptions::InvalidAcceptHeader do
|
4
|
-
shared_examples_for 'a valid request' do
|
5
|
-
it 'does return with status 200' do
|
6
|
-
expect(last_response.status).to eq 200
|
7
|
-
end
|
8
|
-
|
9
|
-
it 'does return the expected result' do
|
10
|
-
expect(last_response.body).to eq('beer received')
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
shared_examples_for 'a cascaded request' do
|
15
|
-
it 'does not find a matching route' do
|
16
|
-
expect(last_response.status).to eq 404
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
shared_examples_for 'a not-cascaded request' do
|
21
|
-
it 'does not include the X-Cascade=pass header' do
|
22
|
-
expect(last_response.headers['X-Cascade']).to be_nil
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'does not accept the request' do
|
26
|
-
expect(last_response.status).to eq 406
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
shared_examples_for 'a rescued request' do
|
31
|
-
it 'does not include the X-Cascade=pass header' do
|
32
|
-
expect(last_response.headers['X-Cascade']).to be_nil
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'does show rescue handler processing' do
|
36
|
-
expect(last_response.status).to eq 400
|
37
|
-
expect(last_response.body).to eq('message was processed')
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
context 'API with cascade=false and rescue_from :all handler' do
|
42
|
-
subject { Class.new(Grape::API) }
|
43
|
-
|
44
|
-
before do
|
45
|
-
subject.version 'v99', using: :header, vendor: 'vendorname', format: :json, cascade: false
|
46
|
-
subject.rescue_from :all do |e|
|
47
|
-
rack_response 'message was processed', 400, e[:headers]
|
48
|
-
end
|
49
|
-
subject.get '/beer' do
|
50
|
-
'beer received'
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def app
|
55
|
-
subject
|
56
|
-
end
|
57
|
-
|
58
|
-
context 'that received a request with correct vendor and version' do
|
59
|
-
before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v99' }
|
60
|
-
|
61
|
-
it_behaves_like 'a valid request'
|
62
|
-
end
|
63
|
-
|
64
|
-
context 'that receives' do
|
65
|
-
context 'an invalid vendor in the request' do
|
66
|
-
before do
|
67
|
-
get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.invalidvendor-v99',
|
68
|
-
'CONTENT_TYPE' => 'application/json'
|
69
|
-
end
|
70
|
-
|
71
|
-
it_behaves_like 'a rescued request'
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
context 'API with cascade=false and without a rescue handler' do
|
77
|
-
subject { Class.new(Grape::API) }
|
78
|
-
|
79
|
-
before do
|
80
|
-
subject.version 'v99', using: :header, vendor: 'vendorname', format: :json, cascade: false
|
81
|
-
subject.get '/beer' do
|
82
|
-
'beer received'
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
def app
|
87
|
-
subject
|
88
|
-
end
|
89
|
-
|
90
|
-
context 'that received a request with correct vendor and version' do
|
91
|
-
before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v99' }
|
92
|
-
|
93
|
-
it_behaves_like 'a valid request'
|
94
|
-
end
|
95
|
-
|
96
|
-
context 'that receives' do
|
97
|
-
context 'an invalid version in the request' do
|
98
|
-
before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v77' }
|
99
|
-
|
100
|
-
it_behaves_like 'a not-cascaded request'
|
101
|
-
end
|
102
|
-
|
103
|
-
context 'an invalid vendor in the request' do
|
104
|
-
before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.invalidvendor-v99' }
|
105
|
-
|
106
|
-
it_behaves_like 'a not-cascaded request'
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
context 'API with cascade=false and with rescue_from :all handler and http_codes' do
|
112
|
-
subject { Class.new(Grape::API) }
|
113
|
-
|
114
|
-
before do
|
115
|
-
subject.version 'v99', using: :header, vendor: 'vendorname', format: :json, cascade: false
|
116
|
-
subject.rescue_from :all do |e|
|
117
|
-
rack_response 'message was processed', 400, e[:headers]
|
118
|
-
end
|
119
|
-
subject.desc 'Get beer' do
|
120
|
-
failure [[400, 'Bad Request'], [401, 'Unauthorized'], [403, 'Forbidden'],
|
121
|
-
[404, 'Resource not found'], [406, 'API vendor or version not found'],
|
122
|
-
[500, 'Internal processing error']]
|
123
|
-
end
|
124
|
-
subject.get '/beer' do
|
125
|
-
'beer received'
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
def app
|
130
|
-
subject
|
131
|
-
end
|
132
|
-
|
133
|
-
context 'that received a request with correct vendor and version' do
|
134
|
-
before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v99' }
|
135
|
-
|
136
|
-
it_behaves_like 'a valid request'
|
137
|
-
end
|
138
|
-
|
139
|
-
context 'that receives' do
|
140
|
-
context 'an invalid vendor in the request' do
|
141
|
-
before do
|
142
|
-
get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.invalidvendor-v99',
|
143
|
-
'CONTENT_TYPE' => 'application/json'
|
144
|
-
end
|
145
|
-
|
146
|
-
it_behaves_like 'a rescued request'
|
147
|
-
end
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
context 'API with cascade=false, http_codes but without a rescue handler' do
|
152
|
-
subject { Class.new(Grape::API) }
|
153
|
-
|
154
|
-
before do
|
155
|
-
subject.version 'v99', using: :header, vendor: 'vendorname', format: :json, cascade: false
|
156
|
-
subject.desc 'Get beer' do
|
157
|
-
failure [[400, 'Bad Request'], [401, 'Unauthorized'], [403, 'Forbidden'],
|
158
|
-
[404, 'Resource not found'], [406, 'API vendor or version not found'],
|
159
|
-
[500, 'Internal processing error']]
|
160
|
-
end
|
161
|
-
subject.get '/beer' do
|
162
|
-
'beer received'
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
def app
|
167
|
-
subject
|
168
|
-
end
|
169
|
-
|
170
|
-
context 'that received a request with correct vendor and version' do
|
171
|
-
before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v99' }
|
172
|
-
|
173
|
-
it_behaves_like 'a valid request'
|
174
|
-
end
|
175
|
-
|
176
|
-
context 'that receives' do
|
177
|
-
context 'an invalid version in the request' do
|
178
|
-
before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v77' }
|
179
|
-
|
180
|
-
it_behaves_like 'a not-cascaded request'
|
181
|
-
end
|
182
|
-
|
183
|
-
context 'an invalid vendor in the request' do
|
184
|
-
before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.invalidvendor-v99' }
|
185
|
-
|
186
|
-
it_behaves_like 'a not-cascaded request'
|
187
|
-
end
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
|
-
context 'API with cascade=true and rescue_from :all handler' do
|
192
|
-
subject { Class.new(Grape::API) }
|
193
|
-
|
194
|
-
before do
|
195
|
-
subject.version 'v99', using: :header, vendor: 'vendorname', format: :json, cascade: true
|
196
|
-
subject.rescue_from :all do |e|
|
197
|
-
rack_response 'message was processed', 400, e[:headers]
|
198
|
-
end
|
199
|
-
subject.get '/beer' do
|
200
|
-
'beer received'
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
|
-
def app
|
205
|
-
subject
|
206
|
-
end
|
207
|
-
|
208
|
-
context 'that received a request with correct vendor and version' do
|
209
|
-
before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v99' }
|
210
|
-
|
211
|
-
it_behaves_like 'a valid request'
|
212
|
-
end
|
213
|
-
|
214
|
-
context 'that receives' do
|
215
|
-
context 'an invalid version in the request' do
|
216
|
-
before do
|
217
|
-
get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v77',
|
218
|
-
'CONTENT_TYPE' => 'application/json'
|
219
|
-
end
|
220
|
-
|
221
|
-
it_behaves_like 'a cascaded request'
|
222
|
-
end
|
223
|
-
|
224
|
-
context 'an invalid vendor in the request' do
|
225
|
-
before do
|
226
|
-
get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.invalidvendor-v99',
|
227
|
-
'CONTENT_TYPE' => 'application/json'
|
228
|
-
end
|
229
|
-
|
230
|
-
it_behaves_like 'a cascaded request'
|
231
|
-
end
|
232
|
-
end
|
233
|
-
end
|
234
|
-
|
235
|
-
context 'API with cascade=true and without a rescue handler' do
|
236
|
-
subject { Class.new(Grape::API) }
|
237
|
-
|
238
|
-
before do
|
239
|
-
subject.version 'v99', using: :header, vendor: 'vendorname', format: :json, cascade: true
|
240
|
-
subject.get '/beer' do
|
241
|
-
'beer received'
|
242
|
-
end
|
243
|
-
end
|
244
|
-
|
245
|
-
def app
|
246
|
-
subject
|
247
|
-
end
|
248
|
-
|
249
|
-
context 'that received a request with correct vendor and version' do
|
250
|
-
before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v99' }
|
251
|
-
|
252
|
-
it_behaves_like 'a valid request'
|
253
|
-
end
|
254
|
-
|
255
|
-
context 'that receives' do
|
256
|
-
context 'an invalid version in the request' do
|
257
|
-
before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v77' }
|
258
|
-
|
259
|
-
it_behaves_like 'a cascaded request'
|
260
|
-
end
|
261
|
-
|
262
|
-
context 'an invalid vendor in the request' do
|
263
|
-
before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.invalidvendor-v99' }
|
264
|
-
|
265
|
-
it_behaves_like 'a cascaded request'
|
266
|
-
end
|
267
|
-
end
|
268
|
-
end
|
269
|
-
|
270
|
-
context 'API with cascade=true and with rescue_from :all handler and http_codes' do
|
271
|
-
subject { Class.new(Grape::API) }
|
272
|
-
|
273
|
-
before do
|
274
|
-
subject.version 'v99', using: :header, vendor: 'vendorname', format: :json, cascade: true
|
275
|
-
subject.rescue_from :all do |e|
|
276
|
-
rack_response 'message was processed', 400, e[:headers]
|
277
|
-
end
|
278
|
-
subject.desc 'Get beer' do
|
279
|
-
failure [[400, 'Bad Request'], [401, 'Unauthorized'], [403, 'Forbidden'],
|
280
|
-
[404, 'Resource not found'], [406, 'API vendor or version not found'],
|
281
|
-
[500, 'Internal processing error']]
|
282
|
-
end
|
283
|
-
subject.get '/beer' do
|
284
|
-
'beer received'
|
285
|
-
end
|
286
|
-
end
|
287
|
-
|
288
|
-
def app
|
289
|
-
subject
|
290
|
-
end
|
291
|
-
|
292
|
-
context 'that received a request with correct vendor and version' do
|
293
|
-
before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v99' }
|
294
|
-
|
295
|
-
it_behaves_like 'a valid request'
|
296
|
-
end
|
297
|
-
|
298
|
-
context 'that receives' do
|
299
|
-
context 'an invalid version in the request' do
|
300
|
-
before do
|
301
|
-
get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v77',
|
302
|
-
'CONTENT_TYPE' => 'application/json'
|
303
|
-
end
|
304
|
-
|
305
|
-
it_behaves_like 'a cascaded request'
|
306
|
-
end
|
307
|
-
|
308
|
-
context 'an invalid vendor in the request' do
|
309
|
-
before do
|
310
|
-
get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.invalidvendor-v99',
|
311
|
-
'CONTENT_TYPE' => 'application/json'
|
312
|
-
end
|
313
|
-
|
314
|
-
it_behaves_like 'a cascaded request'
|
315
|
-
end
|
316
|
-
end
|
317
|
-
end
|
318
|
-
|
319
|
-
context 'API with cascade=true, http_codes but without a rescue handler' do
|
320
|
-
subject { Class.new(Grape::API) }
|
321
|
-
|
322
|
-
before do
|
323
|
-
subject.version 'v99', using: :header, vendor: 'vendorname', format: :json, cascade: true
|
324
|
-
subject.desc 'Get beer' do
|
325
|
-
failure [[400, 'Bad Request'], [401, 'Unauthorized'], [403, 'Forbidden'],
|
326
|
-
[404, 'Resource not found'], [406, 'API vendor or version not found'],
|
327
|
-
[500, 'Internal processing error']]
|
328
|
-
end
|
329
|
-
subject.get '/beer' do
|
330
|
-
'beer received'
|
331
|
-
end
|
332
|
-
end
|
333
|
-
|
334
|
-
def app
|
335
|
-
subject
|
336
|
-
end
|
337
|
-
|
338
|
-
context 'that received a request with correct vendor and version' do
|
339
|
-
before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v99' }
|
340
|
-
|
341
|
-
it_behaves_like 'a valid request'
|
342
|
-
end
|
343
|
-
|
344
|
-
context 'that receives' do
|
345
|
-
context 'an invalid version in the request' do
|
346
|
-
before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.vendorname-v77' }
|
347
|
-
|
348
|
-
it_behaves_like 'a cascaded request'
|
349
|
-
end
|
350
|
-
|
351
|
-
context 'an invalid vendor in the request' do
|
352
|
-
before { get '/beer', {}, 'HTTP_ACCEPT' => 'application/vnd.invalidvendor-v99' }
|
353
|
-
|
354
|
-
it_behaves_like 'a cascaded request'
|
355
|
-
end
|
356
|
-
end
|
357
|
-
end
|
358
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
describe Grape::Exceptions::InvalidFormatter do
|
4
|
-
describe '#message' do
|
5
|
-
let(:error) do
|
6
|
-
described_class.new(String, 'xml')
|
7
|
-
end
|
8
|
-
|
9
|
-
it 'contains the problem in the message' do
|
10
|
-
expect(error.message).to include(
|
11
|
-
'cannot convert String to xml'
|
12
|
-
)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,11 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
describe Grape::Exceptions::InvalidResponse do
|
4
|
-
describe '#message' do
|
5
|
-
let(:error) { described_class.new }
|
6
|
-
|
7
|
-
it 'contains the problem in the message' do
|
8
|
-
expect(error.message).to include('Invalid response')
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
describe Grape::Exceptions::InvalidVersionerOption do
|
4
|
-
describe '#message' do
|
5
|
-
let(:error) do
|
6
|
-
described_class.new('headers')
|
7
|
-
end
|
8
|
-
|
9
|
-
it 'contains the problem in the message' do
|
10
|
-
expect(error.message).to include(
|
11
|
-
'unknown :using for versioner: headers'
|
12
|
-
)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'shared/deprecated_class_examples'
|
4
|
-
|
5
|
-
RSpec.describe Grape::Exceptions::MissingGroupType do
|
6
|
-
describe '#message' do
|
7
|
-
subject { described_class.new.message }
|
8
|
-
|
9
|
-
it { is_expected.to include 'group type is required' }
|
10
|
-
end
|
11
|
-
|
12
|
-
describe 'Grape::Exceptions::MissingGroupTypeError' do
|
13
|
-
let(:deprecated_class) { Grape::Exceptions::MissingGroupTypeError }
|
14
|
-
|
15
|
-
it_behaves_like 'deprecated class'
|
16
|
-
end
|
17
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
describe Grape::Exceptions::MissingMimeType do
|
4
|
-
describe '#message' do
|
5
|
-
let(:error) do
|
6
|
-
described_class.new('new_json')
|
7
|
-
end
|
8
|
-
|
9
|
-
it 'contains the problem in the message' do
|
10
|
-
expect(error.message).to include 'missing mime type for new_json'
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'contains the resolution in the message' do
|
14
|
-
expect(error.message).to include "or add your own with content_type :new_json, 'application/new_json' "
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
describe Grape::Exceptions::MissingOption do
|
4
|
-
describe '#message' do
|
5
|
-
let(:error) do
|
6
|
-
described_class.new(:path)
|
7
|
-
end
|
8
|
-
|
9
|
-
it 'contains the problem in the message' do
|
10
|
-
expect(error.message).to include(
|
11
|
-
'you must specify :path options'
|
12
|
-
)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
describe Grape::Exceptions::UnknownOptions do
|
4
|
-
describe '#message' do
|
5
|
-
let(:error) do
|
6
|
-
described_class.new(%i[a b])
|
7
|
-
end
|
8
|
-
|
9
|
-
it 'contains the problem in the message' do
|
10
|
-
expect(error.message).to include(
|
11
|
-
'unknown options: '
|
12
|
-
)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
describe Grape::Exceptions::UnknownValidator do
|
4
|
-
describe '#message' do
|
5
|
-
let(:error) do
|
6
|
-
described_class.new('gt_10')
|
7
|
-
end
|
8
|
-
|
9
|
-
it 'contains the problem in the message' do
|
10
|
-
expect(error.message).to include(
|
11
|
-
'unknown validator: gt_10'
|
12
|
-
)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'shared/deprecated_class_examples'
|
4
|
-
|
5
|
-
RSpec.describe Grape::Exceptions::UnsupportedGroupType do
|
6
|
-
subject { described_class.new }
|
7
|
-
|
8
|
-
describe '#message' do
|
9
|
-
subject { described_class.new.message }
|
10
|
-
|
11
|
-
it { is_expected.to include 'group type must be Array, Hash, JSON or Array[JSON]' }
|
12
|
-
end
|
13
|
-
|
14
|
-
describe 'Grape::Exceptions::UnsupportedGroupTypeError' do
|
15
|
-
let(:deprecated_class) { Grape::Exceptions::UnsupportedGroupTypeError }
|
16
|
-
|
17
|
-
it_behaves_like 'deprecated class'
|
18
|
-
end
|
19
|
-
end
|
@@ -1,92 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'ostruct'
|
4
|
-
|
5
|
-
describe Grape::Exceptions::ValidationErrors do
|
6
|
-
let(:validation_message) { 'FooBar is invalid' }
|
7
|
-
let(:validation_error) { instance_double Grape::Exceptions::Validation, params: [validation_message], message: '' }
|
8
|
-
|
9
|
-
context 'initialize' do
|
10
|
-
subject do
|
11
|
-
described_class.new(errors: [validation_error], headers: headers)
|
12
|
-
end
|
13
|
-
|
14
|
-
let(:headers) do
|
15
|
-
{
|
16
|
-
'A-Header-Key' => 'A-Header-Value'
|
17
|
-
}
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'assigns headers through base class' do
|
21
|
-
expect(subject.headers).to eq(headers)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
context 'message' do
|
26
|
-
context 'is not repeated' do
|
27
|
-
subject(:message) { error.message.split(',').map(&:strip) }
|
28
|
-
|
29
|
-
let(:error) do
|
30
|
-
described_class.new(errors: [validation_error, validation_error])
|
31
|
-
end
|
32
|
-
|
33
|
-
it { expect(message).to include validation_message }
|
34
|
-
it { expect(message.size).to eq 1 }
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
describe '#full_messages' do
|
39
|
-
context 'with errors' do
|
40
|
-
subject { described_class.new(errors: [validation_error_1, validation_error_2]).full_messages }
|
41
|
-
|
42
|
-
let(:validation_error_1) { Grape::Exceptions::Validation.new(params: ['id'], message: :presence) }
|
43
|
-
let(:validation_error_2) { Grape::Exceptions::Validation.new(params: ['name'], message: :presence) }
|
44
|
-
|
45
|
-
it 'returns an array with each errors full message' do
|
46
|
-
expect(subject).to contain_exactly('id is missing', 'name is missing')
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
context 'when attributes is an array of symbols' do
|
51
|
-
subject { described_class.new(errors: [validation_error]).full_messages }
|
52
|
-
|
53
|
-
let(:validation_error) { Grape::Exceptions::Validation.new(params: [:admin_field], message: 'Can not set admin-only field') }
|
54
|
-
|
55
|
-
it 'returns an array with an error full message' do
|
56
|
-
expect(subject.first).to eq('admin_field Can not set admin-only field')
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
context 'api' do
|
62
|
-
subject { Class.new(Grape::API) }
|
63
|
-
|
64
|
-
def app
|
65
|
-
subject
|
66
|
-
end
|
67
|
-
|
68
|
-
it 'can return structured json with separate fields' do
|
69
|
-
subject.format :json
|
70
|
-
subject.rescue_from described_class do |e|
|
71
|
-
error!(e, 400)
|
72
|
-
end
|
73
|
-
subject.params do
|
74
|
-
optional :beer
|
75
|
-
optional :wine
|
76
|
-
optional :juice
|
77
|
-
exactly_one_of :beer, :wine, :juice
|
78
|
-
end
|
79
|
-
subject.get '/exactly_one_of' do
|
80
|
-
'exactly_one_of works!'
|
81
|
-
end
|
82
|
-
get '/exactly_one_of', beer: 'string', wine: 'anotherstring'
|
83
|
-
expect(last_response.status).to eq(400)
|
84
|
-
expect(JSON.parse(last_response.body)).to eq(
|
85
|
-
[
|
86
|
-
'params' => %w[beer wine],
|
87
|
-
'messages' => ['are mutually exclusive']
|
88
|
-
]
|
89
|
-
)
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
describe Grape::Exceptions::Validation do
|
4
|
-
it 'fails when params are missing' do
|
5
|
-
expect { described_class.new(message: 'presence') }.to raise_error(ArgumentError, /missing keyword:.+?params/)
|
6
|
-
end
|
7
|
-
|
8
|
-
context 'when message is a symbol' do
|
9
|
-
it 'stores message_key' do
|
10
|
-
expect(described_class.new(params: ['id'], message: :presence).message_key).to eq(:presence)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
context 'when message is a String' do
|
15
|
-
it 'does not store the message_key' do
|
16
|
-
expect(described_class.new(params: ['id'], message: 'presence').message_key).to be_nil
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|