grape 1.5.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 +75 -0
- data/CONTRIBUTING.md +2 -1
- data/README.md +152 -21
- data/UPGRADING.md +86 -2
- data/grape.gemspec +5 -5
- data/lib/grape/api/instance.rb +14 -18
- data/lib/grape/api.rb +18 -13
- data/lib/grape/cookies.rb +2 -0
- 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 +2 -19
- data/lib/grape/dsl/headers.rb +5 -2
- data/lib/grape/dsl/helpers.rb +7 -7
- data/lib/grape/dsl/inside_route.rb +43 -30
- data/lib/grape/dsl/middleware.rb +4 -6
- data/lib/grape/dsl/parameters.rb +8 -10
- data/lib/grape/dsl/request_response.rb +9 -8
- data/lib/grape/dsl/routing.rb +6 -4
- data/lib/grape/dsl/settings.rb +5 -7
- data/lib/grape/dsl/validations.rb +0 -15
- data/lib/grape/endpoint.rb +21 -36
- data/lib/grape/error_formatter/json.rb +9 -7
- data/lib/grape/error_formatter/xml.rb +2 -6
- data/lib/grape/exceptions/base.rb +2 -2
- data/lib/grape/exceptions/empty_message_body.rb +11 -0
- 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 +1 -6
- data/lib/grape/formatter/json.rb +1 -0
- data/lib/grape/formatter/serializable_hash.rb +2 -1
- data/lib/grape/formatter/xml.rb +1 -0
- data/lib/grape/locale/en.yml +9 -8
- data/lib/grape/middleware/auth/dsl.rb +7 -2
- data/lib/grape/middleware/base.rb +3 -1
- data/lib/grape/middleware/error.rb +2 -2
- data/lib/grape/middleware/formatter.rb +4 -4
- data/lib/grape/middleware/stack.rb +2 -2
- data/lib/grape/middleware/versioner/accept_version_header.rb +3 -5
- data/lib/grape/middleware/versioner/header.rb +6 -4
- data/lib/grape/middleware/versioner/param.rb +1 -0
- data/lib/grape/middleware/versioner/parse_media_type_patch.rb +2 -1
- data/lib/grape/middleware/versioner/path.rb +2 -0
- data/lib/grape/parser/json.rb +1 -1
- data/lib/grape/parser/xml.rb +1 -1
- data/lib/grape/path.rb +1 -0
- data/lib/grape/request.rb +5 -0
- data/lib/grape/router/pattern.rb +1 -1
- data/lib/grape/router/route.rb +2 -2
- data/lib/grape/router.rb +6 -0
- data/lib/grape/util/inheritable_setting.rb +1 -3
- data/lib/grape/util/json.rb +2 -0
- data/lib/grape/util/lazy_value.rb +3 -2
- data/lib/grape/util/strict_hash_configuration.rb +1 -1
- data/lib/grape/validations/attributes_doc.rb +58 -0
- data/lib/grape/validations/params_scope.rb +137 -78
- data/lib/grape/validations/types/array_coercer.rb +0 -2
- data/lib/grape/validations/types/custom_type_coercer.rb +1 -2
- data/lib/grape/validations/types/dry_type_coercer.rb +4 -8
- data/lib/grape/validations/types/json.rb +2 -1
- data/lib/grape/validations/types/primitive_coercer.rb +16 -8
- 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_of_validator.rb +16 -0
- data/lib/grape/validations/validators/allow_blank_validator.rb +20 -0
- data/lib/grape/validations/validators/as_validator.rb +14 -0
- data/lib/grape/validations/validators/at_least_one_of_validator.rb +15 -0
- data/lib/grape/validations/validators/base.rb +82 -70
- data/lib/grape/validations/validators/coerce_validator.rb +75 -0
- data/lib/grape/validations/validators/default_validator.rb +51 -0
- data/lib/grape/validations/validators/exactly_one_of_validator.rb +17 -0
- data/lib/grape/validations/validators/except_values_validator.rb +24 -0
- data/lib/grape/validations/validators/multiple_params_base.rb +24 -20
- data/lib/grape/validations/validators/mutual_exclusion_validator.rb +16 -0
- data/lib/grape/validations/validators/presence_validator.rb +15 -0
- data/lib/grape/validations/validators/regexp_validator.rb +16 -0
- data/lib/grape/validations/validators/same_as_validator.rb +29 -0
- data/lib/grape/validations/validators/values_validator.rb +88 -0
- data/lib/grape/validations.rb +16 -6
- data/lib/grape/version.rb +1 -1
- data/lib/grape.rb +70 -29
- data/spec/grape/api/custom_validations_spec.rb +116 -45
- data/spec/grape/api/deeply_included_options_spec.rb +3 -5
- data/spec/grape/api/defines_boolean_in_params_spec.rb +2 -3
- 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 +2 -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 +1 -3
- 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 +8 -10
- data/spec/grape/api/shared_helpers_exactly_one_of_spec.rb +9 -17
- data/spec/grape/api/shared_helpers_spec.rb +0 -2
- data/spec/grape/api_remount_spec.rb +16 -16
- data/spec/grape/api_spec.rb +527 -224
- data/spec/grape/config_spec.rb +0 -2
- data/spec/grape/dsl/callbacks_spec.rb +2 -3
- 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 +39 -11
- data/spec/grape/dsl/helpers_spec.rb +3 -4
- data/spec/grape/dsl/inside_route_spec.rb +16 -16
- data/spec/grape/dsl/logger_spec.rb +15 -19
- data/spec/grape/dsl/middleware_spec.rb +2 -3
- data/spec/grape/dsl/parameters_spec.rb +2 -2
- data/spec/grape/dsl/request_response_spec.rb +7 -8
- data/spec/grape/dsl/routing_spec.rb +11 -10
- 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 +261 -16
- data/spec/grape/endpoint_spec.rb +98 -57
- data/spec/grape/entity_spec.rb +22 -23
- data/spec/grape/exceptions/base_spec.rb +16 -2
- data/spec/grape/exceptions/body_parse_errors_spec.rb +3 -2
- data/spec/grape/exceptions/invalid_accept_header_spec.rb +61 -24
- 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 +13 -11
- data/spec/grape/exceptions/validation_spec.rb +5 -5
- data/spec/grape/extensions/param_builders/hash_spec.rb +7 -9
- data/spec/grape/extensions/param_builders/hash_with_indifferent_access_spec.rb +8 -10
- data/spec/grape/extensions/param_builders/hashie/mash_spec.rb +8 -10
- data/spec/grape/integration/global_namespace_function_spec.rb +0 -2
- data/spec/grape/integration/rack_sendfile_spec.rb +1 -3
- data/spec/grape/integration/rack_spec.rb +0 -2
- data/spec/grape/loading_spec.rb +8 -10
- data/spec/grape/middleware/auth/base_spec.rb +0 -1
- data/spec/grape/middleware/auth/dsl_spec.rb +15 -8
- data/spec/grape/middleware/auth/strategies_spec.rb +60 -22
- data/spec/grape/middleware/base_spec.rb +24 -17
- data/spec/grape/middleware/error_spec.rb +8 -3
- data/spec/grape/middleware/exception_spec.rb +111 -163
- data/spec/grape/middleware/formatter_spec.rb +27 -8
- data/spec/grape/middleware/globals_spec.rb +7 -6
- data/spec/grape/middleware/stack_spec.rb +14 -14
- data/spec/grape/middleware/versioner/accept_version_header_spec.rb +2 -3
- data/spec/grape/middleware/versioner/header_spec.rb +30 -15
- data/spec/grape/middleware/versioner/param_spec.rb +7 -3
- data/spec/grape/middleware/versioner/path_spec.rb +5 -3
- data/spec/grape/middleware/versioner_spec.rb +1 -3
- data/spec/grape/named_api_spec.rb +0 -2
- data/spec/grape/parser_spec.rb +4 -2
- data/spec/grape/path_spec.rb +52 -54
- data/spec/grape/presenters/presenter_spec.rb +7 -8
- data/spec/grape/request_spec.rb +6 -6
- data/spec/grape/util/inheritable_setting_spec.rb +7 -8
- data/spec/grape/util/inheritable_values_spec.rb +3 -3
- data/spec/grape/util/reverse_stackable_values_spec.rb +3 -2
- data/spec/grape/util/stackable_values_spec.rb +7 -6
- 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 +9 -12
- data/spec/grape/validations/multiple_attributes_iterator_spec.rb +1 -2
- data/spec/grape/validations/params_scope_spec.rb +361 -96
- data/spec/grape/validations/single_attribute_iterator_spec.rb +2 -3
- data/spec/grape/validations/types/array_coercer_spec.rb +0 -2
- data/spec/grape/validations/types/primitive_coercer_spec.rb +24 -9
- data/spec/grape/validations/types/set_coercer_spec.rb +0 -2
- data/spec/grape/validations/types_spec.rb +36 -10
- data/spec/grape/validations/validators/all_or_none_spec.rb +50 -58
- data/spec/grape/validations/validators/allow_blank_spec.rb +135 -141
- data/spec/grape/validations/validators/at_least_one_of_spec.rb +50 -58
- data/spec/grape/validations/validators/coerce_spec.rb +99 -24
- data/spec/grape/validations/validators/default_spec.rb +72 -80
- data/spec/grape/validations/validators/exactly_one_of_spec.rb +71 -79
- data/spec/grape/validations/validators/except_values_spec.rb +3 -5
- data/spec/grape/validations/validators/mutual_exclusion_spec.rb +71 -79
- data/spec/grape/validations/validators/presence_spec.rb +16 -3
- data/spec/grape/validations/validators/regexp_spec.rb +25 -33
- data/spec/grape/validations/validators/same_as_spec.rb +14 -22
- data/spec/grape/validations/validators/values_spec.rb +182 -179
- data/spec/grape/validations_spec.rb +149 -80
- data/spec/integration/eager_load/eager_load_spec.rb +2 -2
- data/spec/integration/multi_json/json_spec.rb +1 -3
- data/spec/integration/multi_xml/xml_spec.rb +1 -3
- data/spec/shared/versioning_examples.rb +12 -9
- data/spec/spec_helper.rb +21 -6
- data/spec/support/basic_auth_encode_helpers.rb +1 -1
- metadata +125 -115
- data/lib/grape/validations/validators/all_or_none.rb +0 -15
- data/lib/grape/validations/validators/allow_blank.rb +0 -18
- data/lib/grape/validations/validators/as.rb +0 -16
- data/lib/grape/validations/validators/at_least_one_of.rb +0 -14
- data/lib/grape/validations/validators/coerce.rb +0 -91
- data/lib/grape/validations/validators/default.rb +0 -48
- data/lib/grape/validations/validators/exactly_one_of.rb +0 -16
- data/lib/grape/validations/validators/except_values.rb +0 -22
- data/lib/grape/validations/validators/mutual_exclusion.rb +0 -15
- data/lib/grape/validations/validators/presence.rb +0 -12
- data/lib/grape/validations/validators/regexp.rb +0 -13
- data/lib/grape/validations/validators/same_as.rb +0 -26
- data/lib/grape/validations/validators/values.rb +0 -83
- data/spec/support/eager_load.rb +0 -19
@@ -1,96 +1,88 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
module ValidationsSpec
|
10
|
-
module ExactlyOneOfValidatorSpec
|
11
|
-
class API < Grape::API
|
12
|
-
rescue_from Grape::Exceptions::ValidationErrors do |e|
|
13
|
-
error!(e.errors.transform_keys! { |key| key.join(',') }, 400)
|
14
|
-
end
|
3
|
+
describe Grape::Validations::Validators::ExactlyOneOfValidator do
|
4
|
+
let_it_be(:app) do
|
5
|
+
Class.new(Grape::API) do
|
6
|
+
rescue_from Grape::Exceptions::ValidationErrors do |e|
|
7
|
+
error!(e.errors.transform_keys! { |key| key.join(',') }, 400)
|
8
|
+
end
|
15
9
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
10
|
+
params do
|
11
|
+
optional :beer
|
12
|
+
optional :wine
|
13
|
+
optional :grapefruit
|
14
|
+
exactly_one_of :beer, :wine, :grapefruit
|
15
|
+
end
|
16
|
+
post do
|
17
|
+
end
|
24
18
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
19
|
+
params do
|
20
|
+
optional :beer
|
21
|
+
optional :wine
|
22
|
+
optional :grapefruit
|
23
|
+
optional :other
|
24
|
+
exactly_one_of :beer, :wine, :grapefruit
|
25
|
+
end
|
26
|
+
post 'mixed-params' do
|
27
|
+
end
|
34
28
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
29
|
+
params do
|
30
|
+
optional :beer
|
31
|
+
optional :wine
|
32
|
+
optional :grapefruit
|
33
|
+
exactly_one_of :beer, :wine, :grapefruit, message: 'you should choose one'
|
34
|
+
end
|
35
|
+
post '/custom-message' do
|
36
|
+
end
|
43
37
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
38
|
+
params do
|
39
|
+
requires :item, type: Hash do
|
40
|
+
optional :beer
|
41
|
+
optional :wine
|
42
|
+
optional :grapefruit
|
43
|
+
exactly_one_of :beer, :wine, :grapefruit
|
44
|
+
end
|
45
|
+
end
|
46
|
+
post '/nested-hash' do
|
47
|
+
end
|
54
48
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
49
|
+
params do
|
50
|
+
optional :item, type: Hash do
|
51
|
+
optional :beer
|
52
|
+
optional :wine
|
53
|
+
optional :grapefruit
|
54
|
+
exactly_one_of :beer, :wine, :grapefruit
|
55
|
+
end
|
56
|
+
end
|
57
|
+
post '/nested-optional-hash' do
|
58
|
+
end
|
65
59
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
60
|
+
params do
|
61
|
+
requires :items, type: Array do
|
62
|
+
optional :beer
|
63
|
+
optional :wine
|
64
|
+
optional :grapefruit
|
65
|
+
exactly_one_of :beer, :wine, :grapefruit
|
66
|
+
end
|
67
|
+
end
|
68
|
+
post '/nested-array' do
|
69
|
+
end
|
76
70
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
post '/deeply-nested-array' do
|
71
|
+
params do
|
72
|
+
requires :items, type: Array do
|
73
|
+
requires :nested_items, type: Array do
|
74
|
+
optional :beer, :wine, :grapefruit, type: Grape::API::Boolean
|
75
|
+
exactly_one_of :beer, :wine, :grapefruit
|
86
76
|
end
|
87
77
|
end
|
88
78
|
end
|
79
|
+
post '/deeply-nested-array' do
|
80
|
+
end
|
89
81
|
end
|
82
|
+
end
|
90
83
|
|
91
|
-
|
92
|
-
|
93
|
-
end
|
84
|
+
describe '#validate!' do
|
85
|
+
subject(:validate) { post path, params }
|
94
86
|
|
95
87
|
context 'when all params are present' do
|
96
88
|
let(:path) { '/' }
|
@@ -1,11 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
describe Grape::Validations::ExceptValuesValidator do
|
3
|
+
describe Grape::Validations::Validators::ExceptValuesValidator do
|
6
4
|
module ValidationsSpec
|
7
5
|
class ExceptValuesModel
|
8
|
-
DEFAULT_EXCEPTS = [
|
6
|
+
DEFAULT_EXCEPTS = %w[invalid-type1 invalid-type2 invalid-type3].freeze
|
9
7
|
class << self
|
10
8
|
attr_accessor :excepts
|
11
9
|
|
@@ -170,7 +168,7 @@ describe Grape::Validations::ExceptValuesValidator do
|
|
170
168
|
it 'raises IncompatibleOptionValues when type is incompatible with values array' do
|
171
169
|
subject = Class.new(Grape::API)
|
172
170
|
expect do
|
173
|
-
subject.params { optional :type, except_values: [
|
171
|
+
subject.params { optional :type, except_values: %w[valid-type1 valid-type2 valid-type3], type: Symbol }
|
174
172
|
end.to raise_error Grape::Exceptions::IncompatibleOptionValues
|
175
173
|
end
|
176
174
|
|
@@ -1,96 +1,88 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
module ValidationsSpec
|
10
|
-
module MutualExclusionValidatorSpec
|
11
|
-
class API < Grape::API
|
12
|
-
rescue_from Grape::Exceptions::ValidationErrors do |e|
|
13
|
-
error!(e.errors.transform_keys! { |key| key.join(',') }, 400)
|
14
|
-
end
|
3
|
+
describe Grape::Validations::Validators::MutualExclusionValidator do
|
4
|
+
let_it_be(:app) do
|
5
|
+
Class.new(Grape::API) do
|
6
|
+
rescue_from Grape::Exceptions::ValidationErrors do |e|
|
7
|
+
error!(e.errors.transform_keys! { |key| key.join(',') }, 400)
|
8
|
+
end
|
15
9
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
10
|
+
params do
|
11
|
+
optional :beer
|
12
|
+
optional :wine
|
13
|
+
optional :grapefruit
|
14
|
+
mutually_exclusive :beer, :wine, :grapefruit
|
15
|
+
end
|
16
|
+
post do
|
17
|
+
end
|
24
18
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
19
|
+
params do
|
20
|
+
optional :beer
|
21
|
+
optional :wine
|
22
|
+
optional :grapefruit
|
23
|
+
optional :other
|
24
|
+
mutually_exclusive :beer, :wine, :grapefruit
|
25
|
+
end
|
26
|
+
post 'mixed-params' do
|
27
|
+
end
|
34
28
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
29
|
+
params do
|
30
|
+
optional :beer
|
31
|
+
optional :wine
|
32
|
+
optional :grapefruit
|
33
|
+
mutually_exclusive :beer, :wine, :grapefruit, message: 'you should not mix beer and wine'
|
34
|
+
end
|
35
|
+
post '/custom-message' do
|
36
|
+
end
|
43
37
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
38
|
+
params do
|
39
|
+
requires :item, type: Hash do
|
40
|
+
optional :beer
|
41
|
+
optional :wine
|
42
|
+
optional :grapefruit
|
43
|
+
mutually_exclusive :beer, :wine, :grapefruit
|
44
|
+
end
|
45
|
+
end
|
46
|
+
post '/nested-hash' do
|
47
|
+
end
|
54
48
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
49
|
+
params do
|
50
|
+
optional :item, type: Hash do
|
51
|
+
optional :beer
|
52
|
+
optional :wine
|
53
|
+
optional :grapefruit
|
54
|
+
mutually_exclusive :beer, :wine, :grapefruit
|
55
|
+
end
|
56
|
+
end
|
57
|
+
post '/nested-optional-hash' do
|
58
|
+
end
|
65
59
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
60
|
+
params do
|
61
|
+
requires :items, type: Array do
|
62
|
+
optional :beer
|
63
|
+
optional :wine
|
64
|
+
optional :grapefruit
|
65
|
+
mutually_exclusive :beer, :wine, :grapefruit
|
66
|
+
end
|
67
|
+
end
|
68
|
+
post '/nested-array' do
|
69
|
+
end
|
76
70
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
post '/deeply-nested-array' do
|
71
|
+
params do
|
72
|
+
requires :items, type: Array do
|
73
|
+
requires :nested_items, type: Array do
|
74
|
+
optional :beer, :wine, :grapefruit, type: Grape::API::Boolean
|
75
|
+
mutually_exclusive :beer, :wine, :grapefruit
|
86
76
|
end
|
87
77
|
end
|
88
78
|
end
|
79
|
+
post '/deeply-nested-array' do
|
80
|
+
end
|
89
81
|
end
|
82
|
+
end
|
90
83
|
|
91
|
-
|
92
|
-
|
93
|
-
end
|
84
|
+
describe '#validate!' do
|
85
|
+
subject(:validate) { post path, params }
|
94
86
|
|
95
87
|
context 'when all mutually exclusive params are present' do
|
96
88
|
let(:path) { '/' }
|
@@ -1,13 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
describe Grape::Validations::PresenceValidator do
|
3
|
+
describe Grape::Validations::Validators::PresenceValidator do
|
6
4
|
subject do
|
7
5
|
Class.new(Grape::API) do
|
8
6
|
format :json
|
9
7
|
end
|
10
8
|
end
|
9
|
+
|
11
10
|
def app
|
12
11
|
subject
|
13
12
|
end
|
@@ -20,6 +19,7 @@ describe Grape::Validations::PresenceValidator do
|
|
20
19
|
end
|
21
20
|
end
|
22
21
|
end
|
22
|
+
|
23
23
|
it 'does not validate for any params' do
|
24
24
|
get '/bacons'
|
25
25
|
expect(last_response.status).to eq(200)
|
@@ -38,15 +38,18 @@ describe Grape::Validations::PresenceValidator do
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
41
|
+
|
41
42
|
it 'requires when missing' do
|
42
43
|
get '/requires'
|
43
44
|
expect(last_response.status).to eq(400)
|
44
45
|
expect(last_response.body).to eq('{"error":"email is required, email has no value"}')
|
45
46
|
end
|
47
|
+
|
46
48
|
it 'requires when empty' do
|
47
49
|
get '/requires', email: ''
|
48
50
|
expect(last_response.body).to eq('{"error":"email has no value, email format is invalid"}')
|
49
51
|
end
|
52
|
+
|
50
53
|
it 'valid when set' do
|
51
54
|
get '/requires', email: 'bob@example.com'
|
52
55
|
expect(last_response.status).to eq(200)
|
@@ -64,6 +67,7 @@ describe Grape::Validations::PresenceValidator do
|
|
64
67
|
{ ret: params[:id] }
|
65
68
|
end
|
66
69
|
end
|
70
|
+
|
67
71
|
it 'validates id' do
|
68
72
|
post '/'
|
69
73
|
expect(last_response.status).to eq(400)
|
@@ -90,16 +94,19 @@ describe Grape::Validations::PresenceValidator do
|
|
90
94
|
'Hello'
|
91
95
|
end
|
92
96
|
end
|
97
|
+
|
93
98
|
it 'requires when missing' do
|
94
99
|
get '/'
|
95
100
|
expect(last_response.status).to eq(400)
|
96
101
|
expect(last_response.body).to eq('{"error":"email is missing, email is empty"}')
|
97
102
|
end
|
103
|
+
|
98
104
|
it 'requires when empty' do
|
99
105
|
get '/', email: ''
|
100
106
|
expect(last_response.status).to eq(400)
|
101
107
|
expect(last_response.body).to eq('{"error":"email is empty, email is invalid"}')
|
102
108
|
end
|
109
|
+
|
103
110
|
it 'valid when set' do
|
104
111
|
get '/', email: 'bob@example.com'
|
105
112
|
expect(last_response.status).to eq(200)
|
@@ -124,6 +131,7 @@ describe Grape::Validations::PresenceValidator do
|
|
124
131
|
'Hello'
|
125
132
|
end
|
126
133
|
end
|
134
|
+
|
127
135
|
it 'validates for all defined params' do
|
128
136
|
get '/single-requires'
|
129
137
|
expect(last_response.status).to eq(400)
|
@@ -144,6 +152,7 @@ describe Grape::Validations::PresenceValidator do
|
|
144
152
|
'Hello'
|
145
153
|
end
|
146
154
|
end
|
155
|
+
|
147
156
|
it 'validates name, company' do
|
148
157
|
get '/'
|
149
158
|
expect(last_response.status).to eq(400)
|
@@ -171,6 +180,7 @@ describe Grape::Validations::PresenceValidator do
|
|
171
180
|
'Nested'
|
172
181
|
end
|
173
182
|
end
|
183
|
+
|
174
184
|
it 'validates nested parameters' do
|
175
185
|
get '/nested'
|
176
186
|
expect(last_response.status).to eq(400)
|
@@ -203,6 +213,7 @@ describe Grape::Validations::PresenceValidator do
|
|
203
213
|
'Nested triple'
|
204
214
|
end
|
205
215
|
end
|
216
|
+
|
206
217
|
it 'validates triple nested parameters' do
|
207
218
|
get '/nested_triple'
|
208
219
|
expect(last_response.status).to eq(400)
|
@@ -252,6 +263,7 @@ describe Grape::Validations::PresenceValidator do
|
|
252
263
|
'Hello optional'
|
253
264
|
end
|
254
265
|
end
|
266
|
+
|
255
267
|
it 'works with required' do
|
256
268
|
get '/required'
|
257
269
|
expect(last_response.status).to eq(400)
|
@@ -261,6 +273,7 @@ describe Grape::Validations::PresenceValidator do
|
|
261
273
|
expect(last_response.status).to eq(200)
|
262
274
|
expect(last_response.body).to eq('Hello required'.to_json)
|
263
275
|
end
|
276
|
+
|
264
277
|
it 'works with optional' do
|
265
278
|
get '/optional'
|
266
279
|
expect(last_response.status).to eq(200)
|
@@ -1,54 +1,46 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
module RegexpValidatorSpec
|
8
|
-
class API < Grape::API
|
9
|
-
default_format :json
|
10
|
-
|
11
|
-
resources :custom_message do
|
12
|
-
params do
|
13
|
-
requires :name, regexp: { value: /^[a-z]+$/, message: 'format is invalid' }
|
14
|
-
end
|
15
|
-
get do
|
16
|
-
end
|
17
|
-
|
18
|
-
params do
|
19
|
-
requires :names, type: { value: Array[String], message: 'can\'t be nil' }, regexp: { value: /^[a-z]+$/, message: 'format is invalid' }
|
20
|
-
end
|
21
|
-
get 'regexp_with_array' do
|
22
|
-
end
|
23
|
-
end
|
3
|
+
describe Grape::Validations::Validators::RegexpValidator do
|
4
|
+
let_it_be(:app) do
|
5
|
+
Class.new(Grape::API) do
|
6
|
+
default_format :json
|
24
7
|
|
8
|
+
resources :custom_message do
|
25
9
|
params do
|
26
|
-
requires :name, regexp: /^[a-z]
|
10
|
+
requires :name, regexp: { value: /^[a-z]+$/, message: 'format is invalid' }
|
27
11
|
end
|
28
12
|
get do
|
29
13
|
end
|
30
14
|
|
31
15
|
params do
|
32
|
-
requires :names, type: Array[String], regexp: /^[a-z]
|
16
|
+
requires :names, type: { value: Array[String], message: 'can\'t be nil' }, regexp: { value: /^[a-z]+$/, message: 'format is invalid' }
|
33
17
|
end
|
34
18
|
get 'regexp_with_array' do
|
35
19
|
end
|
20
|
+
end
|
36
21
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
22
|
+
params do
|
23
|
+
requires :name, regexp: /^[a-z]+$/
|
24
|
+
end
|
25
|
+
get do
|
26
|
+
end
|
27
|
+
|
28
|
+
params do
|
29
|
+
requires :names, type: Array[String], regexp: /^[a-z]+$/
|
30
|
+
end
|
31
|
+
get 'regexp_with_array' do
|
32
|
+
end
|
33
|
+
|
34
|
+
params do
|
35
|
+
requires :people, type: Hash do
|
36
|
+
requires :names, type: Array[String], regexp: /^[a-z]+$/
|
43
37
|
end
|
44
38
|
end
|
39
|
+
get 'nested_regexp_with_array' do
|
40
|
+
end
|
45
41
|
end
|
46
42
|
end
|
47
43
|
|
48
|
-
def app
|
49
|
-
ValidationsSpec::RegexpValidatorSpec::API
|
50
|
-
end
|
51
|
-
|
52
44
|
context 'custom validation message' do
|
53
45
|
context 'with invalid input' do
|
54
46
|
it 'refuses inapppopriate' do
|
@@ -1,32 +1,24 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
end
|
13
|
-
post do
|
14
|
-
end
|
3
|
+
describe Grape::Validations::Validators::SameAsValidator do
|
4
|
+
let_it_be(:app) do
|
5
|
+
Class.new(Grape::API) do
|
6
|
+
params do
|
7
|
+
requires :password
|
8
|
+
requires :password_confirmation, same_as: :password
|
9
|
+
end
|
10
|
+
post do
|
11
|
+
end
|
15
12
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
end
|
13
|
+
params do
|
14
|
+
requires :password
|
15
|
+
requires :password_confirmation, same_as: { value: :password, message: 'not match' }
|
16
|
+
end
|
17
|
+
post '/custom-message' do
|
22
18
|
end
|
23
19
|
end
|
24
20
|
end
|
25
21
|
|
26
|
-
def app
|
27
|
-
ValidationsSpec::SameAsValidatorSpec::API
|
28
|
-
end
|
29
|
-
|
30
22
|
describe '/' do
|
31
23
|
context 'is the same' do
|
32
24
|
it do
|