grape 1.7.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (163) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +37 -1
  3. data/CONTRIBUTING.md +1 -1
  4. data/README.md +30 -25
  5. data/UPGRADING.md +35 -0
  6. data/grape.gemspec +3 -6
  7. data/lib/grape/api.rb +2 -2
  8. data/lib/grape/content_types.rb +2 -8
  9. data/lib/grape/dsl/desc.rb +1 -1
  10. data/lib/grape/dsl/inside_route.rb +11 -11
  11. data/lib/grape/dsl/request_response.rb +2 -1
  12. data/lib/grape/dsl/settings.rb +2 -6
  13. data/lib/grape/endpoint.rb +28 -18
  14. data/lib/grape/error_formatter/base.rb +1 -1
  15. data/lib/grape/exceptions/base.rb +2 -2
  16. data/lib/grape/exceptions/missing_group_type.rb +1 -6
  17. data/lib/grape/exceptions/unsupported_group_type.rb +1 -6
  18. data/lib/grape/exceptions/validation_errors.rb +1 -6
  19. data/lib/grape/extensions/active_support/hash_with_indifferent_access.rb +3 -3
  20. data/lib/grape/extensions/hash.rb +4 -7
  21. data/lib/grape/extensions/hashie/mash.rb +3 -3
  22. data/lib/grape/formatter/serializable_hash.rb +7 -7
  23. data/lib/grape/http/headers.rb +12 -2
  24. data/lib/grape/middleware/auth/base.rb +1 -1
  25. data/lib/grape/middleware/auth/strategies.rb +1 -2
  26. data/lib/grape/middleware/error.rb +5 -5
  27. data/lib/grape/middleware/formatter.rb +6 -6
  28. data/lib/grape/middleware/versioner/header.rb +11 -19
  29. data/lib/grape/railtie.rb +9 -0
  30. data/lib/grape/request.rb +8 -2
  31. data/lib/grape/router/route.rb +1 -3
  32. data/lib/grape/util/lazy_value.rb +3 -11
  33. data/lib/grape/util/strict_hash_configuration.rb +3 -4
  34. data/lib/grape/validations/multiple_attributes_iterator.rb +1 -1
  35. data/lib/grape/validations/params_scope.rb +8 -2
  36. data/lib/grape/validations/single_attribute_iterator.rb +3 -1
  37. data/lib/grape/validations/types/custom_type_coercer.rb +2 -16
  38. data/lib/grape/validations/validators/base.rb +9 -20
  39. data/lib/grape/validations/validators/default_validator.rb +2 -20
  40. data/lib/grape/validations/validators/multiple_params_base.rb +4 -8
  41. data/lib/grape/validations/validators/values_validator.rb +14 -5
  42. data/lib/grape/version.rb +1 -1
  43. data/lib/grape.rb +26 -5
  44. metadata +13 -253
  45. data/lib/grape/config.rb +0 -34
  46. data/lib/grape/extensions/deep_mergeable_hash.rb +0 -21
  47. data/lib/grape/extensions/deep_symbolize_hash.rb +0 -32
  48. data/spec/grape/api/custom_validations_spec.rb +0 -256
  49. data/spec/grape/api/deeply_included_options_spec.rb +0 -56
  50. data/spec/grape/api/defines_boolean_in_params_spec.rb +0 -38
  51. data/spec/grape/api/documentation_spec.rb +0 -59
  52. data/spec/grape/api/inherited_helpers_spec.rb +0 -114
  53. data/spec/grape/api/instance_spec.rb +0 -103
  54. data/spec/grape/api/invalid_format_spec.rb +0 -45
  55. data/spec/grape/api/namespace_parameters_in_route_spec.rb +0 -38
  56. data/spec/grape/api/nested_helpers_spec.rb +0 -50
  57. data/spec/grape/api/optional_parameters_in_route_spec.rb +0 -43
  58. data/spec/grape/api/parameters_modification_spec.rb +0 -41
  59. data/spec/grape/api/patch_method_helpers_spec.rb +0 -79
  60. data/spec/grape/api/recognize_path_spec.rb +0 -21
  61. data/spec/grape/api/required_parameters_in_route_spec.rb +0 -37
  62. data/spec/grape/api/required_parameters_with_invalid_method_spec.rb +0 -26
  63. data/spec/grape/api/routes_with_requirements_spec.rb +0 -59
  64. data/spec/grape/api/shared_helpers_exactly_one_of_spec.rb +0 -41
  65. data/spec/grape/api/shared_helpers_spec.rb +0 -36
  66. data/spec/grape/api_remount_spec.rb +0 -473
  67. data/spec/grape/api_spec.rb +0 -4347
  68. data/spec/grape/config_spec.rb +0 -17
  69. data/spec/grape/dsl/callbacks_spec.rb +0 -45
  70. data/spec/grape/dsl/desc_spec.rb +0 -101
  71. data/spec/grape/dsl/headers_spec.rb +0 -62
  72. data/spec/grape/dsl/helpers_spec.rb +0 -100
  73. data/spec/grape/dsl/inside_route_spec.rb +0 -535
  74. data/spec/grape/dsl/logger_spec.rb +0 -24
  75. data/spec/grape/dsl/middleware_spec.rb +0 -60
  76. data/spec/grape/dsl/parameters_spec.rb +0 -180
  77. data/spec/grape/dsl/request_response_spec.rb +0 -206
  78. data/spec/grape/dsl/routing_spec.rb +0 -275
  79. data/spec/grape/dsl/settings_spec.rb +0 -261
  80. data/spec/grape/dsl/validations_spec.rb +0 -55
  81. data/spec/grape/endpoint/declared_spec.rb +0 -846
  82. data/spec/grape/endpoint_spec.rb +0 -1085
  83. data/spec/grape/entity_spec.rb +0 -336
  84. data/spec/grape/exceptions/base_spec.rb +0 -81
  85. data/spec/grape/exceptions/body_parse_errors_spec.rb +0 -145
  86. data/spec/grape/exceptions/invalid_accept_header_spec.rb +0 -358
  87. data/spec/grape/exceptions/invalid_formatter_spec.rb +0 -15
  88. data/spec/grape/exceptions/invalid_response_spec.rb +0 -11
  89. data/spec/grape/exceptions/invalid_versioner_option_spec.rb +0 -15
  90. data/spec/grape/exceptions/missing_group_type_spec.rb +0 -21
  91. data/spec/grape/exceptions/missing_mime_type_spec.rb +0 -17
  92. data/spec/grape/exceptions/missing_option_spec.rb +0 -15
  93. data/spec/grape/exceptions/unknown_options_spec.rb +0 -15
  94. data/spec/grape/exceptions/unknown_validator_spec.rb +0 -15
  95. data/spec/grape/exceptions/unsupported_group_type_spec.rb +0 -23
  96. data/spec/grape/exceptions/validation_errors_spec.rb +0 -92
  97. data/spec/grape/exceptions/validation_spec.rb +0 -19
  98. data/spec/grape/extensions/param_builders/hash_spec.rb +0 -83
  99. data/spec/grape/extensions/param_builders/hash_with_indifferent_access_spec.rb +0 -105
  100. data/spec/grape/extensions/param_builders/hashie/mash_spec.rb +0 -79
  101. data/spec/grape/integration/global_namespace_function_spec.rb +0 -29
  102. data/spec/grape/integration/rack_sendfile_spec.rb +0 -48
  103. data/spec/grape/integration/rack_spec.rb +0 -51
  104. data/spec/grape/loading_spec.rb +0 -44
  105. data/spec/grape/middleware/auth/base_spec.rb +0 -31
  106. data/spec/grape/middleware/auth/dsl_spec.rb +0 -60
  107. data/spec/grape/middleware/auth/strategies_spec.rb +0 -120
  108. data/spec/grape/middleware/base_spec.rb +0 -221
  109. data/spec/grape/middleware/error_spec.rb +0 -85
  110. data/spec/grape/middleware/exception_spec.rb +0 -294
  111. data/spec/grape/middleware/formatter_spec.rb +0 -461
  112. data/spec/grape/middleware/globals_spec.rb +0 -30
  113. data/spec/grape/middleware/stack_spec.rb +0 -155
  114. data/spec/grape/middleware/versioner/accept_version_header_spec.rb +0 -122
  115. data/spec/grape/middleware/versioner/header_spec.rb +0 -345
  116. data/spec/grape/middleware/versioner/param_spec.rb +0 -171
  117. data/spec/grape/middleware/versioner/path_spec.rb +0 -62
  118. data/spec/grape/middleware/versioner_spec.rb +0 -21
  119. data/spec/grape/named_api_spec.rb +0 -19
  120. data/spec/grape/parser_spec.rb +0 -86
  121. data/spec/grape/path_spec.rb +0 -252
  122. data/spec/grape/presenters/presenter_spec.rb +0 -71
  123. data/spec/grape/request_spec.rb +0 -136
  124. data/spec/grape/util/inheritable_setting_spec.rb +0 -242
  125. data/spec/grape/util/inheritable_values_spec.rb +0 -79
  126. data/spec/grape/util/reverse_stackable_values_spec.rb +0 -134
  127. data/spec/grape/util/stackable_values_spec.rb +0 -128
  128. data/spec/grape/util/strict_hash_configuration_spec.rb +0 -38
  129. data/spec/grape/validations/attributes_doc_spec.rb +0 -153
  130. data/spec/grape/validations/instance_behaivour_spec.rb +0 -43
  131. data/spec/grape/validations/multiple_attributes_iterator_spec.rb +0 -40
  132. data/spec/grape/validations/params_scope_spec.rb +0 -1420
  133. data/spec/grape/validations/single_attribute_iterator_spec.rb +0 -57
  134. data/spec/grape/validations/types/array_coercer_spec.rb +0 -33
  135. data/spec/grape/validations/types/primitive_coercer_spec.rb +0 -150
  136. data/spec/grape/validations/types/set_coercer_spec.rb +0 -32
  137. data/spec/grape/validations/types_spec.rb +0 -111
  138. data/spec/grape/validations/validators/all_or_none_spec.rb +0 -162
  139. data/spec/grape/validations/validators/allow_blank_spec.rb +0 -575
  140. data/spec/grape/validations/validators/at_least_one_of_spec.rb +0 -205
  141. data/spec/grape/validations/validators/coerce_spec.rb +0 -1261
  142. data/spec/grape/validations/validators/default_spec.rb +0 -463
  143. data/spec/grape/validations/validators/exactly_one_of_spec.rb +0 -233
  144. data/spec/grape/validations/validators/except_values_spec.rb +0 -192
  145. data/spec/grape/validations/validators/mutual_exclusion_spec.rb +0 -214
  146. data/spec/grape/validations/validators/presence_spec.rb +0 -315
  147. data/spec/grape/validations/validators/regexp_spec.rb +0 -161
  148. data/spec/grape/validations/validators/same_as_spec.rb +0 -57
  149. data/spec/grape/validations/validators/values_spec.rb +0 -696
  150. data/spec/grape/validations/validators/zh-CN.yml +0 -10
  151. data/spec/grape/validations_spec.rb +0 -2029
  152. data/spec/integration/eager_load/eager_load_spec.rb +0 -15
  153. data/spec/integration/multi_json/json_spec.rb +0 -7
  154. data/spec/integration/multi_xml/xml_spec.rb +0 -7
  155. data/spec/shared/versioning_examples.rb +0 -215
  156. data/spec/spec_helper.rb +0 -52
  157. data/spec/support/basic_auth_encode_helpers.rb +0 -11
  158. data/spec/support/chunks.rb +0 -14
  159. data/spec/support/content_type_helpers.rb +0 -15
  160. data/spec/support/endpoint_faker.rb +0 -25
  161. data/spec/support/file_streamer.rb +0 -13
  162. data/spec/support/integer_helpers.rb +0 -13
  163. data/spec/support/versioned_helpers.rb +0 -55
@@ -1,315 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- describe Grape::Validations::Validators::PresenceValidator do
4
- subject do
5
- Class.new(Grape::API) do
6
- format :json
7
- end
8
- end
9
-
10
- def app
11
- subject
12
- end
13
-
14
- context 'without validation' do
15
- before do
16
- subject.resource :bacons do
17
- get do
18
- 'All the bacon'
19
- end
20
- end
21
- end
22
-
23
- it 'does not validate for any params' do
24
- get '/bacons'
25
- expect(last_response.status).to eq(200)
26
- expect(last_response.body).to eq('All the bacon'.to_json)
27
- end
28
- end
29
-
30
- context 'with a custom validation message' do
31
- before do
32
- subject.resource :requires do
33
- params do
34
- requires :email, type: String, allow_blank: { value: false, message: 'has no value' }, regexp: { value: /^\S+$/, message: 'format is invalid' }, message: 'is required'
35
- end
36
- get do
37
- 'Hello'
38
- end
39
- end
40
- end
41
-
42
- it 'requires when missing' do
43
- get '/requires'
44
- expect(last_response.status).to eq(400)
45
- expect(last_response.body).to eq('{"error":"email is required, email has no value"}')
46
- end
47
-
48
- it 'requires when empty' do
49
- get '/requires', email: ''
50
- expect(last_response.body).to eq('{"error":"email has no value, email format is invalid"}')
51
- end
52
-
53
- it 'valid when set' do
54
- get '/requires', email: 'bob@example.com'
55
- expect(last_response.status).to eq(200)
56
- expect(last_response.body).to eq('Hello'.to_json)
57
- end
58
- end
59
-
60
- context 'with a required regexp parameter supplied in the POST body' do
61
- before do
62
- subject.format :json
63
- subject.params do
64
- requires :id, regexp: /^[0-9]+$/
65
- end
66
- subject.post do
67
- { ret: params[:id] }
68
- end
69
- end
70
-
71
- it 'validates id' do
72
- post '/'
73
- expect(last_response.status).to eq(400)
74
- expect(last_response.body).to eq('{"error":"id is missing"}')
75
-
76
- io = StringIO.new('{"id" : "a56b"}')
77
- post '/', {}, 'rack.input' => io, 'CONTENT_TYPE' => 'application/json', 'CONTENT_LENGTH' => io.length
78
- expect(last_response.body).to eq('{"error":"id is invalid"}')
79
- expect(last_response.status).to eq(400)
80
-
81
- io = StringIO.new('{"id" : 56}')
82
- post '/', {}, 'rack.input' => io, 'CONTENT_TYPE' => 'application/json', 'CONTENT_LENGTH' => io.length
83
- expect(last_response.body).to eq('{"ret":56}')
84
- expect(last_response.status).to eq(201)
85
- end
86
- end
87
-
88
- context 'with a required non-empty string' do
89
- before do
90
- subject.params do
91
- requires :email, type: String, allow_blank: false, regexp: /^\S+$/
92
- end
93
- subject.get do
94
- 'Hello'
95
- end
96
- end
97
-
98
- it 'requires when missing' do
99
- get '/'
100
- expect(last_response.status).to eq(400)
101
- expect(last_response.body).to eq('{"error":"email is missing, email is empty"}')
102
- end
103
-
104
- it 'requires when empty' do
105
- get '/', email: ''
106
- expect(last_response.status).to eq(400)
107
- expect(last_response.body).to eq('{"error":"email is empty, email is invalid"}')
108
- end
109
-
110
- it 'valid when set' do
111
- get '/', email: 'bob@example.com'
112
- expect(last_response.status).to eq(200)
113
- expect(last_response.body).to eq('Hello'.to_json)
114
- end
115
- end
116
-
117
- context 'with multiple parameters per requires' do
118
- before do
119
- subject.params do
120
- requires :one, :two
121
- end
122
- subject.get '/single-requires' do
123
- 'Hello'
124
- end
125
-
126
- subject.params do
127
- requires :one
128
- requires :two
129
- end
130
- subject.get '/multiple-requires' do
131
- 'Hello'
132
- end
133
- end
134
-
135
- it 'validates for all defined params' do
136
- get '/single-requires'
137
- expect(last_response.status).to eq(400)
138
- single_requires_error = last_response.body
139
-
140
- get '/multiple-requires'
141
- expect(last_response.status).to eq(400)
142
- expect(last_response.body).to eq(single_requires_error)
143
- end
144
- end
145
-
146
- context 'with required parameters and no type' do
147
- before do
148
- subject.params do
149
- requires :name, :company
150
- end
151
- subject.get do
152
- 'Hello'
153
- end
154
- end
155
-
156
- it 'validates name, company' do
157
- get '/'
158
- expect(last_response.status).to eq(400)
159
- expect(last_response.body).to eq('{"error":"name is missing, company is missing"}')
160
-
161
- get '/', name: 'Bob'
162
- expect(last_response.status).to eq(400)
163
- expect(last_response.body).to eq('{"error":"company is missing"}')
164
-
165
- get '/', name: 'Bob', company: 'TestCorp'
166
- expect(last_response.status).to eq(200)
167
- expect(last_response.body).to eq('Hello'.to_json)
168
- end
169
- end
170
-
171
- context 'with nested parameters' do
172
- before do
173
- subject.params do
174
- requires :user, type: Hash do
175
- requires :first_name
176
- requires :last_name
177
- end
178
- end
179
- subject.get '/nested' do
180
- 'Nested'
181
- end
182
- end
183
-
184
- it 'validates nested parameters' do
185
- get '/nested'
186
- expect(last_response.status).to eq(400)
187
- expect(last_response.body).to eq('{"error":"user is missing, user[first_name] is missing, user[last_name] is missing"}')
188
-
189
- get '/nested', user: { first_name: 'Billy' }
190
- expect(last_response.status).to eq(400)
191
- expect(last_response.body).to eq('{"error":"user[last_name] is missing"}')
192
-
193
- get '/nested', user: { first_name: 'Billy', last_name: 'Bob' }
194
- expect(last_response.status).to eq(200)
195
- expect(last_response.body).to eq('Nested'.to_json)
196
- end
197
- end
198
-
199
- context 'with triply nested required parameters' do
200
- before do
201
- subject.params do
202
- requires :admin, type: Hash do
203
- requires :admin_name
204
- requires :super, type: Hash do
205
- requires :user, type: Hash do
206
- requires :first_name
207
- requires :last_name
208
- end
209
- end
210
- end
211
- end
212
- subject.get '/nested_triple' do
213
- 'Nested triple'
214
- end
215
- end
216
-
217
- it 'validates triple nested parameters' do
218
- get '/nested_triple'
219
- expect(last_response.status).to eq(400)
220
- expect(last_response.body).to include '{"error":"admin is missing'
221
-
222
- get '/nested_triple', user: { first_name: 'Billy' }
223
- expect(last_response.status).to eq(400)
224
- expect(last_response.body).to include '{"error":"admin is missing'
225
-
226
- get '/nested_triple', admin: { super: { first_name: 'Billy' } }
227
- expect(last_response.status).to eq(400)
228
- expect(last_response.body).to eq('{"error":"admin[admin_name] is missing, admin[super][user] is missing, admin[super][user][first_name] is missing, admin[super][user][last_name] is missing"}')
229
-
230
- get '/nested_triple', super: { user: { first_name: 'Billy', last_name: 'Bob' } }
231
- expect(last_response.status).to eq(400)
232
- expect(last_response.body).to include '{"error":"admin is missing'
233
-
234
- get '/nested_triple', admin: { super: { user: { first_name: 'Billy' } } }
235
- expect(last_response.status).to eq(400)
236
- expect(last_response.body).to eq('{"error":"admin[admin_name] is missing, admin[super][user][last_name] is missing"}')
237
-
238
- get '/nested_triple', admin: { admin_name: 'admin', super: { user: { first_name: 'Billy' } } }
239
- expect(last_response.status).to eq(400)
240
- expect(last_response.body).to eq('{"error":"admin[super][user][last_name] is missing"}')
241
-
242
- get '/nested_triple', admin: { admin_name: 'admin', super: { user: { first_name: 'Billy', last_name: 'Bob' } } }
243
- expect(last_response.status).to eq(200)
244
- expect(last_response.body).to eq('Nested triple'.to_json)
245
- end
246
- end
247
-
248
- context 'with reused parameter documentation once required and once optional' do
249
- before do
250
- docs = { name: { type: String, desc: 'some name' } }
251
-
252
- subject.params do
253
- requires :all, using: docs
254
- end
255
- subject.get '/required' do
256
- 'Hello required'
257
- end
258
-
259
- subject.params do
260
- optional :all, using: docs
261
- end
262
- subject.get '/optional' do
263
- 'Hello optional'
264
- end
265
- end
266
-
267
- it 'works with required' do
268
- get '/required'
269
- expect(last_response.status).to eq(400)
270
- expect(last_response.body).to eq('{"error":"name is missing"}')
271
-
272
- get '/required', name: 'Bob'
273
- expect(last_response.status).to eq(200)
274
- expect(last_response.body).to eq('Hello required'.to_json)
275
- end
276
-
277
- it 'works with optional' do
278
- get '/optional'
279
- expect(last_response.status).to eq(200)
280
- expect(last_response.body).to eq('Hello optional'.to_json)
281
-
282
- get '/optional', name: 'Bob'
283
- expect(last_response.status).to eq(200)
284
- expect(last_response.body).to eq('Hello optional'.to_json)
285
- end
286
- end
287
-
288
- context 'with a custom type' do
289
- it 'does not validate their type when it is missing' do
290
- class CustomType
291
- def self.parse(value)
292
- return if value.blank?
293
-
294
- new
295
- end
296
- end
297
-
298
- subject.params do
299
- requires :custom, type: CustomType
300
- end
301
- subject.get '/custom' do
302
- 'custom'
303
- end
304
-
305
- get 'custom'
306
-
307
- expect(last_response.status).to eq(400)
308
- expect(last_response.body).to eq('{"error":"custom is missing"}')
309
-
310
- get 'custom', custom: 'filled'
311
-
312
- expect(last_response.status).to eq(200)
313
- end
314
- end
315
- end
@@ -1,161 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- describe Grape::Validations::Validators::RegexpValidator do
4
- let_it_be(:app) do
5
- Class.new(Grape::API) do
6
- default_format :json
7
-
8
- resources :custom_message do
9
- params do
10
- requires :name, regexp: { value: /^[a-z]+$/, message: 'format is invalid' }
11
- end
12
- get do
13
- end
14
-
15
- params do
16
- requires :names, type: { value: Array[String], message: 'can\'t be nil' }, regexp: { value: /^[a-z]+$/, message: 'format is invalid' }
17
- end
18
- get 'regexp_with_array' do
19
- end
20
- end
21
-
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]+$/
37
- end
38
- end
39
- get 'nested_regexp_with_array' do
40
- end
41
- end
42
- end
43
-
44
- context 'custom validation message' do
45
- context 'with invalid input' do
46
- it 'refuses inapppopriate' do
47
- get '/custom_message', name: 'invalid name'
48
- expect(last_response.status).to eq(400)
49
- expect(last_response.body).to eq('{"error":"name format is invalid"}')
50
- end
51
-
52
- it 'refuses empty' do
53
- get '/custom_message', name: ''
54
- expect(last_response.status).to eq(400)
55
- expect(last_response.body).to eq('{"error":"name format is invalid"}')
56
- end
57
- end
58
-
59
- it 'accepts nil' do
60
- get '/custom_message', name: nil
61
- expect(last_response.status).to eq(200)
62
- end
63
-
64
- it 'accepts valid input' do
65
- get '/custom_message', name: 'bob'
66
- expect(last_response.status).to eq(200)
67
- end
68
-
69
- context 'regexp with array' do
70
- it 'refuses inapppopriate items' do
71
- get '/custom_message/regexp_with_array', names: ['invalid name', 'abc']
72
- expect(last_response.status).to eq(400)
73
- expect(last_response.body).to eq('{"error":"names format is invalid"}')
74
- end
75
-
76
- it 'refuses empty items' do
77
- get '/custom_message/regexp_with_array', names: ['', 'abc']
78
- expect(last_response.status).to eq(400)
79
- expect(last_response.body).to eq('{"error":"names format is invalid"}')
80
- end
81
-
82
- it 'refuses nil items' do
83
- get '/custom_message/regexp_with_array', names: [nil, 'abc']
84
- expect(last_response.status).to eq(400)
85
- expect(last_response.body).to eq('{"error":"names can\'t be nil"}')
86
- end
87
-
88
- it 'accepts valid items' do
89
- get '/custom_message/regexp_with_array', names: ['bob']
90
- expect(last_response.status).to eq(200)
91
- end
92
-
93
- it 'accepts nil instead of array' do
94
- get '/custom_message/regexp_with_array', names: nil
95
- expect(last_response.status).to eq(200)
96
- end
97
- end
98
- end
99
-
100
- context 'invalid input' do
101
- it 'refuses inapppopriate' do
102
- get '/', name: 'invalid name'
103
- expect(last_response.status).to eq(400)
104
- expect(last_response.body).to eq('{"error":"name is invalid"}')
105
- end
106
-
107
- it 'refuses empty' do
108
- get '/', name: ''
109
- expect(last_response.status).to eq(400)
110
- expect(last_response.body).to eq('{"error":"name is invalid"}')
111
- end
112
- end
113
-
114
- it 'accepts nil' do
115
- get '/', name: nil
116
- expect(last_response.status).to eq(200)
117
- end
118
-
119
- it 'accepts valid input' do
120
- get '/', name: 'bob'
121
- expect(last_response.status).to eq(200)
122
- end
123
-
124
- context 'regexp with array' do
125
- it 'refuses inapppopriate items' do
126
- get '/regexp_with_array', names: ['invalid name', 'abc']
127
- expect(last_response.status).to eq(400)
128
- expect(last_response.body).to eq('{"error":"names is invalid"}')
129
- end
130
-
131
- it 'refuses empty items' do
132
- get '/regexp_with_array', names: ['', 'abc']
133
- expect(last_response.status).to eq(400)
134
- expect(last_response.body).to eq('{"error":"names is invalid"}')
135
- end
136
-
137
- it 'refuses nil items' do
138
- get '/regexp_with_array', names: [nil, 'abc']
139
- expect(last_response.status).to eq(400)
140
- expect(last_response.body).to eq('{"error":"names is invalid"}')
141
- end
142
-
143
- it 'accepts valid items' do
144
- get '/regexp_with_array', names: ['bob']
145
- expect(last_response.status).to eq(200)
146
- end
147
-
148
- it 'accepts nil instead of array' do
149
- get '/regexp_with_array', names: nil
150
- expect(last_response.status).to eq(200)
151
- end
152
- end
153
-
154
- context 'nested regexp with array' do
155
- it 'refuses inapppopriate' do
156
- get '/nested_regexp_with_array', people: 'invalid name'
157
- expect(last_response.status).to eq(400)
158
- expect(last_response.body).to eq('{"error":"people is invalid, people[names] is missing, people[names] is invalid"}')
159
- end
160
- end
161
- end
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
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
12
-
13
- params do
14
- requires :password
15
- requires :password_confirmation, same_as: { value: :password, message: 'not match' }
16
- end
17
- post '/custom-message' do
18
- end
19
- end
20
- end
21
-
22
- describe '/' do
23
- context 'is the same' do
24
- it do
25
- post '/', password: '987654', password_confirmation: '987654'
26
- expect(last_response.status).to eq(201)
27
- expect(last_response.body).to eq('')
28
- end
29
- end
30
-
31
- context 'is not the same' do
32
- it do
33
- post '/', password: '123456', password_confirmation: 'whatever'
34
- expect(last_response.status).to eq(400)
35
- expect(last_response.body).to eq('password_confirmation is not the same as password')
36
- end
37
- end
38
- end
39
-
40
- describe '/custom-message' do
41
- context 'is the same' do
42
- it do
43
- post '/custom-message', password: '987654', password_confirmation: '987654'
44
- expect(last_response.status).to eq(201)
45
- expect(last_response.body).to eq('')
46
- end
47
- end
48
-
49
- context 'is not the same' do
50
- it do
51
- post '/custom-message', password: '123456', password_confirmation: 'whatever'
52
- expect(last_response.status).to eq(400)
53
- expect(last_response.body).to eq('password_confirmation not match')
54
- end
55
- end
56
- end
57
- end