grape 1.6.2 → 1.7.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 +29 -1
- data/README.md +120 -19
- data/UPGRADING.md +15 -0
- data/lib/grape/api/instance.rb +1 -1
- data/lib/grape/dry_types.rb +12 -0
- data/lib/grape/dsl/api.rb +0 -2
- data/lib/grape/dsl/callbacks.rb +0 -2
- data/lib/grape/dsl/configuration.rb +0 -2
- data/lib/grape/dsl/desc.rb +0 -15
- data/lib/grape/dsl/helpers.rb +0 -2
- data/lib/grape/dsl/inside_route.rb +33 -29
- data/lib/grape/dsl/middleware.rb +0 -2
- data/lib/grape/dsl/parameters.rb +5 -7
- data/lib/grape/dsl/request_response.rb +0 -2
- data/lib/grape/dsl/routing.rb +4 -2
- data/lib/grape/dsl/settings.rb +0 -2
- data/lib/grape/dsl/validations.rb +0 -15
- data/lib/grape/error_formatter/json.rb +7 -1
- data/lib/grape/exceptions/base.rb +2 -2
- data/lib/grape/exceptions/missing_group_type.rb +8 -1
- data/lib/grape/exceptions/too_many_multipart_files.rb +11 -0
- data/lib/grape/exceptions/unsupported_group_type.rb +8 -1
- data/lib/grape/exceptions/validation.rb +0 -4
- data/lib/grape/locale/en.yml +9 -8
- data/lib/grape/middleware/auth/dsl.rb +0 -1
- data/lib/grape/middleware/error.rb +2 -2
- data/lib/grape/request.rb +2 -0
- data/lib/grape/util/json.rb +2 -0
- data/lib/grape/validations/attributes_doc.rb +58 -0
- data/lib/grape/validations/params_scope.rb +66 -40
- data/lib/grape/validations/types/array_coercer.rb +0 -2
- data/lib/grape/validations/types/dry_type_coercer.rb +3 -7
- data/lib/grape/validations/types/primitive_coercer.rb +14 -6
- data/lib/grape/validations/types/set_coercer.rb +0 -2
- data/lib/grape/validations/types.rb +98 -30
- data/lib/grape/validations/validators/{all_or_none.rb → all_or_none_of_validator.rb} +0 -2
- data/lib/grape/validations/validators/{allow_blank.rb → allow_blank_validator.rb} +0 -0
- data/lib/grape/validations/validators/{as.rb → as_validator.rb} +0 -0
- data/lib/grape/validations/validators/{at_least_one_of.rb → at_least_one_of_validator.rb} +0 -2
- data/lib/grape/validations/validators/base.rb +7 -0
- data/lib/grape/validations/validators/{coerce.rb → coerce_validator.rb} +0 -0
- data/lib/grape/validations/validators/{default.rb → default_validator.rb} +0 -0
- data/lib/grape/validations/validators/{exactly_one_of.rb → exactly_one_of_validator.rb} +0 -2
- data/lib/grape/validations/validators/{except_values.rb → except_values_validator.rb} +0 -0
- data/lib/grape/validations/validators/{mutual_exclusion.rb → mutual_exclusion_validator.rb} +0 -2
- data/lib/grape/validations/validators/{presence.rb → presence_validator.rb} +0 -0
- data/lib/grape/validations/validators/{regexp.rb → regexp_validator.rb} +0 -0
- data/lib/grape/validations/validators/{same_as.rb → same_as_validator.rb} +0 -0
- data/lib/grape/validations/validators/{values.rb → values_validator.rb} +0 -0
- data/lib/grape/validations.rb +16 -12
- data/lib/grape/version.rb +1 -1
- data/lib/grape.rb +66 -28
- data/spec/grape/api/custom_validations_spec.rb +41 -2
- data/spec/grape/api/deeply_included_options_spec.rb +0 -2
- data/spec/grape/api/defines_boolean_in_params_spec.rb +0 -2
- data/spec/grape/api/documentation_spec.rb +59 -0
- data/spec/grape/api/inherited_helpers_spec.rb +0 -2
- data/spec/grape/api/instance_spec.rb +0 -1
- data/spec/grape/api/invalid_format_spec.rb +0 -2
- data/spec/grape/api/namespace_parameters_in_route_spec.rb +0 -2
- data/spec/grape/api/nested_helpers_spec.rb +0 -2
- data/spec/grape/api/optional_parameters_in_route_spec.rb +0 -2
- data/spec/grape/api/parameters_modification_spec.rb +0 -2
- data/spec/grape/api/patch_method_helpers_spec.rb +0 -2
- data/spec/grape/api/recognize_path_spec.rb +0 -2
- data/spec/grape/api/required_parameters_in_route_spec.rb +0 -2
- data/spec/grape/api/required_parameters_with_invalid_method_spec.rb +0 -2
- data/spec/grape/api/routes_with_requirements_spec.rb +0 -2
- data/spec/grape/api/shared_helpers_exactly_one_of_spec.rb +0 -2
- data/spec/grape/api/shared_helpers_spec.rb +0 -2
- data/spec/grape/api_remount_spec.rb +0 -1
- data/spec/grape/api_spec.rb +18 -5
- data/spec/grape/config_spec.rb +0 -2
- data/spec/grape/dsl/callbacks_spec.rb +0 -2
- data/spec/grape/dsl/configuration_spec.rb +0 -2
- data/spec/grape/dsl/desc_spec.rb +0 -2
- data/spec/grape/dsl/headers_spec.rb +2 -4
- data/spec/grape/dsl/helpers_spec.rb +0 -2
- data/spec/grape/dsl/inside_route_spec.rb +10 -12
- data/spec/grape/dsl/logger_spec.rb +0 -2
- data/spec/grape/dsl/middleware_spec.rb +0 -2
- data/spec/grape/dsl/parameters_spec.rb +0 -2
- data/spec/grape/dsl/request_response_spec.rb +6 -8
- data/spec/grape/dsl/routing_spec.rb +1 -3
- data/spec/grape/dsl/settings_spec.rb +0 -2
- data/spec/grape/dsl/validations_spec.rb +0 -17
- data/spec/grape/endpoint/declared_spec.rb +2 -4
- data/spec/grape/endpoint_spec.rb +22 -3
- data/spec/grape/entity_spec.rb +0 -1
- data/spec/grape/exceptions/base_spec.rb +16 -2
- data/spec/grape/exceptions/body_parse_errors_spec.rb +0 -2
- data/spec/grape/exceptions/invalid_accept_header_spec.rb +0 -2
- data/spec/grape/exceptions/invalid_formatter_spec.rb +0 -2
- data/spec/grape/exceptions/invalid_response_spec.rb +0 -2
- data/spec/grape/exceptions/invalid_versioner_option_spec.rb +1 -3
- data/spec/grape/exceptions/missing_group_type_spec.rb +21 -0
- data/spec/grape/exceptions/missing_mime_type_spec.rb +0 -2
- data/spec/grape/exceptions/missing_option_spec.rb +1 -3
- data/spec/grape/exceptions/unknown_options_spec.rb +0 -2
- data/spec/grape/exceptions/unknown_validator_spec.rb +0 -2
- data/spec/grape/exceptions/unsupported_group_type_spec.rb +23 -0
- data/spec/grape/exceptions/validation_errors_spec.rb +0 -1
- data/spec/grape/exceptions/validation_spec.rb +1 -3
- data/spec/grape/extensions/param_builders/hash_spec.rb +0 -2
- data/spec/grape/extensions/param_builders/hash_with_indifferent_access_spec.rb +0 -2
- data/spec/grape/extensions/param_builders/hashie/mash_spec.rb +0 -2
- data/spec/grape/integration/global_namespace_function_spec.rb +0 -2
- data/spec/grape/integration/rack_sendfile_spec.rb +0 -2
- data/spec/grape/integration/rack_spec.rb +0 -2
- data/spec/grape/loading_spec.rb +0 -2
- data/spec/grape/middleware/auth/base_spec.rb +0 -1
- data/spec/grape/middleware/auth/dsl_spec.rb +0 -2
- data/spec/grape/middleware/auth/strategies_spec.rb +0 -2
- data/spec/grape/middleware/base_spec.rb +0 -2
- data/spec/grape/middleware/error_spec.rb +6 -1
- data/spec/grape/middleware/exception_spec.rb +0 -2
- data/spec/grape/middleware/formatter_spec.rb +0 -2
- data/spec/grape/middleware/globals_spec.rb +0 -2
- data/spec/grape/middleware/stack_spec.rb +0 -2
- data/spec/grape/middleware/versioner/accept_version_header_spec.rb +0 -2
- data/spec/grape/middleware/versioner/header_spec.rb +18 -4
- data/spec/grape/middleware/versioner/param_spec.rb +0 -2
- data/spec/grape/middleware/versioner/path_spec.rb +0 -2
- data/spec/grape/middleware/versioner_spec.rb +0 -2
- data/spec/grape/named_api_spec.rb +0 -2
- data/spec/grape/parser_spec.rb +0 -2
- data/spec/grape/path_spec.rb +0 -2
- data/spec/grape/presenters/presenter_spec.rb +0 -2
- data/spec/grape/request_spec.rb +0 -2
- data/spec/grape/util/inheritable_setting_spec.rb +0 -1
- data/spec/grape/util/inheritable_values_spec.rb +0 -1
- data/spec/grape/util/reverse_stackable_values_spec.rb +0 -1
- data/spec/grape/util/stackable_values_spec.rb +0 -1
- data/spec/grape/util/strict_hash_configuration_spec.rb +0 -1
- data/spec/grape/validations/attributes_doc_spec.rb +153 -0
- data/spec/grape/validations/attributes_iterator_spec.rb +0 -2
- data/spec/grape/validations/instance_behaivour_spec.rb +0 -2
- data/spec/grape/validations/multiple_attributes_iterator_spec.rb +0 -2
- data/spec/grape/validations/params_scope_spec.rb +315 -86
- data/spec/grape/validations/single_attribute_iterator_spec.rb +0 -2
- data/spec/grape/validations/types/array_coercer_spec.rb +0 -2
- data/spec/grape/validations/types/primitive_coercer_spec.rb +20 -5
- data/spec/grape/validations/types/set_coercer_spec.rb +0 -2
- data/spec/grape/validations/types_spec.rb +28 -2
- data/spec/grape/validations/validators/all_or_none_spec.rb +0 -2
- data/spec/grape/validations/validators/allow_blank_spec.rb +0 -2
- data/spec/grape/validations/validators/at_least_one_of_spec.rb +0 -2
- data/spec/grape/validations/validators/coerce_spec.rb +0 -2
- data/spec/grape/validations/validators/default_spec.rb +0 -2
- data/spec/grape/validations/validators/exactly_one_of_spec.rb +0 -2
- data/spec/grape/validations/validators/except_values_spec.rb +0 -2
- data/spec/grape/validations/validators/mutual_exclusion_spec.rb +0 -2
- data/spec/grape/validations/validators/presence_spec.rb +0 -2
- data/spec/grape/validations/validators/regexp_spec.rb +0 -2
- data/spec/grape/validations/validators/same_as_spec.rb +0 -2
- data/spec/grape/validations/validators/values_spec.rb +0 -2
- data/spec/grape/validations_spec.rb +50 -22
- data/spec/integration/multi_json/json_spec.rb +0 -2
- data/spec/integration/multi_xml/xml_spec.rb +0 -2
- data/spec/spec_helper.rb +9 -4
- metadata +30 -21
- data/spec/support/eager_load.rb +0 -19
data/spec/grape/api_spec.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'spec_helper'
|
4
3
|
require 'shared/versioning_examples'
|
5
4
|
|
6
5
|
describe Grape::API do
|
@@ -1217,7 +1216,7 @@ describe Grape::API do
|
|
1217
1216
|
|
1218
1217
|
it 'does not set Cache-Control' do
|
1219
1218
|
get '/foo'
|
1220
|
-
expect(last_response.headers['Cache-Control']).to
|
1219
|
+
expect(last_response.headers['Cache-Control']).to be_nil
|
1221
1220
|
end
|
1222
1221
|
|
1223
1222
|
it 'sets content type for xml' do
|
@@ -1242,7 +1241,7 @@ describe Grape::API do
|
|
1242
1241
|
|
1243
1242
|
it 'returns raw data when content type binary' do
|
1244
1243
|
image_filename = 'grape.png'
|
1245
|
-
file = File.
|
1244
|
+
file = File.binread(image_filename)
|
1246
1245
|
subject.format :binary
|
1247
1246
|
subject.get('/binary_file') { File.binread(image_filename) }
|
1248
1247
|
get '/binary_file'
|
@@ -1274,7 +1273,7 @@ describe Grape::API do
|
|
1274
1273
|
get '/stream', {}, 'HTTP_VERSION' => 'HTTP/1.1', 'SERVER_PROTOCOL' => 'HTTP/1.1'
|
1275
1274
|
|
1276
1275
|
expect(last_response.headers['Content-Type']).to eq('text/plain')
|
1277
|
-
expect(last_response.headers['Content-Length']).to
|
1276
|
+
expect(last_response.headers['Content-Length']).to be_nil
|
1278
1277
|
expect(last_response.headers['Cache-Control']).to eq('no-cache')
|
1279
1278
|
expect(last_response.headers['Transfer-Encoding']).to eq('chunked')
|
1280
1279
|
|
@@ -2292,7 +2291,7 @@ describe Grape::API do
|
|
2292
2291
|
subject.rescue_from :all, with: :not_exist_method
|
2293
2292
|
subject.get('/rescue_method') { raise StandardError }
|
2294
2293
|
|
2295
|
-
expect { get '/rescue_method' }.to raise_error(NoMethodError, /^undefined method
|
2294
|
+
expect { get '/rescue_method' }.to raise_error(NoMethodError, /^undefined method 'not_exist_method'/)
|
2296
2295
|
end
|
2297
2296
|
|
2298
2297
|
it 'correctly chooses exception handler if :all handler is specified' do
|
@@ -4158,6 +4157,20 @@ describe Grape::API do
|
|
4158
4157
|
end
|
4159
4158
|
end
|
4160
4159
|
|
4160
|
+
context 'with non-UTF-8 characters in specified format' do
|
4161
|
+
it 'converts the characters' do
|
4162
|
+
subject.format :json
|
4163
|
+
subject.content_type :json, 'application/json'
|
4164
|
+
subject.get '/something' do
|
4165
|
+
'foo'
|
4166
|
+
end
|
4167
|
+
get '/something?format=%0A%0B%BF'
|
4168
|
+
expect(last_response.status).to eq(406)
|
4169
|
+
message = "The requested format '\n\u000b\357\277\275' is not supported."
|
4170
|
+
expect(last_response.body).to eq({ error: message }.to_json)
|
4171
|
+
end
|
4172
|
+
end
|
4173
|
+
|
4161
4174
|
context 'body' do
|
4162
4175
|
context 'false' do
|
4163
4176
|
before do
|
data/spec/grape/config_spec.rb
CHANGED
data/spec/grape/dsl/desc_spec.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
3
|
module Grape
|
6
4
|
module DSL
|
7
5
|
module HeadersSpec
|
@@ -54,8 +52,8 @@ module Grape
|
|
54
52
|
context 'when no headers are set' do
|
55
53
|
describe '#header' do
|
56
54
|
it 'returns nil' do
|
57
|
-
expect(subject.header['First Key']).to
|
58
|
-
expect(subject.header('First Key')).to
|
55
|
+
expect(subject.header['First Key']).to be_nil
|
56
|
+
expect(subject.header('First Key')).to be_nil
|
59
57
|
end
|
60
58
|
end
|
61
59
|
end
|
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
3
|
module Grape
|
6
4
|
module DSL
|
7
5
|
module InsideRouteSpec
|
@@ -25,7 +23,7 @@ describe Grape::Endpoint do
|
|
25
23
|
|
26
24
|
describe '#version' do
|
27
25
|
it 'defaults to nil' do
|
28
|
-
expect(subject.version).to
|
26
|
+
expect(subject.version).to be_nil
|
29
27
|
end
|
30
28
|
|
31
29
|
it 'returns env[api.version]' do
|
@@ -167,7 +165,7 @@ describe Grape::Endpoint do
|
|
167
165
|
end
|
168
166
|
|
169
167
|
it 'returns default' do
|
170
|
-
expect(subject.content_type).to
|
168
|
+
expect(subject.content_type).to be_nil
|
171
169
|
end
|
172
170
|
end
|
173
171
|
|
@@ -200,7 +198,7 @@ describe Grape::Endpoint do
|
|
200
198
|
end
|
201
199
|
|
202
200
|
it 'returns default' do
|
203
|
-
expect(subject.body).to
|
201
|
+
expect(subject.body).to be_nil
|
204
202
|
end
|
205
203
|
end
|
206
204
|
|
@@ -315,7 +313,7 @@ describe Grape::Endpoint do
|
|
315
313
|
end
|
316
314
|
|
317
315
|
it 'returns default' do
|
318
|
-
expect(subject.sendfile).to
|
316
|
+
expect(subject.sendfile).to be_nil
|
319
317
|
end
|
320
318
|
end
|
321
319
|
|
@@ -362,13 +360,13 @@ describe Grape::Endpoint do
|
|
362
360
|
it 'sets Content-Length header to nil' do
|
363
361
|
subject.stream file_path
|
364
362
|
|
365
|
-
expect(subject.header['Content-Length']).to
|
363
|
+
expect(subject.header['Content-Length']).to be_nil
|
366
364
|
end
|
367
365
|
|
368
366
|
it 'sets Transfer-Encoding header to nil' do
|
369
367
|
subject.stream file_path
|
370
368
|
|
371
|
-
expect(subject.header['Transfer-Encoding']).to
|
369
|
+
expect(subject.header['Transfer-Encoding']).to be_nil
|
372
370
|
end
|
373
371
|
end
|
374
372
|
|
@@ -406,13 +404,13 @@ describe Grape::Endpoint do
|
|
406
404
|
it 'sets Content-Length header to nil' do
|
407
405
|
subject.stream stream_object
|
408
406
|
|
409
|
-
expect(subject.header['Content-Length']).to
|
407
|
+
expect(subject.header['Content-Length']).to be_nil
|
410
408
|
end
|
411
409
|
|
412
410
|
it 'sets Transfer-Encoding header to nil' do
|
413
411
|
subject.stream stream_object
|
414
412
|
|
415
|
-
expect(subject.header['Transfer-Encoding']).to
|
413
|
+
expect(subject.header['Transfer-Encoding']).to be_nil
|
416
414
|
end
|
417
415
|
end
|
418
416
|
|
@@ -426,8 +424,8 @@ describe Grape::Endpoint do
|
|
426
424
|
end
|
427
425
|
|
428
426
|
it 'returns default' do
|
429
|
-
expect(subject.stream).to
|
430
|
-
expect(subject.header['Cache-Control']).to
|
427
|
+
expect(subject.stream).to be_nil
|
428
|
+
expect(subject.header['Cache-Control']).to be_nil
|
431
429
|
end
|
432
430
|
end
|
433
431
|
|
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
3
|
module Grape
|
6
4
|
module DSL
|
7
5
|
module RequestResponseSpec
|
@@ -162,34 +160,34 @@ module Grape
|
|
162
160
|
|
163
161
|
describe 'list of exceptions is passed' do
|
164
162
|
it 'sets hash of exceptions as rescue handlers' do
|
165
|
-
expect(subject).to receive(:namespace_reverse_stackable).with(:rescue_handlers, StandardError => nil)
|
163
|
+
expect(subject).to receive(:namespace_reverse_stackable).with(:rescue_handlers, { StandardError => nil })
|
166
164
|
expect(subject).to receive(:namespace_stackable).with(:rescue_options, {})
|
167
165
|
subject.rescue_from StandardError
|
168
166
|
end
|
169
167
|
|
170
168
|
it 'rescues only base handlers if rescue_subclasses: false option is passed' do
|
171
|
-
expect(subject).to receive(:namespace_reverse_stackable).with(:base_only_rescue_handlers, StandardError => nil)
|
172
|
-
expect(subject).to receive(:namespace_stackable).with(:rescue_options, rescue_subclasses: false)
|
169
|
+
expect(subject).to receive(:namespace_reverse_stackable).with(:base_only_rescue_handlers, { StandardError => nil })
|
170
|
+
expect(subject).to receive(:namespace_stackable).with(:rescue_options, { rescue_subclasses: false })
|
173
171
|
subject.rescue_from StandardError, rescue_subclasses: false
|
174
172
|
end
|
175
173
|
|
176
174
|
it 'sets given proc as rescue handler for each key in hash' do
|
177
175
|
rescue_handler_proc = proc {}
|
178
|
-
expect(subject).to receive(:namespace_reverse_stackable).with(:rescue_handlers, StandardError => rescue_handler_proc)
|
176
|
+
expect(subject).to receive(:namespace_reverse_stackable).with(:rescue_handlers, { StandardError => rescue_handler_proc })
|
179
177
|
expect(subject).to receive(:namespace_stackable).with(:rescue_options, {})
|
180
178
|
subject.rescue_from StandardError, rescue_handler_proc
|
181
179
|
end
|
182
180
|
|
183
181
|
it 'sets given block as rescue handler for each key in hash' do
|
184
182
|
rescue_handler_proc = proc {}
|
185
|
-
expect(subject).to receive(:namespace_reverse_stackable).with(:rescue_handlers, StandardError => rescue_handler_proc)
|
183
|
+
expect(subject).to receive(:namespace_reverse_stackable).with(:rescue_handlers, { StandardError => rescue_handler_proc })
|
186
184
|
expect(subject).to receive(:namespace_stackable).with(:rescue_options, {})
|
187
185
|
subject.rescue_from StandardError, &rescue_handler_proc
|
188
186
|
end
|
189
187
|
|
190
188
|
it 'sets a rescue handler declared through :with option for each key in hash' do
|
191
189
|
with_block = -> { 'hello' }
|
192
|
-
expect(subject).to receive(:namespace_reverse_stackable).with(:rescue_handlers, StandardError => an_instance_of(Proc))
|
190
|
+
expect(subject).to receive(:namespace_reverse_stackable).with(:rescue_handlers, { StandardError => an_instance_of(Proc) })
|
193
191
|
expect(subject).to receive(:namespace_stackable).with(:rescue_options, {})
|
194
192
|
subject.rescue_from StandardError, with: with_block
|
195
193
|
end
|
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
3
|
module Grape
|
6
4
|
module DSL
|
7
5
|
module RoutingSpec
|
@@ -21,7 +19,7 @@ module Grape
|
|
21
19
|
it 'sets a version for route' do
|
22
20
|
version = 'v1'
|
23
21
|
expect(subject).to receive(:namespace_inheritable).with(:version, [version])
|
24
|
-
expect(subject).to receive(:namespace_inheritable).with(:version_options, using: :path)
|
22
|
+
expect(subject).to receive(:namespace_inheritable).with(:version_options, { using: :path })
|
25
23
|
expect(subject.version(version)).to eq(version)
|
26
24
|
end
|
27
25
|
end
|
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
3
|
module Grape
|
6
4
|
module DSL
|
7
5
|
module ValidationsSpec
|
@@ -38,10 +36,6 @@ module Grape
|
|
38
36
|
expect(subject.namespace_stackable(:params)).to eq []
|
39
37
|
end
|
40
38
|
|
41
|
-
it 'resets documentation params' do
|
42
|
-
expect(subject.route_setting(:description)[:params]).to be_nil
|
43
|
-
end
|
44
|
-
|
45
39
|
it 'does not reset documentation description' do
|
46
40
|
expect(subject.route_setting(:description)[:description]).to eq 'lol'
|
47
41
|
end
|
@@ -56,17 +50,6 @@ module Grape
|
|
56
50
|
expect { subject.params { raise 'foo' } }.to raise_error RuntimeError, 'foo'
|
57
51
|
end
|
58
52
|
end
|
59
|
-
|
60
|
-
describe '.document_attribute' do
|
61
|
-
before do
|
62
|
-
subject.document_attribute([full_name: 'xxx'], foo: 'bar')
|
63
|
-
end
|
64
|
-
|
65
|
-
it 'creates a param documentation' do
|
66
|
-
expect(subject.namespace_stackable(:params)).to eq(['xxx' => { foo: 'bar' }])
|
67
|
-
expect(subject.route_setting(:description)).to eq(params: { 'xxx' => { foo: 'bar' } })
|
68
|
-
end
|
69
|
-
end
|
70
53
|
end
|
71
54
|
end
|
72
55
|
end
|
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
3
|
describe Grape::Endpoint do
|
6
4
|
subject { Class.new(Grape::API) }
|
7
5
|
|
@@ -249,7 +247,7 @@ describe Grape::Endpoint do
|
|
249
247
|
end
|
250
248
|
get '/declared?first=one&other=two'
|
251
249
|
expect(last_response.status).to eq(200)
|
252
|
-
expect(JSON.parse(last_response.body).key?(:other)).to
|
250
|
+
expect(JSON.parse(last_response.body).key?(:other)).to be false
|
253
251
|
end
|
254
252
|
|
255
253
|
it 'stringifies if that option is passed' do
|
@@ -522,7 +520,7 @@ describe Grape::Endpoint do
|
|
522
520
|
json = JSON.parse(last_response.body, symbolize_names: true)
|
523
521
|
|
524
522
|
expect(json[:declared_params][:id]).to eq 123
|
525
|
-
expect(json[:declared_params_no_parent][:id]).to
|
523
|
+
expect(json[:declared_params_no_parent][:id]).to be_nil
|
526
524
|
end
|
527
525
|
end
|
528
526
|
|
data/spec/grape/endpoint_spec.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
3
|
describe Grape::Endpoint do
|
6
4
|
subject { Class.new(Grape::API) }
|
7
5
|
|
@@ -434,7 +432,28 @@ describe Grape::Endpoint do
|
|
434
432
|
end
|
435
433
|
post '/upload', { file: '' }, 'CONTENT_TYPE' => 'multipart/form-data; boundary=foobar'
|
436
434
|
expect(last_response.status).to eq(400)
|
437
|
-
expect(last_response.body).to eq('
|
435
|
+
expect(last_response.body).to eq('empty message body supplied with multipart/form-data; boundary=foobar content-type')
|
436
|
+
end
|
437
|
+
end
|
438
|
+
|
439
|
+
context 'when the limit on multipart files is exceeded' do
|
440
|
+
around do |example|
|
441
|
+
limit = Rack::Utils.multipart_part_limit
|
442
|
+
Rack::Utils.multipart_part_limit = 1
|
443
|
+
example.run
|
444
|
+
Rack::Utils.multipart_part_limit = limit
|
445
|
+
end
|
446
|
+
|
447
|
+
it 'returns a 413 if given too many multipart files' do
|
448
|
+
subject.params do
|
449
|
+
requires :file, type: Rack::Multipart::UploadedFile
|
450
|
+
end
|
451
|
+
subject.post '/upload' do
|
452
|
+
params[:file][:filename]
|
453
|
+
end
|
454
|
+
post '/upload', { file: Rack::Test::UploadedFile.new(__FILE__, 'text/plain'), extra: Rack::Test::UploadedFile.new(__FILE__, 'text/plain') }
|
455
|
+
expect(last_response.status).to eq(413)
|
456
|
+
expect(last_response.body).to eq("the number of uploaded files exceeded the system's configured limit (1)")
|
438
457
|
end
|
439
458
|
end
|
440
459
|
|
data/spec/grape/entity_spec.rb
CHANGED
@@ -1,8 +1,22 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
3
|
describe Grape::Exceptions::Base do
|
4
|
+
describe '#to_s' do
|
5
|
+
subject { described_class.new(message: message).to_s }
|
6
|
+
|
7
|
+
let(:message) { 'a_message' }
|
8
|
+
|
9
|
+
it { is_expected.to eq(message) }
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '#message' do
|
13
|
+
subject { described_class.new(message: message).message }
|
14
|
+
|
15
|
+
let(:message) { 'a_message' }
|
16
|
+
|
17
|
+
it { is_expected.to eq(message) }
|
18
|
+
end
|
19
|
+
|
6
20
|
describe '#compose_message' do
|
7
21
|
subject { described_class.new.send(:compose_message, key, **attributes) }
|
8
22
|
|
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
3
|
describe Grape::Exceptions::InvalidVersionerOption do
|
6
4
|
describe '#message' do
|
7
5
|
let(:error) do
|
@@ -10,7 +8,7 @@ describe Grape::Exceptions::InvalidVersionerOption do
|
|
10
8
|
|
11
9
|
it 'contains the problem in the message' do
|
12
10
|
expect(error.message).to include(
|
13
|
-
'
|
11
|
+
'unknown :using for versioner: headers'
|
14
12
|
)
|
15
13
|
end
|
16
14
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RSpec.describe Grape::Exceptions::MissingGroupType do
|
4
|
+
describe '#message' do
|
5
|
+
subject { described_class.new.message }
|
6
|
+
|
7
|
+
it { is_expected.to include 'group type is required' }
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'deprecated Grape::Exceptions::MissingGroupTypeError' do
|
11
|
+
subject { Grape::Exceptions::MissingGroupTypeError.new }
|
12
|
+
|
13
|
+
it 'puts a deprecation warning' do
|
14
|
+
expect(Warning).to receive(:warn) do |message|
|
15
|
+
expect(message).to include('`Grape::Exceptions::MissingGroupTypeError` is deprecated')
|
16
|
+
end
|
17
|
+
|
18
|
+
subject
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
3
|
describe Grape::Exceptions::MissingOption do
|
6
4
|
describe '#message' do
|
7
5
|
let(:error) do
|
@@ -10,7 +8,7 @@ describe Grape::Exceptions::MissingOption do
|
|
10
8
|
|
11
9
|
it 'contains the problem in the message' do
|
12
10
|
expect(error.message).to include(
|
13
|
-
'
|
11
|
+
'you must specify :path options'
|
14
12
|
)
|
15
13
|
end
|
16
14
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RSpec.describe Grape::Exceptions::UnsupportedGroupType do
|
4
|
+
subject { described_class.new }
|
5
|
+
|
6
|
+
describe '#message' do
|
7
|
+
subject { described_class.new.message }
|
8
|
+
|
9
|
+
it { is_expected.to include 'group type must be Array, Hash, JSON or Array[JSON]' }
|
10
|
+
end
|
11
|
+
|
12
|
+
describe 'deprecated Grape::Exceptions::UnsupportedGroupTypeError' do
|
13
|
+
subject { Grape::Exceptions::UnsupportedGroupTypeError.new }
|
14
|
+
|
15
|
+
it 'puts a deprecation warning' do
|
16
|
+
expect(Warning).to receive(:warn) do |message|
|
17
|
+
expect(message).to include('`Grape::Exceptions::UnsupportedGroupTypeError` is deprecated')
|
18
|
+
end
|
19
|
+
|
20
|
+
subject
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|