grape 1.3.3 → 1.6.2
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 +111 -2
- data/CONTRIBUTING.md +2 -1
- data/README.md +135 -23
- data/UPGRADING.md +237 -46
- data/grape.gemspec +5 -5
- data/lib/grape/api/instance.rb +34 -42
- data/lib/grape/api.rb +21 -16
- data/lib/grape/cookies.rb +2 -0
- data/lib/grape/dsl/callbacks.rb +1 -1
- data/lib/grape/dsl/desc.rb +3 -5
- data/lib/grape/dsl/headers.rb +5 -2
- data/lib/grape/dsl/helpers.rb +8 -5
- data/lib/grape/dsl/inside_route.rb +72 -53
- data/lib/grape/dsl/middleware.rb +4 -4
- data/lib/grape/dsl/parameters.rb +11 -7
- data/lib/grape/dsl/request_response.rb +9 -6
- data/lib/grape/dsl/routing.rb +8 -9
- data/lib/grape/dsl/settings.rb +5 -5
- data/lib/grape/dsl/validations.rb +18 -1
- data/lib/grape/eager_load.rb +1 -1
- data/lib/grape/endpoint.rb +29 -42
- data/lib/grape/error_formatter/json.rb +2 -6
- data/lib/grape/error_formatter/xml.rb +2 -6
- data/lib/grape/exceptions/empty_message_body.rb +11 -0
- data/lib/grape/exceptions/validation.rb +2 -3
- data/lib/grape/exceptions/validation_errors.rb +1 -1
- 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 +1 -1
- data/lib/grape/middleware/auth/base.rb +3 -3
- data/lib/grape/middleware/auth/dsl.rb +7 -1
- data/lib/grape/middleware/base.rb +6 -3
- data/lib/grape/middleware/error.rb +11 -13
- data/lib/grape/middleware/formatter.rb +7 -7
- data/lib/grape/middleware/stack.rb +10 -3
- 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 +4 -1
- data/lib/grape/router/attribute_translator.rb +3 -3
- data/lib/grape/router/pattern.rb +1 -1
- data/lib/grape/router/route.rb +2 -2
- data/lib/grape/router.rb +31 -30
- data/lib/grape/{serve_file → serve_stream}/file_body.rb +1 -1
- data/lib/grape/{serve_file → serve_stream}/sendfile_response.rb +1 -1
- data/lib/grape/{serve_file/file_response.rb → serve_stream/stream_response.rb} +8 -8
- data/lib/grape/util/base_inheritable.rb +2 -2
- data/lib/grape/util/inheritable_setting.rb +1 -3
- data/lib/grape/util/lazy_value.rb +4 -2
- data/lib/grape/util/strict_hash_configuration.rb +1 -1
- data/lib/grape/validations/attributes_iterator.rb +8 -0
- data/lib/grape/validations/multiple_attributes_iterator.rb +1 -1
- data/lib/grape/validations/params_scope.rb +97 -62
- data/lib/grape/validations/single_attribute_iterator.rb +1 -1
- data/lib/grape/validations/types/custom_type_coercer.rb +16 -3
- data/lib/grape/validations/types/dry_type_coercer.rb +1 -1
- data/lib/grape/validations/types/invalid_value.rb +24 -0
- data/lib/grape/validations/types/json.rb +2 -1
- data/lib/grape/validations/types/primitive_coercer.rb +4 -5
- data/lib/grape/validations/types.rb +1 -4
- data/lib/grape/validations/validator_factory.rb +1 -1
- data/lib/grape/validations/validators/all_or_none.rb +8 -5
- data/lib/grape/validations/validators/allow_blank.rb +9 -7
- data/lib/grape/validations/validators/as.rb +6 -8
- data/lib/grape/validations/validators/at_least_one_of.rb +7 -4
- data/lib/grape/validations/validators/base.rb +74 -69
- data/lib/grape/validations/validators/coerce.rb +63 -76
- data/lib/grape/validations/validators/default.rb +36 -34
- data/lib/grape/validations/validators/exactly_one_of.rb +9 -6
- data/lib/grape/validations/validators/except_values.rb +13 -11
- data/lib/grape/validations/validators/multiple_params_base.rb +24 -19
- data/lib/grape/validations/validators/mutual_exclusion.rb +8 -5
- data/lib/grape/validations/validators/presence.rb +7 -4
- data/lib/grape/validations/validators/regexp.rb +8 -5
- data/lib/grape/validations/validators/same_as.rb +18 -15
- data/lib/grape/validations/validators/values.rb +61 -56
- data/lib/grape/validations.rb +6 -0
- data/lib/grape/version.rb +1 -1
- data/lib/grape.rb +7 -3
- data/spec/grape/api/custom_validations_spec.rb +77 -45
- data/spec/grape/api/deeply_included_options_spec.rb +3 -3
- data/spec/grape/api/defines_boolean_in_params_spec.rb +2 -1
- data/spec/grape/api/invalid_format_spec.rb +2 -0
- data/spec/grape/api/recognize_path_spec.rb +1 -1
- data/spec/grape/api/routes_with_requirements_spec.rb +8 -8
- data/spec/grape/api/shared_helpers_exactly_one_of_spec.rb +9 -15
- data/spec/grape/api_remount_spec.rb +25 -19
- data/spec/grape/api_spec.rb +576 -211
- data/spec/grape/dsl/callbacks_spec.rb +2 -1
- data/spec/grape/dsl/headers_spec.rb +39 -9
- data/spec/grape/dsl/helpers_spec.rb +3 -2
- data/spec/grape/dsl/inside_route_spec.rb +185 -34
- data/spec/grape/dsl/logger_spec.rb +16 -18
- data/spec/grape/dsl/middleware_spec.rb +2 -1
- data/spec/grape/dsl/parameters_spec.rb +2 -0
- data/spec/grape/dsl/request_response_spec.rb +1 -0
- data/spec/grape/dsl/routing_spec.rb +10 -7
- data/spec/grape/endpoint/declared_spec.rb +848 -0
- data/spec/grape/endpoint_spec.rb +77 -589
- data/spec/grape/entity_spec.rb +29 -23
- data/spec/grape/exceptions/body_parse_errors_spec.rb +3 -0
- data/spec/grape/exceptions/invalid_accept_header_spec.rb +61 -22
- data/spec/grape/exceptions/validation_errors_spec.rb +13 -10
- data/spec/grape/exceptions/validation_spec.rb +5 -3
- data/spec/grape/extensions/param_builders/hash_spec.rb +7 -7
- data/spec/grape/extensions/param_builders/hash_with_indifferent_access_spec.rb +8 -8
- data/spec/grape/extensions/param_builders/hashie/mash_spec.rb +8 -8
- data/spec/grape/integration/rack_sendfile_spec.rb +13 -9
- data/spec/grape/loading_spec.rb +8 -8
- data/spec/grape/middleware/auth/dsl_spec.rb +15 -6
- data/spec/grape/middleware/auth/strategies_spec.rb +61 -21
- data/spec/grape/middleware/base_spec.rb +24 -15
- data/spec/grape/middleware/error_spec.rb +3 -3
- data/spec/grape/middleware/exception_spec.rb +111 -161
- data/spec/grape/middleware/formatter_spec.rb +28 -7
- data/spec/grape/middleware/globals_spec.rb +7 -4
- data/spec/grape/middleware/stack_spec.rb +15 -12
- data/spec/grape/middleware/versioner/accept_version_header_spec.rb +2 -1
- data/spec/grape/middleware/versioner/header_spec.rb +14 -13
- data/spec/grape/middleware/versioner/param_spec.rb +7 -1
- data/spec/grape/middleware/versioner/path_spec.rb +5 -1
- data/spec/grape/middleware/versioner_spec.rb +1 -1
- data/spec/grape/parser_spec.rb +4 -0
- data/spec/grape/path_spec.rb +52 -52
- data/spec/grape/presenters/presenter_spec.rb +7 -6
- data/spec/grape/request_spec.rb +6 -4
- data/spec/grape/util/inheritable_setting_spec.rb +7 -7
- data/spec/grape/util/inheritable_values_spec.rb +3 -2
- data/spec/grape/util/reverse_stackable_values_spec.rb +3 -1
- data/spec/grape/util/stackable_values_spec.rb +7 -5
- data/spec/grape/validations/instance_behaivour_spec.rb +9 -10
- data/spec/grape/validations/multiple_attributes_iterator_spec.rb +14 -3
- data/spec/grape/validations/params_scope_spec.rb +72 -10
- data/spec/grape/validations/single_attribute_iterator_spec.rb +18 -6
- data/spec/grape/validations/types/primitive_coercer_spec.rb +63 -7
- data/spec/grape/validations/types_spec.rb +8 -8
- data/spec/grape/validations/validators/all_or_none_spec.rb +50 -56
- data/spec/grape/validations/validators/allow_blank_spec.rb +136 -140
- data/spec/grape/validations/validators/at_least_one_of_spec.rb +50 -56
- data/spec/grape/validations/validators/coerce_spec.rb +248 -33
- data/spec/grape/validations/validators/default_spec.rb +121 -78
- data/spec/grape/validations/validators/exactly_one_of_spec.rb +71 -77
- data/spec/grape/validations/validators/except_values_spec.rb +4 -3
- data/spec/grape/validations/validators/mutual_exclusion_spec.rb +71 -77
- data/spec/grape/validations/validators/presence_spec.rb +16 -1
- data/spec/grape/validations/validators/regexp_spec.rb +25 -31
- data/spec/grape/validations/validators/same_as_spec.rb +14 -20
- data/spec/grape/validations/validators/values_spec.rb +183 -178
- data/spec/grape/validations_spec.rb +342 -29
- data/spec/integration/eager_load/eager_load_spec.rb +15 -0
- data/spec/integration/multi_json/json_spec.rb +1 -1
- data/spec/integration/multi_xml/xml_spec.rb +1 -1
- data/spec/shared/versioning_examples.rb +32 -29
- data/spec/spec_helper.rb +12 -12
- data/spec/support/basic_auth_encode_helpers.rb +1 -1
- data/spec/support/chunks.rb +14 -0
- data/spec/support/versioned_helpers.rb +4 -6
- metadata +110 -102
@@ -2,73 +2,67 @@
|
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
-
describe Grape::Validations::AllOrNoneOfValidator do
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
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
|
5
|
+
describe Grape::Validations::Validators::AllOrNoneOfValidator do
|
6
|
+
let_it_be(:app) do
|
7
|
+
Class.new(Grape::API) do
|
8
|
+
rescue_from Grape::Exceptions::ValidationErrors do |e|
|
9
|
+
error!(e.errors.transform_keys! { |key| key.join(',') }, 400)
|
10
|
+
end
|
15
11
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
12
|
+
params do
|
13
|
+
optional :beer, :wine, type: Grape::API::Boolean
|
14
|
+
all_or_none_of :beer, :wine
|
15
|
+
end
|
16
|
+
post do
|
17
|
+
end
|
22
18
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
19
|
+
params do
|
20
|
+
optional :beer, :wine, :other, type: Grape::API::Boolean
|
21
|
+
all_or_none_of :beer, :wine
|
22
|
+
end
|
23
|
+
post 'mixed-params' do
|
24
|
+
end
|
29
25
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
26
|
+
params do
|
27
|
+
optional :beer, :wine, type: Grape::API::Boolean
|
28
|
+
all_or_none_of :beer, :wine, message: 'choose all or none'
|
29
|
+
end
|
30
|
+
post '/custom-message' do
|
31
|
+
end
|
36
32
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
33
|
+
params do
|
34
|
+
requires :item, type: Hash do
|
35
|
+
optional :beer, :wine, type: Grape::API::Boolean
|
36
|
+
all_or_none_of :beer, :wine
|
37
|
+
end
|
38
|
+
end
|
39
|
+
post '/nested-hash' do
|
40
|
+
end
|
45
41
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
42
|
+
params do
|
43
|
+
requires :items, type: Array do
|
44
|
+
optional :beer, :wine, type: Grape::API::Boolean
|
45
|
+
all_or_none_of :beer, :wine
|
46
|
+
end
|
47
|
+
end
|
48
|
+
post '/nested-array' do
|
49
|
+
end
|
54
50
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
post '/deeply-nested-array' do
|
51
|
+
params do
|
52
|
+
requires :items, type: Array do
|
53
|
+
requires :nested_items, type: Array do
|
54
|
+
optional :beer, :wine, type: Grape::API::Boolean
|
55
|
+
all_or_none_of :beer, :wine
|
64
56
|
end
|
65
57
|
end
|
66
58
|
end
|
59
|
+
post '/deeply-nested-array' do
|
60
|
+
end
|
67
61
|
end
|
62
|
+
end
|
68
63
|
|
69
|
-
|
70
|
-
|
71
|
-
end
|
64
|
+
describe '#validate!' do
|
65
|
+
subject(:validate) { post path, params }
|
72
66
|
|
73
67
|
context 'when all restricted params are present' do
|
74
68
|
let(:path) { '/' }
|
@@ -2,24 +2,139 @@
|
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
-
describe Grape::Validations::AllowBlankValidator do
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
default_format :json
|
5
|
+
describe Grape::Validations::Validators::AllowBlankValidator do
|
6
|
+
let_it_be(:app) do
|
7
|
+
Class.new(Grape::API) do
|
8
|
+
default_format :json
|
10
9
|
|
11
|
-
|
10
|
+
params do
|
11
|
+
requires :name, allow_blank: false
|
12
|
+
end
|
13
|
+
get '/disallow_blank'
|
14
|
+
|
15
|
+
params do
|
16
|
+
optional :name, type: String, allow_blank: false
|
17
|
+
end
|
18
|
+
get '/opt_disallow_string_blank'
|
19
|
+
|
20
|
+
params do
|
21
|
+
optional :name, allow_blank: false
|
22
|
+
end
|
23
|
+
get '/disallow_blank_optional_param'
|
24
|
+
|
25
|
+
params do
|
26
|
+
requires :name, allow_blank: true
|
27
|
+
end
|
28
|
+
get '/allow_blank'
|
29
|
+
|
30
|
+
params do
|
31
|
+
requires :val, type: DateTime, allow_blank: true
|
32
|
+
end
|
33
|
+
get '/allow_datetime_blank'
|
34
|
+
|
35
|
+
params do
|
36
|
+
requires :val, type: DateTime, allow_blank: false
|
37
|
+
end
|
38
|
+
get '/disallow_datetime_blank'
|
39
|
+
|
40
|
+
params do
|
41
|
+
requires :val, type: DateTime
|
42
|
+
end
|
43
|
+
get '/default_allow_datetime_blank'
|
44
|
+
|
45
|
+
params do
|
46
|
+
requires :val, type: Date, allow_blank: true
|
47
|
+
end
|
48
|
+
get '/allow_date_blank'
|
49
|
+
|
50
|
+
params do
|
51
|
+
requires :val, type: Integer, allow_blank: true
|
52
|
+
end
|
53
|
+
get '/allow_integer_blank'
|
54
|
+
|
55
|
+
params do
|
56
|
+
requires :val, type: Float, allow_blank: true
|
57
|
+
end
|
58
|
+
get '/allow_float_blank'
|
59
|
+
|
60
|
+
params do
|
61
|
+
requires :val, type: Integer, allow_blank: true
|
62
|
+
end
|
63
|
+
get '/allow_integer_blank'
|
64
|
+
|
65
|
+
params do
|
66
|
+
requires :val, type: Symbol, allow_blank: true
|
67
|
+
end
|
68
|
+
get '/allow_symbol_blank'
|
69
|
+
|
70
|
+
params do
|
71
|
+
requires :val, type: Grape::API::Boolean, allow_blank: true
|
72
|
+
end
|
73
|
+
get '/allow_boolean_blank'
|
74
|
+
|
75
|
+
params do
|
76
|
+
requires :val, type: Grape::API::Boolean, allow_blank: false
|
77
|
+
end
|
78
|
+
get '/disallow_boolean_blank'
|
79
|
+
|
80
|
+
params do
|
81
|
+
optional :user, type: Hash do
|
82
|
+
requires :name, allow_blank: false
|
83
|
+
end
|
84
|
+
end
|
85
|
+
get '/disallow_blank_required_param_in_an_optional_group'
|
86
|
+
|
87
|
+
params do
|
88
|
+
optional :user, type: Hash do
|
89
|
+
requires :name, type: Date, allow_blank: true
|
90
|
+
end
|
91
|
+
end
|
92
|
+
get '/allow_blank_date_param_in_an_optional_group'
|
93
|
+
|
94
|
+
params do
|
95
|
+
optional :user, type: Hash do
|
96
|
+
optional :name, allow_blank: false
|
97
|
+
requires :age
|
98
|
+
end
|
99
|
+
end
|
100
|
+
get '/disallow_blank_optional_param_in_an_optional_group'
|
101
|
+
|
102
|
+
params do
|
103
|
+
requires :user, type: Hash do
|
12
104
|
requires :name, allow_blank: false
|
13
105
|
end
|
14
|
-
|
106
|
+
end
|
107
|
+
get '/disallow_blank_required_param_in_a_required_group'
|
108
|
+
|
109
|
+
params do
|
110
|
+
requires :user, type: Hash do
|
111
|
+
requires :name, allow_blank: false
|
112
|
+
end
|
113
|
+
end
|
114
|
+
get '/disallow_string_value_in_a_required_hash_group'
|
115
|
+
|
116
|
+
params do
|
117
|
+
requires :user, type: Hash do
|
118
|
+
optional :name, allow_blank: false
|
119
|
+
end
|
120
|
+
end
|
121
|
+
get '/disallow_blank_optional_param_in_a_required_group'
|
122
|
+
|
123
|
+
params do
|
124
|
+
optional :user, type: Hash do
|
125
|
+
optional :name, allow_blank: false
|
126
|
+
end
|
127
|
+
end
|
128
|
+
get '/disallow_string_value_in_an_optional_hash_group'
|
15
129
|
|
130
|
+
resources :custom_message do
|
16
131
|
params do
|
17
|
-
|
132
|
+
requires :name, allow_blank: { value: false, message: 'has no value' }
|
18
133
|
end
|
19
|
-
get
|
134
|
+
get
|
20
135
|
|
21
136
|
params do
|
22
|
-
optional :name, allow_blank: false
|
137
|
+
optional :name, allow_blank: { value: false, message: 'has no value' }
|
23
138
|
end
|
24
139
|
get '/disallow_blank_optional_param'
|
25
140
|
|
@@ -34,7 +149,7 @@ describe Grape::Validations::AllowBlankValidator do
|
|
34
149
|
get '/allow_datetime_blank'
|
35
150
|
|
36
151
|
params do
|
37
|
-
requires :val, type: DateTime, allow_blank: false
|
152
|
+
requires :val, type: DateTime, allow_blank: { value: false, message: 'has no value' }
|
38
153
|
end
|
39
154
|
get '/disallow_datetime_blank'
|
40
155
|
|
@@ -69,18 +184,18 @@ describe Grape::Validations::AllowBlankValidator do
|
|
69
184
|
get '/allow_symbol_blank'
|
70
185
|
|
71
186
|
params do
|
72
|
-
requires :val, type: Boolean, allow_blank: true
|
187
|
+
requires :val, type: Grape::API::Boolean, allow_blank: true
|
73
188
|
end
|
74
189
|
get '/allow_boolean_blank'
|
75
190
|
|
76
191
|
params do
|
77
|
-
requires :val, type: Boolean, allow_blank: false
|
192
|
+
requires :val, type: Grape::API::Boolean, allow_blank: { value: false, message: 'has no value' }
|
78
193
|
end
|
79
194
|
get '/disallow_boolean_blank'
|
80
195
|
|
81
196
|
params do
|
82
197
|
optional :user, type: Hash do
|
83
|
-
requires :name, allow_blank: false
|
198
|
+
requires :name, allow_blank: { value: false, message: 'has no value' }
|
84
199
|
end
|
85
200
|
end
|
86
201
|
get '/disallow_blank_required_param_in_an_optional_group'
|
@@ -94,7 +209,7 @@ describe Grape::Validations::AllowBlankValidator do
|
|
94
209
|
|
95
210
|
params do
|
96
211
|
optional :user, type: Hash do
|
97
|
-
optional :name, allow_blank: false
|
212
|
+
optional :name, allow_blank: { value: false, message: 'has no value' }
|
98
213
|
requires :age
|
99
214
|
end
|
100
215
|
end
|
@@ -102,156 +217,35 @@ describe Grape::Validations::AllowBlankValidator do
|
|
102
217
|
|
103
218
|
params do
|
104
219
|
requires :user, type: Hash do
|
105
|
-
requires :name, allow_blank: false
|
220
|
+
requires :name, allow_blank: { value: false, message: 'has no value' }
|
106
221
|
end
|
107
222
|
end
|
108
223
|
get '/disallow_blank_required_param_in_a_required_group'
|
109
224
|
|
110
225
|
params do
|
111
226
|
requires :user, type: Hash do
|
112
|
-
requires :name, allow_blank: false
|
227
|
+
requires :name, allow_blank: { value: false, message: 'has no value' }
|
113
228
|
end
|
114
229
|
end
|
115
230
|
get '/disallow_string_value_in_a_required_hash_group'
|
116
231
|
|
117
232
|
params do
|
118
233
|
requires :user, type: Hash do
|
119
|
-
optional :name, allow_blank: false
|
234
|
+
optional :name, allow_blank: { value: false, message: 'has no value' }
|
120
235
|
end
|
121
236
|
end
|
122
237
|
get '/disallow_blank_optional_param_in_a_required_group'
|
123
238
|
|
124
239
|
params do
|
125
240
|
optional :user, type: Hash do
|
126
|
-
optional :name, allow_blank: false
|
127
|
-
end
|
128
|
-
end
|
129
|
-
get '/disallow_string_value_in_an_optional_hash_group'
|
130
|
-
|
131
|
-
resources :custom_message do
|
132
|
-
params do
|
133
|
-
requires :name, allow_blank: { value: false, message: 'has no value' }
|
134
|
-
end
|
135
|
-
get
|
136
|
-
|
137
|
-
params do
|
138
241
|
optional :name, allow_blank: { value: false, message: 'has no value' }
|
139
242
|
end
|
140
|
-
get '/disallow_blank_optional_param'
|
141
|
-
|
142
|
-
params do
|
143
|
-
requires :name, allow_blank: true
|
144
|
-
end
|
145
|
-
get '/allow_blank'
|
146
|
-
|
147
|
-
params do
|
148
|
-
requires :val, type: DateTime, allow_blank: true
|
149
|
-
end
|
150
|
-
get '/allow_datetime_blank'
|
151
|
-
|
152
|
-
params do
|
153
|
-
requires :val, type: DateTime, allow_blank: { value: false, message: 'has no value' }
|
154
|
-
end
|
155
|
-
get '/disallow_datetime_blank'
|
156
|
-
|
157
|
-
params do
|
158
|
-
requires :val, type: DateTime
|
159
|
-
end
|
160
|
-
get '/default_allow_datetime_blank'
|
161
|
-
|
162
|
-
params do
|
163
|
-
requires :val, type: Date, allow_blank: true
|
164
|
-
end
|
165
|
-
get '/allow_date_blank'
|
166
|
-
|
167
|
-
params do
|
168
|
-
requires :val, type: Integer, allow_blank: true
|
169
|
-
end
|
170
|
-
get '/allow_integer_blank'
|
171
|
-
|
172
|
-
params do
|
173
|
-
requires :val, type: Float, allow_blank: true
|
174
|
-
end
|
175
|
-
get '/allow_float_blank'
|
176
|
-
|
177
|
-
params do
|
178
|
-
requires :val, type: Integer, allow_blank: true
|
179
|
-
end
|
180
|
-
get '/allow_integer_blank'
|
181
|
-
|
182
|
-
params do
|
183
|
-
requires :val, type: Symbol, allow_blank: true
|
184
|
-
end
|
185
|
-
get '/allow_symbol_blank'
|
186
|
-
|
187
|
-
params do
|
188
|
-
requires :val, type: Boolean, allow_blank: true
|
189
|
-
end
|
190
|
-
get '/allow_boolean_blank'
|
191
|
-
|
192
|
-
params do
|
193
|
-
requires :val, type: Boolean, allow_blank: { value: false, message: 'has no value' }
|
194
|
-
end
|
195
|
-
get '/disallow_boolean_blank'
|
196
|
-
|
197
|
-
params do
|
198
|
-
optional :user, type: Hash do
|
199
|
-
requires :name, allow_blank: { value: false, message: 'has no value' }
|
200
|
-
end
|
201
|
-
end
|
202
|
-
get '/disallow_blank_required_param_in_an_optional_group'
|
203
|
-
|
204
|
-
params do
|
205
|
-
optional :user, type: Hash do
|
206
|
-
requires :name, type: Date, allow_blank: true
|
207
|
-
end
|
208
|
-
end
|
209
|
-
get '/allow_blank_date_param_in_an_optional_group'
|
210
|
-
|
211
|
-
params do
|
212
|
-
optional :user, type: Hash do
|
213
|
-
optional :name, allow_blank: { value: false, message: 'has no value' }
|
214
|
-
requires :age
|
215
|
-
end
|
216
|
-
end
|
217
|
-
get '/disallow_blank_optional_param_in_an_optional_group'
|
218
|
-
|
219
|
-
params do
|
220
|
-
requires :user, type: Hash do
|
221
|
-
requires :name, allow_blank: { value: false, message: 'has no value' }
|
222
|
-
end
|
223
|
-
end
|
224
|
-
get '/disallow_blank_required_param_in_a_required_group'
|
225
|
-
|
226
|
-
params do
|
227
|
-
requires :user, type: Hash do
|
228
|
-
requires :name, allow_blank: { value: false, message: 'has no value' }
|
229
|
-
end
|
230
|
-
end
|
231
|
-
get '/disallow_string_value_in_a_required_hash_group'
|
232
|
-
|
233
|
-
params do
|
234
|
-
requires :user, type: Hash do
|
235
|
-
optional :name, allow_blank: { value: false, message: 'has no value' }
|
236
|
-
end
|
237
|
-
end
|
238
|
-
get '/disallow_blank_optional_param_in_a_required_group'
|
239
|
-
|
240
|
-
params do
|
241
|
-
optional :user, type: Hash do
|
242
|
-
optional :name, allow_blank: { value: false, message: 'has no value' }
|
243
|
-
end
|
244
|
-
end
|
245
|
-
get '/disallow_string_value_in_an_optional_hash_group'
|
246
243
|
end
|
244
|
+
get '/disallow_string_value_in_an_optional_hash_group'
|
247
245
|
end
|
248
246
|
end
|
249
247
|
end
|
250
248
|
|
251
|
-
def app
|
252
|
-
ValidationsSpec::AllowBlankValidatorSpec::API
|
253
|
-
end
|
254
|
-
|
255
249
|
context 'invalid input' do
|
256
250
|
it 'refuses empty string' do
|
257
251
|
get '/disallow_blank', name: ''
|
@@ -289,10 +283,12 @@ describe Grape::Validations::AllowBlankValidator do
|
|
289
283
|
get '/custom_message', name: ''
|
290
284
|
expect(last_response.body).to eq('{"error":"name has no value"}')
|
291
285
|
end
|
286
|
+
|
292
287
|
it 'refuses empty string for an optional param' do
|
293
288
|
get '/custom_message/disallow_blank_optional_param', name: ''
|
294
289
|
expect(last_response.body).to eq('{"error":"name has no value"}')
|
295
290
|
end
|
291
|
+
|
296
292
|
it 'refuses only whitespaces' do
|
297
293
|
get '/custom_message', name: ' '
|
298
294
|
expect(last_response.body).to eq('{"error":"name has no value"}')
|
@@ -2,73 +2,67 @@
|
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
-
describe Grape::Validations::AtLeastOneOfValidator do
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
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
|
5
|
+
describe Grape::Validations::Validators::AtLeastOneOfValidator do
|
6
|
+
let_it_be(:app) do
|
7
|
+
Class.new(Grape::API) do
|
8
|
+
rescue_from Grape::Exceptions::ValidationErrors do |e|
|
9
|
+
error!(e.errors.transform_keys! { |key| key.join(',') }, 400)
|
10
|
+
end
|
15
11
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
12
|
+
params do
|
13
|
+
optional :beer, :wine, :grapefruit
|
14
|
+
at_least_one_of :beer, :wine, :grapefruit
|
15
|
+
end
|
16
|
+
post do
|
17
|
+
end
|
22
18
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
19
|
+
params do
|
20
|
+
optional :beer, :wine, :grapefruit, :other
|
21
|
+
at_least_one_of :beer, :wine, :grapefruit
|
22
|
+
end
|
23
|
+
post 'mixed-params' do
|
24
|
+
end
|
29
25
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
26
|
+
params do
|
27
|
+
optional :beer, :wine, :grapefruit
|
28
|
+
at_least_one_of :beer, :wine, :grapefruit, message: 'you should choose something'
|
29
|
+
end
|
30
|
+
post '/custom-message' do
|
31
|
+
end
|
36
32
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
33
|
+
params do
|
34
|
+
requires :item, type: Hash do
|
35
|
+
optional :beer, :wine, :grapefruit
|
36
|
+
at_least_one_of :beer, :wine, :grapefruit, message: 'fail'
|
37
|
+
end
|
38
|
+
end
|
39
|
+
post '/nested-hash' do
|
40
|
+
end
|
45
41
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
42
|
+
params do
|
43
|
+
requires :items, type: Array do
|
44
|
+
optional :beer, :wine, :grapefruit
|
45
|
+
at_least_one_of :beer, :wine, :grapefruit, message: 'fail'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
post '/nested-array' do
|
49
|
+
end
|
54
50
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
post '/deeply-nested-array' do
|
51
|
+
params do
|
52
|
+
requires :items, type: Array do
|
53
|
+
requires :nested_items, type: Array do
|
54
|
+
optional :beer, :wine, :grapefruit
|
55
|
+
at_least_one_of :beer, :wine, :grapefruit, message: 'fail'
|
64
56
|
end
|
65
57
|
end
|
66
58
|
end
|
59
|
+
post '/deeply-nested-array' do
|
60
|
+
end
|
67
61
|
end
|
62
|
+
end
|
68
63
|
|
69
|
-
|
70
|
-
|
71
|
-
end
|
64
|
+
describe '#validate!' do
|
65
|
+
subject(:validate) { post path, params }
|
72
66
|
|
73
67
|
context 'when all restricted params are present' do
|
74
68
|
let(:path) { '/' }
|