grape 1.6.0 → 1.6.1

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 (124) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/CONTRIBUTING.md +1 -0
  4. data/README.md +9 -1
  5. data/lib/grape/api.rb +12 -0
  6. data/lib/grape/dry_types.rb +12 -0
  7. data/lib/grape/dsl/headers.rb +5 -2
  8. data/lib/grape/dsl/helpers.rb +1 -1
  9. data/lib/grape/middleware/auth/dsl.rb +7 -1
  10. data/lib/grape/middleware/base.rb +1 -1
  11. data/lib/grape/util/json.rb +2 -0
  12. data/lib/grape/util/strict_hash_configuration.rb +1 -1
  13. data/lib/grape/validations/types/array_coercer.rb +0 -2
  14. data/lib/grape/validations/types/dry_type_coercer.rb +1 -10
  15. data/lib/grape/validations/types/json.rb +0 -2
  16. data/lib/grape/validations/types/primitive_coercer.rb +5 -7
  17. data/lib/grape/validations/types/set_coercer.rb +0 -3
  18. data/lib/grape/validations/types.rb +83 -9
  19. data/lib/grape/validations/validators/all_or_none_of_validator.rb +16 -0
  20. data/lib/grape/validations/validators/allow_blank_validator.rb +20 -0
  21. data/lib/grape/validations/validators/as_validator.rb +14 -0
  22. data/lib/grape/validations/validators/at_least_one_of_validator.rb +15 -0
  23. data/lib/grape/validations/validators/base.rb +73 -71
  24. data/lib/grape/validations/validators/coerce_validator.rb +75 -0
  25. data/lib/grape/validations/validators/default_validator.rb +51 -0
  26. data/lib/grape/validations/validators/exactly_one_of_validator.rb +17 -0
  27. data/lib/grape/validations/validators/except_values_validator.rb +24 -0
  28. data/lib/grape/validations/validators/multiple_params_base.rb +24 -22
  29. data/lib/grape/validations/validators/mutual_exclusion_validator.rb +16 -0
  30. data/lib/grape/validations/validators/presence_validator.rb +15 -0
  31. data/lib/grape/validations/validators/regexp_validator.rb +16 -0
  32. data/lib/grape/validations/validators/same_as_validator.rb +29 -0
  33. data/lib/grape/validations/validators/values_validator.rb +88 -0
  34. data/lib/grape/version.rb +1 -1
  35. data/lib/grape.rb +59 -24
  36. data/spec/grape/api/custom_validations_spec.rb +77 -46
  37. data/spec/grape/api/deeply_included_options_spec.rb +3 -3
  38. data/spec/grape/api/defines_boolean_in_params_spec.rb +2 -1
  39. data/spec/grape/api/invalid_format_spec.rb +2 -0
  40. data/spec/grape/api/recognize_path_spec.rb +1 -1
  41. data/spec/grape/api/shared_helpers_exactly_one_of_spec.rb +9 -15
  42. data/spec/grape/api_remount_spec.rb +16 -15
  43. data/spec/grape/api_spec.rb +317 -193
  44. data/spec/grape/dsl/callbacks_spec.rb +1 -0
  45. data/spec/grape/dsl/headers_spec.rb +39 -9
  46. data/spec/grape/dsl/helpers_spec.rb +3 -2
  47. data/spec/grape/dsl/inside_route_spec.rb +6 -4
  48. data/spec/grape/dsl/logger_spec.rb +16 -18
  49. data/spec/grape/dsl/middleware_spec.rb +1 -0
  50. data/spec/grape/dsl/parameters_spec.rb +1 -0
  51. data/spec/grape/dsl/request_response_spec.rb +1 -0
  52. data/spec/grape/dsl/routing_spec.rb +9 -6
  53. data/spec/grape/endpoint/declared_spec.rb +12 -12
  54. data/spec/grape/endpoint_spec.rb +59 -50
  55. data/spec/grape/entity_spec.rb +13 -13
  56. data/spec/grape/exceptions/body_parse_errors_spec.rb +3 -0
  57. data/spec/grape/exceptions/invalid_accept_header_spec.rb +61 -22
  58. data/spec/grape/exceptions/validation_errors_spec.rb +13 -10
  59. data/spec/grape/exceptions/validation_spec.rb +5 -3
  60. data/spec/grape/extensions/param_builders/hash_spec.rb +7 -7
  61. data/spec/grape/extensions/param_builders/hash_with_indifferent_access_spec.rb +8 -8
  62. data/spec/grape/extensions/param_builders/hashie/mash_spec.rb +8 -8
  63. data/spec/grape/integration/rack_sendfile_spec.rb +1 -1
  64. data/spec/grape/loading_spec.rb +8 -8
  65. data/spec/grape/middleware/auth/dsl_spec.rb +14 -5
  66. data/spec/grape/middleware/auth/strategies_spec.rb +60 -20
  67. data/spec/grape/middleware/base_spec.rb +24 -15
  68. data/spec/grape/middleware/error_spec.rb +1 -0
  69. data/spec/grape/middleware/exception_spec.rb +111 -161
  70. data/spec/grape/middleware/formatter_spec.rb +25 -4
  71. data/spec/grape/middleware/globals_spec.rb +7 -4
  72. data/spec/grape/middleware/stack_spec.rb +11 -11
  73. data/spec/grape/middleware/versioner/accept_version_header_spec.rb +2 -1
  74. data/spec/grape/middleware/versioner/header_spec.rb +14 -13
  75. data/spec/grape/middleware/versioner/param_spec.rb +7 -1
  76. data/spec/grape/middleware/versioner/path_spec.rb +5 -1
  77. data/spec/grape/middleware/versioner_spec.rb +1 -1
  78. data/spec/grape/parser_spec.rb +4 -0
  79. data/spec/grape/path_spec.rb +52 -52
  80. data/spec/grape/presenters/presenter_spec.rb +7 -6
  81. data/spec/grape/request_spec.rb +6 -4
  82. data/spec/grape/util/inheritable_setting_spec.rb +7 -7
  83. data/spec/grape/util/inheritable_values_spec.rb +3 -2
  84. data/spec/grape/util/reverse_stackable_values_spec.rb +3 -1
  85. data/spec/grape/util/stackable_values_spec.rb +7 -5
  86. data/spec/grape/validations/instance_behaivour_spec.rb +9 -10
  87. data/spec/grape/validations/multiple_attributes_iterator_spec.rb +1 -0
  88. data/spec/grape/validations/params_scope_spec.rb +9 -7
  89. data/spec/grape/validations/single_attribute_iterator_spec.rb +1 -0
  90. data/spec/grape/validations/types/primitive_coercer_spec.rb +2 -2
  91. data/spec/grape/validations/types_spec.rb +8 -8
  92. data/spec/grape/validations/validators/all_or_none_spec.rb +50 -56
  93. data/spec/grape/validations/validators/allow_blank_spec.rb +136 -140
  94. data/spec/grape/validations/validators/at_least_one_of_spec.rb +50 -56
  95. data/spec/grape/validations/validators/coerce_spec.rb +10 -12
  96. data/spec/grape/validations/validators/default_spec.rb +72 -78
  97. data/spec/grape/validations/validators/exactly_one_of_spec.rb +71 -77
  98. data/spec/grape/validations/validators/except_values_spec.rb +1 -1
  99. data/spec/grape/validations/validators/mutual_exclusion_spec.rb +71 -77
  100. data/spec/grape/validations/validators/presence_spec.rb +16 -1
  101. data/spec/grape/validations/validators/regexp_spec.rb +25 -31
  102. data/spec/grape/validations/validators/same_as_spec.rb +14 -20
  103. data/spec/grape/validations/validators/values_spec.rb +172 -171
  104. data/spec/grape/validations_spec.rb +45 -16
  105. data/spec/integration/eager_load/eager_load_spec.rb +2 -2
  106. data/spec/integration/multi_json/json_spec.rb +1 -1
  107. data/spec/integration/multi_xml/xml_spec.rb +1 -1
  108. data/spec/shared/versioning_examples.rb +10 -7
  109. data/spec/spec_helper.rb +11 -1
  110. metadata +116 -116
  111. data/lib/grape/validations/types/build_coercer.rb +0 -94
  112. data/lib/grape/validations/validators/all_or_none.rb +0 -16
  113. data/lib/grape/validations/validators/allow_blank.rb +0 -18
  114. data/lib/grape/validations/validators/as.rb +0 -12
  115. data/lib/grape/validations/validators/at_least_one_of.rb +0 -15
  116. data/lib/grape/validations/validators/coerce.rb +0 -87
  117. data/lib/grape/validations/validators/default.rb +0 -49
  118. data/lib/grape/validations/validators/exactly_one_of.rb +0 -17
  119. data/lib/grape/validations/validators/except_values.rb +0 -22
  120. data/lib/grape/validations/validators/mutual_exclusion.rb +0 -16
  121. data/lib/grape/validations/validators/presence.rb +0 -13
  122. data/lib/grape/validations/validators/regexp.rb +0 -14
  123. data/lib/grape/validations/validators/same_as.rb +0 -27
  124. data/lib/grape/validations/validators/values.rb +0 -86
@@ -2,104 +2,98 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe Grape::Validations::DefaultValidator do
6
- module ValidationsSpec
7
- module DefaultValidatorSpec
8
- class API < Grape::API
9
- default_format :json
10
-
11
- params do
12
- optional :id
13
- optional :type, default: 'default-type'
14
- end
15
- get '/' do
16
- { id: params[:id], type: params[:type] }
17
- end
5
+ describe Grape::Validations::Validators::DefaultValidator do
6
+ let_it_be(:app) do
7
+ Class.new(Grape::API) do
8
+ default_format :json
9
+
10
+ params do
11
+ optional :id
12
+ optional :type, default: 'default-type'
13
+ end
14
+ get '/' do
15
+ { id: params[:id], type: params[:type] }
16
+ end
18
17
 
19
- params do
20
- optional :type1, default: 'default-type1'
21
- optional :type2, default: 'default-type2'
22
- end
23
- get '/user' do
24
- { type1: params[:type1], type2: params[:type2] }
25
- end
18
+ params do
19
+ optional :type1, default: 'default-type1'
20
+ optional :type2, default: 'default-type2'
21
+ end
22
+ get '/user' do
23
+ { type1: params[:type1], type2: params[:type2] }
24
+ end
26
25
 
27
- params do
28
- requires :id
29
- optional :type1, default: 'default-type1'
30
- optional :type2, default: 'default-type2'
31
- end
26
+ params do
27
+ requires :id
28
+ optional :type1, default: 'default-type1'
29
+ optional :type2, default: 'default-type2'
30
+ end
32
31
 
33
- get '/message' do
34
- { id: params[:id], type1: params[:type1], type2: params[:type2] }
35
- end
32
+ get '/message' do
33
+ { id: params[:id], type1: params[:type1], type2: params[:type2] }
34
+ end
36
35
 
37
- params do
38
- optional :random, default: -> { Random.rand }
39
- optional :not_random, default: Random.rand
40
- end
41
- get '/numbers' do
42
- { random_number: params[:random], non_random_number: params[:non_random_number] }
43
- end
36
+ params do
37
+ optional :random, default: -> { Random.rand }
38
+ optional :not_random, default: Random.rand
39
+ end
40
+ get '/numbers' do
41
+ { random_number: params[:random], non_random_number: params[:non_random_number] }
42
+ end
44
43
 
45
- params do
46
- optional :array, type: Array do
47
- requires :name
48
- optional :with_default, default: 'default'
49
- end
50
- end
51
- get '/array' do
52
- { array: params[:array] }
44
+ params do
45
+ optional :array, type: Array do
46
+ requires :name
47
+ optional :with_default, default: 'default'
53
48
  end
49
+ end
50
+ get '/array' do
51
+ { array: params[:array] }
52
+ end
54
53
 
55
- params do
56
- requires :thing1
57
- optional :more_things, type: Array do
58
- requires :nested_thing
59
- requires :other_thing, default: 1
60
- end
61
- end
62
- get '/optional_array' do
63
- { thing1: params[:thing1] }
54
+ params do
55
+ requires :thing1
56
+ optional :more_things, type: Array do
57
+ requires :nested_thing
58
+ requires :other_thing, default: 1
64
59
  end
60
+ end
61
+ get '/optional_array' do
62
+ { thing1: params[:thing1] }
63
+ end
65
64
 
66
- params do
67
- requires :root, type: Hash do
68
- optional :some_things, type: Array do
69
- requires :foo
70
- optional :options, type: Array do
71
- requires :name, type: String
72
- requires :value, type: String
73
- end
65
+ params do
66
+ requires :root, type: Hash do
67
+ optional :some_things, type: Array do
68
+ requires :foo
69
+ optional :options, type: Array do
70
+ requires :name, type: String
71
+ requires :value, type: String
74
72
  end
75
73
  end
76
74
  end
77
- get '/nested_optional_array' do
78
- { root: params[:root] }
79
- end
75
+ end
76
+ get '/nested_optional_array' do
77
+ { root: params[:root] }
78
+ end
80
79
 
81
- params do
82
- requires :root, type: Hash do
83
- optional :some_things, type: Array do
84
- requires :foo
85
- optional :options, type: Array do
86
- optional :name, type: String
87
- optional :value, type: String
88
- end
80
+ params do
81
+ requires :root, type: Hash do
82
+ optional :some_things, type: Array do
83
+ requires :foo
84
+ optional :options, type: Array do
85
+ optional :name, type: String
86
+ optional :value, type: String
89
87
  end
90
88
  end
91
89
  end
92
- get '/another_nested_optional_array' do
93
- { root: params[:root] }
94
- end
90
+ end
91
+ get '/another_nested_optional_array' do
92
+ { root: params[:root] }
95
93
  end
96
94
  end
97
95
  end
98
96
 
99
- def app
100
- ValidationsSpec::DefaultValidatorSpec::API
101
- end
102
-
103
97
  it 'lets you leave required values nested inside an optional blank' do
104
98
  get '/optional_array', thing1: 'stuff'
105
99
  expect(last_response.status).to eq(200)
@@ -2,95 +2,89 @@
2
2
 
3
3
  require 'spec_helper'
4
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
5
+ describe Grape::Validations::Validators::ExactlyOneOfValidator 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
- 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
12
+ params do
13
+ optional :beer
14
+ optional :wine
15
+ optional :grapefruit
16
+ exactly_one_of :beer, :wine, :grapefruit
17
+ end
18
+ post do
19
+ end
24
20
 
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
21
+ params do
22
+ optional :beer
23
+ optional :wine
24
+ optional :grapefruit
25
+ optional :other
26
+ exactly_one_of :beer, :wine, :grapefruit
27
+ end
28
+ post 'mixed-params' do
29
+ end
34
30
 
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
31
+ params do
32
+ optional :beer
33
+ optional :wine
34
+ optional :grapefruit
35
+ exactly_one_of :beer, :wine, :grapefruit, message: 'you should choose one'
36
+ end
37
+ post '/custom-message' do
38
+ end
43
39
 
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
40
+ params do
41
+ requires :item, type: Hash do
42
+ optional :beer
43
+ optional :wine
44
+ optional :grapefruit
45
+ exactly_one_of :beer, :wine, :grapefruit
46
+ end
47
+ end
48
+ post '/nested-hash' do
49
+ end
54
50
 
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
51
+ params do
52
+ optional :item, type: Hash do
53
+ optional :beer
54
+ optional :wine
55
+ optional :grapefruit
56
+ exactly_one_of :beer, :wine, :grapefruit
57
+ end
58
+ end
59
+ post '/nested-optional-hash' do
60
+ end
65
61
 
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
62
+ params do
63
+ requires :items, type: Array do
64
+ optional :beer
65
+ optional :wine
66
+ optional :grapefruit
67
+ exactly_one_of :beer, :wine, :grapefruit
68
+ end
69
+ end
70
+ post '/nested-array' do
71
+ end
76
72
 
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
73
+ params do
74
+ requires :items, type: Array do
75
+ requires :nested_items, type: Array do
76
+ optional :beer, :wine, :grapefruit, type: Grape::API::Boolean
77
+ exactly_one_of :beer, :wine, :grapefruit
86
78
  end
87
79
  end
88
80
  end
81
+ post '/deeply-nested-array' do
82
+ end
89
83
  end
84
+ end
90
85
 
91
- def app
92
- ValidationsSpec::ExactlyOneOfValidatorSpec::API
93
- end
86
+ describe '#validate!' do
87
+ subject(:validate) { post path, params }
94
88
 
95
89
  context 'when all params are present' do
96
90
  let(:path) { '/' }
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe Grape::Validations::ExceptValuesValidator do
5
+ describe Grape::Validations::Validators::ExceptValuesValidator do
6
6
  module ValidationsSpec
7
7
  class ExceptValuesModel
8
8
  DEFAULT_EXCEPTS = %w[invalid-type1 invalid-type2 invalid-type3].freeze
@@ -2,95 +2,89 @@
2
2
 
3
3
  require 'spec_helper'
4
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
5
+ describe Grape::Validations::Validators::MutualExclusionValidator 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
- params do
17
- optional :beer
18
- optional :wine
19
- optional :grapefruit
20
- mutually_exclusive :beer, :wine, :grapefruit
21
- end
22
- post do
23
- end
12
+ params do
13
+ optional :beer
14
+ optional :wine
15
+ optional :grapefruit
16
+ mutually_exclusive :beer, :wine, :grapefruit
17
+ end
18
+ post do
19
+ end
24
20
 
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
21
+ params do
22
+ optional :beer
23
+ optional :wine
24
+ optional :grapefruit
25
+ optional :other
26
+ mutually_exclusive :beer, :wine, :grapefruit
27
+ end
28
+ post 'mixed-params' do
29
+ end
34
30
 
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
31
+ params do
32
+ optional :beer
33
+ optional :wine
34
+ optional :grapefruit
35
+ mutually_exclusive :beer, :wine, :grapefruit, message: 'you should not mix beer and wine'
36
+ end
37
+ post '/custom-message' do
38
+ end
43
39
 
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
40
+ params do
41
+ requires :item, type: Hash do
42
+ optional :beer
43
+ optional :wine
44
+ optional :grapefruit
45
+ mutually_exclusive :beer, :wine, :grapefruit
46
+ end
47
+ end
48
+ post '/nested-hash' do
49
+ end
54
50
 
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
51
+ params do
52
+ optional :item, type: Hash do
53
+ optional :beer
54
+ optional :wine
55
+ optional :grapefruit
56
+ mutually_exclusive :beer, :wine, :grapefruit
57
+ end
58
+ end
59
+ post '/nested-optional-hash' do
60
+ end
65
61
 
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
62
+ params do
63
+ requires :items, type: Array do
64
+ optional :beer
65
+ optional :wine
66
+ optional :grapefruit
67
+ mutually_exclusive :beer, :wine, :grapefruit
68
+ end
69
+ end
70
+ post '/nested-array' do
71
+ end
76
72
 
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
73
+ params do
74
+ requires :items, type: Array do
75
+ requires :nested_items, type: Array do
76
+ optional :beer, :wine, :grapefruit, type: Grape::API::Boolean
77
+ mutually_exclusive :beer, :wine, :grapefruit
86
78
  end
87
79
  end
88
80
  end
81
+ post '/deeply-nested-array' do
82
+ end
89
83
  end
84
+ end
90
85
 
91
- def app
92
- ValidationsSpec::MutualExclusionValidatorSpec::API
93
- end
86
+ describe '#validate!' do
87
+ subject(:validate) { post path, params }
94
88
 
95
89
  context 'when all mutually exclusive params are present' do
96
90
  let(:path) { '/' }
@@ -2,12 +2,13 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe Grape::Validations::PresenceValidator do
5
+ describe Grape::Validations::Validators::PresenceValidator do
6
6
  subject do
7
7
  Class.new(Grape::API) do
8
8
  format :json
9
9
  end
10
10
  end
11
+
11
12
  def app
12
13
  subject
13
14
  end
@@ -20,6 +21,7 @@ describe Grape::Validations::PresenceValidator do
20
21
  end
21
22
  end
22
23
  end
24
+
23
25
  it 'does not validate for any params' do
24
26
  get '/bacons'
25
27
  expect(last_response.status).to eq(200)
@@ -38,15 +40,18 @@ describe Grape::Validations::PresenceValidator do
38
40
  end
39
41
  end
40
42
  end
43
+
41
44
  it 'requires when missing' do
42
45
  get '/requires'
43
46
  expect(last_response.status).to eq(400)
44
47
  expect(last_response.body).to eq('{"error":"email is required, email has no value"}')
45
48
  end
49
+
46
50
  it 'requires when empty' do
47
51
  get '/requires', email: ''
48
52
  expect(last_response.body).to eq('{"error":"email has no value, email format is invalid"}')
49
53
  end
54
+
50
55
  it 'valid when set' do
51
56
  get '/requires', email: 'bob@example.com'
52
57
  expect(last_response.status).to eq(200)
@@ -64,6 +69,7 @@ describe Grape::Validations::PresenceValidator do
64
69
  { ret: params[:id] }
65
70
  end
66
71
  end
72
+
67
73
  it 'validates id' do
68
74
  post '/'
69
75
  expect(last_response.status).to eq(400)
@@ -90,16 +96,19 @@ describe Grape::Validations::PresenceValidator do
90
96
  'Hello'
91
97
  end
92
98
  end
99
+
93
100
  it 'requires when missing' do
94
101
  get '/'
95
102
  expect(last_response.status).to eq(400)
96
103
  expect(last_response.body).to eq('{"error":"email is missing, email is empty"}')
97
104
  end
105
+
98
106
  it 'requires when empty' do
99
107
  get '/', email: ''
100
108
  expect(last_response.status).to eq(400)
101
109
  expect(last_response.body).to eq('{"error":"email is empty, email is invalid"}')
102
110
  end
111
+
103
112
  it 'valid when set' do
104
113
  get '/', email: 'bob@example.com'
105
114
  expect(last_response.status).to eq(200)
@@ -124,6 +133,7 @@ describe Grape::Validations::PresenceValidator do
124
133
  'Hello'
125
134
  end
126
135
  end
136
+
127
137
  it 'validates for all defined params' do
128
138
  get '/single-requires'
129
139
  expect(last_response.status).to eq(400)
@@ -144,6 +154,7 @@ describe Grape::Validations::PresenceValidator do
144
154
  'Hello'
145
155
  end
146
156
  end
157
+
147
158
  it 'validates name, company' do
148
159
  get '/'
149
160
  expect(last_response.status).to eq(400)
@@ -171,6 +182,7 @@ describe Grape::Validations::PresenceValidator do
171
182
  'Nested'
172
183
  end
173
184
  end
185
+
174
186
  it 'validates nested parameters' do
175
187
  get '/nested'
176
188
  expect(last_response.status).to eq(400)
@@ -203,6 +215,7 @@ describe Grape::Validations::PresenceValidator do
203
215
  'Nested triple'
204
216
  end
205
217
  end
218
+
206
219
  it 'validates triple nested parameters' do
207
220
  get '/nested_triple'
208
221
  expect(last_response.status).to eq(400)
@@ -252,6 +265,7 @@ describe Grape::Validations::PresenceValidator do
252
265
  'Hello optional'
253
266
  end
254
267
  end
268
+
255
269
  it 'works with required' do
256
270
  get '/required'
257
271
  expect(last_response.status).to eq(400)
@@ -261,6 +275,7 @@ describe Grape::Validations::PresenceValidator do
261
275
  expect(last_response.status).to eq(200)
262
276
  expect(last_response.body).to eq('Hello required'.to_json)
263
277
  end
278
+
264
279
  it 'works with optional' do
265
280
  get '/optional'
266
281
  expect(last_response.status).to eq(200)