grape 1.5.2 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (210) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +75 -0
  3. data/CONTRIBUTING.md +2 -1
  4. data/README.md +152 -21
  5. data/UPGRADING.md +86 -2
  6. data/grape.gemspec +5 -5
  7. data/lib/grape/api/instance.rb +14 -18
  8. data/lib/grape/api.rb +18 -13
  9. data/lib/grape/cookies.rb +2 -0
  10. data/lib/grape/dry_types.rb +12 -0
  11. data/lib/grape/dsl/api.rb +0 -2
  12. data/lib/grape/dsl/callbacks.rb +0 -2
  13. data/lib/grape/dsl/configuration.rb +0 -2
  14. data/lib/grape/dsl/desc.rb +2 -19
  15. data/lib/grape/dsl/headers.rb +5 -2
  16. data/lib/grape/dsl/helpers.rb +7 -7
  17. data/lib/grape/dsl/inside_route.rb +43 -30
  18. data/lib/grape/dsl/middleware.rb +4 -6
  19. data/lib/grape/dsl/parameters.rb +8 -10
  20. data/lib/grape/dsl/request_response.rb +9 -8
  21. data/lib/grape/dsl/routing.rb +6 -4
  22. data/lib/grape/dsl/settings.rb +5 -7
  23. data/lib/grape/dsl/validations.rb +0 -15
  24. data/lib/grape/endpoint.rb +21 -36
  25. data/lib/grape/error_formatter/json.rb +9 -7
  26. data/lib/grape/error_formatter/xml.rb +2 -6
  27. data/lib/grape/exceptions/base.rb +2 -2
  28. data/lib/grape/exceptions/empty_message_body.rb +11 -0
  29. data/lib/grape/exceptions/missing_group_type.rb +8 -1
  30. data/lib/grape/exceptions/too_many_multipart_files.rb +11 -0
  31. data/lib/grape/exceptions/unsupported_group_type.rb +8 -1
  32. data/lib/grape/exceptions/validation.rb +1 -6
  33. data/lib/grape/formatter/json.rb +1 -0
  34. data/lib/grape/formatter/serializable_hash.rb +2 -1
  35. data/lib/grape/formatter/xml.rb +1 -0
  36. data/lib/grape/locale/en.yml +9 -8
  37. data/lib/grape/middleware/auth/dsl.rb +7 -2
  38. data/lib/grape/middleware/base.rb +3 -1
  39. data/lib/grape/middleware/error.rb +2 -2
  40. data/lib/grape/middleware/formatter.rb +4 -4
  41. data/lib/grape/middleware/stack.rb +2 -2
  42. data/lib/grape/middleware/versioner/accept_version_header.rb +3 -5
  43. data/lib/grape/middleware/versioner/header.rb +6 -4
  44. data/lib/grape/middleware/versioner/param.rb +1 -0
  45. data/lib/grape/middleware/versioner/parse_media_type_patch.rb +2 -1
  46. data/lib/grape/middleware/versioner/path.rb +2 -0
  47. data/lib/grape/parser/json.rb +1 -1
  48. data/lib/grape/parser/xml.rb +1 -1
  49. data/lib/grape/path.rb +1 -0
  50. data/lib/grape/request.rb +5 -0
  51. data/lib/grape/router/pattern.rb +1 -1
  52. data/lib/grape/router/route.rb +2 -2
  53. data/lib/grape/router.rb +6 -0
  54. data/lib/grape/util/inheritable_setting.rb +1 -3
  55. data/lib/grape/util/json.rb +2 -0
  56. data/lib/grape/util/lazy_value.rb +3 -2
  57. data/lib/grape/util/strict_hash_configuration.rb +1 -1
  58. data/lib/grape/validations/attributes_doc.rb +58 -0
  59. data/lib/grape/validations/params_scope.rb +137 -78
  60. data/lib/grape/validations/types/array_coercer.rb +0 -2
  61. data/lib/grape/validations/types/custom_type_coercer.rb +1 -2
  62. data/lib/grape/validations/types/dry_type_coercer.rb +4 -8
  63. data/lib/grape/validations/types/json.rb +2 -1
  64. data/lib/grape/validations/types/primitive_coercer.rb +16 -8
  65. data/lib/grape/validations/types/set_coercer.rb +0 -2
  66. data/lib/grape/validations/types.rb +98 -30
  67. data/lib/grape/validations/validators/all_or_none_of_validator.rb +16 -0
  68. data/lib/grape/validations/validators/allow_blank_validator.rb +20 -0
  69. data/lib/grape/validations/validators/as_validator.rb +14 -0
  70. data/lib/grape/validations/validators/at_least_one_of_validator.rb +15 -0
  71. data/lib/grape/validations/validators/base.rb +82 -70
  72. data/lib/grape/validations/validators/coerce_validator.rb +75 -0
  73. data/lib/grape/validations/validators/default_validator.rb +51 -0
  74. data/lib/grape/validations/validators/exactly_one_of_validator.rb +17 -0
  75. data/lib/grape/validations/validators/except_values_validator.rb +24 -0
  76. data/lib/grape/validations/validators/multiple_params_base.rb +24 -20
  77. data/lib/grape/validations/validators/mutual_exclusion_validator.rb +16 -0
  78. data/lib/grape/validations/validators/presence_validator.rb +15 -0
  79. data/lib/grape/validations/validators/regexp_validator.rb +16 -0
  80. data/lib/grape/validations/validators/same_as_validator.rb +29 -0
  81. data/lib/grape/validations/validators/values_validator.rb +88 -0
  82. data/lib/grape/validations.rb +16 -6
  83. data/lib/grape/version.rb +1 -1
  84. data/lib/grape.rb +70 -29
  85. data/spec/grape/api/custom_validations_spec.rb +116 -45
  86. data/spec/grape/api/deeply_included_options_spec.rb +3 -5
  87. data/spec/grape/api/defines_boolean_in_params_spec.rb +2 -3
  88. data/spec/grape/api/documentation_spec.rb +59 -0
  89. data/spec/grape/api/inherited_helpers_spec.rb +0 -2
  90. data/spec/grape/api/instance_spec.rb +0 -1
  91. data/spec/grape/api/invalid_format_spec.rb +2 -2
  92. data/spec/grape/api/namespace_parameters_in_route_spec.rb +0 -2
  93. data/spec/grape/api/nested_helpers_spec.rb +0 -2
  94. data/spec/grape/api/optional_parameters_in_route_spec.rb +0 -2
  95. data/spec/grape/api/parameters_modification_spec.rb +0 -2
  96. data/spec/grape/api/patch_method_helpers_spec.rb +0 -2
  97. data/spec/grape/api/recognize_path_spec.rb +1 -3
  98. data/spec/grape/api/required_parameters_in_route_spec.rb +0 -2
  99. data/spec/grape/api/required_parameters_with_invalid_method_spec.rb +0 -2
  100. data/spec/grape/api/routes_with_requirements_spec.rb +8 -10
  101. data/spec/grape/api/shared_helpers_exactly_one_of_spec.rb +9 -17
  102. data/spec/grape/api/shared_helpers_spec.rb +0 -2
  103. data/spec/grape/api_remount_spec.rb +16 -16
  104. data/spec/grape/api_spec.rb +527 -224
  105. data/spec/grape/config_spec.rb +0 -2
  106. data/spec/grape/dsl/callbacks_spec.rb +2 -3
  107. data/spec/grape/dsl/configuration_spec.rb +0 -2
  108. data/spec/grape/dsl/desc_spec.rb +0 -2
  109. data/spec/grape/dsl/headers_spec.rb +39 -11
  110. data/spec/grape/dsl/helpers_spec.rb +3 -4
  111. data/spec/grape/dsl/inside_route_spec.rb +16 -16
  112. data/spec/grape/dsl/logger_spec.rb +15 -19
  113. data/spec/grape/dsl/middleware_spec.rb +2 -3
  114. data/spec/grape/dsl/parameters_spec.rb +2 -2
  115. data/spec/grape/dsl/request_response_spec.rb +7 -8
  116. data/spec/grape/dsl/routing_spec.rb +11 -10
  117. data/spec/grape/dsl/settings_spec.rb +0 -2
  118. data/spec/grape/dsl/validations_spec.rb +0 -17
  119. data/spec/grape/endpoint/declared_spec.rb +261 -16
  120. data/spec/grape/endpoint_spec.rb +98 -57
  121. data/spec/grape/entity_spec.rb +22 -23
  122. data/spec/grape/exceptions/base_spec.rb +16 -2
  123. data/spec/grape/exceptions/body_parse_errors_spec.rb +3 -2
  124. data/spec/grape/exceptions/invalid_accept_header_spec.rb +61 -24
  125. data/spec/grape/exceptions/invalid_formatter_spec.rb +0 -2
  126. data/spec/grape/exceptions/invalid_response_spec.rb +0 -2
  127. data/spec/grape/exceptions/invalid_versioner_option_spec.rb +1 -3
  128. data/spec/grape/exceptions/missing_group_type_spec.rb +21 -0
  129. data/spec/grape/exceptions/missing_mime_type_spec.rb +0 -2
  130. data/spec/grape/exceptions/missing_option_spec.rb +1 -3
  131. data/spec/grape/exceptions/unknown_options_spec.rb +0 -2
  132. data/spec/grape/exceptions/unknown_validator_spec.rb +0 -2
  133. data/spec/grape/exceptions/unsupported_group_type_spec.rb +23 -0
  134. data/spec/grape/exceptions/validation_errors_spec.rb +13 -11
  135. data/spec/grape/exceptions/validation_spec.rb +5 -5
  136. data/spec/grape/extensions/param_builders/hash_spec.rb +7 -9
  137. data/spec/grape/extensions/param_builders/hash_with_indifferent_access_spec.rb +8 -10
  138. data/spec/grape/extensions/param_builders/hashie/mash_spec.rb +8 -10
  139. data/spec/grape/integration/global_namespace_function_spec.rb +0 -2
  140. data/spec/grape/integration/rack_sendfile_spec.rb +1 -3
  141. data/spec/grape/integration/rack_spec.rb +0 -2
  142. data/spec/grape/loading_spec.rb +8 -10
  143. data/spec/grape/middleware/auth/base_spec.rb +0 -1
  144. data/spec/grape/middleware/auth/dsl_spec.rb +15 -8
  145. data/spec/grape/middleware/auth/strategies_spec.rb +60 -22
  146. data/spec/grape/middleware/base_spec.rb +24 -17
  147. data/spec/grape/middleware/error_spec.rb +8 -3
  148. data/spec/grape/middleware/exception_spec.rb +111 -163
  149. data/spec/grape/middleware/formatter_spec.rb +27 -8
  150. data/spec/grape/middleware/globals_spec.rb +7 -6
  151. data/spec/grape/middleware/stack_spec.rb +14 -14
  152. data/spec/grape/middleware/versioner/accept_version_header_spec.rb +2 -3
  153. data/spec/grape/middleware/versioner/header_spec.rb +30 -15
  154. data/spec/grape/middleware/versioner/param_spec.rb +7 -3
  155. data/spec/grape/middleware/versioner/path_spec.rb +5 -3
  156. data/spec/grape/middleware/versioner_spec.rb +1 -3
  157. data/spec/grape/named_api_spec.rb +0 -2
  158. data/spec/grape/parser_spec.rb +4 -2
  159. data/spec/grape/path_spec.rb +52 -54
  160. data/spec/grape/presenters/presenter_spec.rb +7 -8
  161. data/spec/grape/request_spec.rb +6 -6
  162. data/spec/grape/util/inheritable_setting_spec.rb +7 -8
  163. data/spec/grape/util/inheritable_values_spec.rb +3 -3
  164. data/spec/grape/util/reverse_stackable_values_spec.rb +3 -2
  165. data/spec/grape/util/stackable_values_spec.rb +7 -6
  166. data/spec/grape/util/strict_hash_configuration_spec.rb +0 -1
  167. data/spec/grape/validations/attributes_doc_spec.rb +153 -0
  168. data/spec/grape/validations/attributes_iterator_spec.rb +0 -2
  169. data/spec/grape/validations/instance_behaivour_spec.rb +9 -12
  170. data/spec/grape/validations/multiple_attributes_iterator_spec.rb +1 -2
  171. data/spec/grape/validations/params_scope_spec.rb +361 -96
  172. data/spec/grape/validations/single_attribute_iterator_spec.rb +2 -3
  173. data/spec/grape/validations/types/array_coercer_spec.rb +0 -2
  174. data/spec/grape/validations/types/primitive_coercer_spec.rb +24 -9
  175. data/spec/grape/validations/types/set_coercer_spec.rb +0 -2
  176. data/spec/grape/validations/types_spec.rb +36 -10
  177. data/spec/grape/validations/validators/all_or_none_spec.rb +50 -58
  178. data/spec/grape/validations/validators/allow_blank_spec.rb +135 -141
  179. data/spec/grape/validations/validators/at_least_one_of_spec.rb +50 -58
  180. data/spec/grape/validations/validators/coerce_spec.rb +99 -24
  181. data/spec/grape/validations/validators/default_spec.rb +72 -80
  182. data/spec/grape/validations/validators/exactly_one_of_spec.rb +71 -79
  183. data/spec/grape/validations/validators/except_values_spec.rb +3 -5
  184. data/spec/grape/validations/validators/mutual_exclusion_spec.rb +71 -79
  185. data/spec/grape/validations/validators/presence_spec.rb +16 -3
  186. data/spec/grape/validations/validators/regexp_spec.rb +25 -33
  187. data/spec/grape/validations/validators/same_as_spec.rb +14 -22
  188. data/spec/grape/validations/validators/values_spec.rb +182 -179
  189. data/spec/grape/validations_spec.rb +149 -80
  190. data/spec/integration/eager_load/eager_load_spec.rb +2 -2
  191. data/spec/integration/multi_json/json_spec.rb +1 -3
  192. data/spec/integration/multi_xml/xml_spec.rb +1 -3
  193. data/spec/shared/versioning_examples.rb +12 -9
  194. data/spec/spec_helper.rb +21 -6
  195. data/spec/support/basic_auth_encode_helpers.rb +1 -1
  196. metadata +125 -115
  197. data/lib/grape/validations/validators/all_or_none.rb +0 -15
  198. data/lib/grape/validations/validators/allow_blank.rb +0 -18
  199. data/lib/grape/validations/validators/as.rb +0 -16
  200. data/lib/grape/validations/validators/at_least_one_of.rb +0 -14
  201. data/lib/grape/validations/validators/coerce.rb +0 -91
  202. data/lib/grape/validations/validators/default.rb +0 -48
  203. data/lib/grape/validations/validators/exactly_one_of.rb +0 -16
  204. data/lib/grape/validations/validators/except_values.rb +0 -22
  205. data/lib/grape/validations/validators/mutual_exclusion.rb +0 -15
  206. data/lib/grape/validations/validators/presence.rb +0 -12
  207. data/lib/grape/validations/validators/regexp.rb +0 -13
  208. data/lib/grape/validations/validators/same_as.rb +0 -26
  209. data/lib/grape/validations/validators/values.rb +0 -83
  210. data/spec/support/eager_load.rb +0 -19
@@ -1,96 +1,88 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
4
-
5
- describe Grape::Validations::ExactlyOneOfValidator do
6
- describe '#validate!' do
7
- subject(:validate) { post path, params }
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
- params do
17
- optional :beer
18
- optional :wine
19
- optional :grapefruit
20
- exactly_one_of :beer, :wine, :grapefruit
21
- end
22
- post do
23
- end
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
- params do
26
- optional :beer
27
- optional :wine
28
- optional :grapefruit
29
- optional :other
30
- exactly_one_of :beer, :wine, :grapefruit
31
- end
32
- post 'mixed-params' do
33
- end
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
- params do
36
- optional :beer
37
- optional :wine
38
- optional :grapefruit
39
- exactly_one_of :beer, :wine, :grapefruit, message: 'you should choose one'
40
- end
41
- post '/custom-message' do
42
- end
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
- params do
45
- requires :item, type: Hash do
46
- optional :beer
47
- optional :wine
48
- optional :grapefruit
49
- exactly_one_of :beer, :wine, :grapefruit
50
- end
51
- end
52
- post '/nested-hash' do
53
- end
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
- params do
56
- optional :item, type: Hash do
57
- optional :beer
58
- optional :wine
59
- optional :grapefruit
60
- exactly_one_of :beer, :wine, :grapefruit
61
- end
62
- end
63
- post '/nested-optional-hash' do
64
- end
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
- params do
67
- requires :items, type: Array do
68
- optional :beer
69
- optional :wine
70
- optional :grapefruit
71
- exactly_one_of :beer, :wine, :grapefruit
72
- end
73
- end
74
- post '/nested-array' do
75
- end
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
- params do
78
- requires :items, type: Array do
79
- requires :nested_items, type: Array do
80
- optional :beer, :wine, :grapefruit, type: Boolean
81
- exactly_one_of :beer, :wine, :grapefruit
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
- def app
92
- ValidationsSpec::ExactlyOneOfValidatorSpec::API
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
- require 'spec_helper'
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 = ['invalid-type1', 'invalid-type2', 'invalid-type3'].freeze
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: ['valid-type1', 'valid-type2', 'valid-type3'], type: Symbol }
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
- require 'spec_helper'
4
-
5
- describe Grape::Validations::MutualExclusionValidator do
6
- describe '#validate!' do
7
- subject(:validate) { post path, params }
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
- params do
17
- optional :beer
18
- optional :wine
19
- optional :grapefruit
20
- mutually_exclusive :beer, :wine, :grapefruit
21
- end
22
- post do
23
- end
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
- params do
26
- optional :beer
27
- optional :wine
28
- optional :grapefruit
29
- optional :other
30
- mutually_exclusive :beer, :wine, :grapefruit
31
- end
32
- post 'mixed-params' do
33
- end
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
- params do
36
- optional :beer
37
- optional :wine
38
- optional :grapefruit
39
- mutually_exclusive :beer, :wine, :grapefruit, message: 'you should not mix beer and wine'
40
- end
41
- post '/custom-message' do
42
- end
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
- params do
45
- requires :item, type: Hash do
46
- optional :beer
47
- optional :wine
48
- optional :grapefruit
49
- mutually_exclusive :beer, :wine, :grapefruit
50
- end
51
- end
52
- post '/nested-hash' do
53
- end
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
- params do
56
- optional :item, type: Hash do
57
- optional :beer
58
- optional :wine
59
- optional :grapefruit
60
- mutually_exclusive :beer, :wine, :grapefruit
61
- end
62
- end
63
- post '/nested-optional-hash' do
64
- end
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
- params do
67
- requires :items, type: Array do
68
- optional :beer
69
- optional :wine
70
- optional :grapefruit
71
- mutually_exclusive :beer, :wine, :grapefruit
72
- end
73
- end
74
- post '/nested-array' do
75
- end
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
- params do
78
- requires :items, type: Array do
79
- requires :nested_items, type: Array do
80
- optional :beer, :wine, :grapefruit, type: Boolean
81
- mutually_exclusive :beer, :wine, :grapefruit
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
- def app
92
- ValidationsSpec::MutualExclusionValidatorSpec::API
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
- require 'spec_helper'
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
- require 'spec_helper'
4
-
5
- describe Grape::Validations::RegexpValidator do
6
- module ValidationsSpec
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
- params do
38
- requires :people, type: Hash do
39
- requires :names, type: Array[String], regexp: /^[a-z]+$/
40
- end
41
- end
42
- get 'nested_regexp_with_array' do
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
- require 'spec_helper'
4
-
5
- describe Grape::Validations::SameAsValidator do
6
- module ValidationsSpec
7
- module SameAsValidatorSpec
8
- class API < Grape::API
9
- params do
10
- requires :password
11
- requires :password_confirmation, same_as: :password
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
- params do
17
- requires :password
18
- requires :password_confirmation, same_as: { value: :password, message: 'not match' }
19
- end
20
- post '/custom-message' do
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