grape 1.7.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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