grape 1.6.0 → 1.6.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +26 -0
  3. data/CONTRIBUTING.md +2 -1
  4. data/README.md +9 -1
  5. data/UPGRADING.md +4 -4
  6. data/lib/grape/api.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/strict_hash_configuration.rb +1 -1
  12. data/lib/grape/validations/validators/all_or_none.rb +7 -5
  13. data/lib/grape/validations/validators/allow_blank.rb +9 -7
  14. data/lib/grape/validations/validators/as.rb +7 -5
  15. data/lib/grape/validations/validators/at_least_one_of.rb +6 -4
  16. data/lib/grape/validations/validators/base.rb +73 -71
  17. data/lib/grape/validations/validators/coerce.rb +63 -75
  18. data/lib/grape/validations/validators/default.rb +36 -34
  19. data/lib/grape/validations/validators/exactly_one_of.rb +8 -6
  20. data/lib/grape/validations/validators/except_values.rb +13 -11
  21. data/lib/grape/validations/validators/multiple_params_base.rb +24 -22
  22. data/lib/grape/validations/validators/mutual_exclusion.rb +7 -5
  23. data/lib/grape/validations/validators/presence.rb +6 -4
  24. data/lib/grape/validations/validators/regexp.rb +7 -5
  25. data/lib/grape/validations/validators/same_as.rb +17 -15
  26. data/lib/grape/validations/validators/values.rb +59 -57
  27. data/lib/grape/validations.rb +6 -0
  28. data/lib/grape/version.rb +1 -1
  29. data/lib/grape.rb +2 -0
  30. data/spec/grape/api/custom_validations_spec.rb +77 -46
  31. data/spec/grape/api/deeply_included_options_spec.rb +3 -3
  32. data/spec/grape/api/defines_boolean_in_params_spec.rb +2 -1
  33. data/spec/grape/api/invalid_format_spec.rb +2 -0
  34. data/spec/grape/api/recognize_path_spec.rb +1 -1
  35. data/spec/grape/api/shared_helpers_exactly_one_of_spec.rb +9 -15
  36. data/spec/grape/api_remount_spec.rb +16 -15
  37. data/spec/grape/api_spec.rb +317 -193
  38. data/spec/grape/dsl/callbacks_spec.rb +1 -0
  39. data/spec/grape/dsl/headers_spec.rb +39 -9
  40. data/spec/grape/dsl/helpers_spec.rb +3 -2
  41. data/spec/grape/dsl/inside_route_spec.rb +6 -4
  42. data/spec/grape/dsl/logger_spec.rb +16 -18
  43. data/spec/grape/dsl/middleware_spec.rb +1 -0
  44. data/spec/grape/dsl/parameters_spec.rb +1 -0
  45. data/spec/grape/dsl/request_response_spec.rb +1 -0
  46. data/spec/grape/dsl/routing_spec.rb +9 -6
  47. data/spec/grape/endpoint/declared_spec.rb +12 -12
  48. data/spec/grape/endpoint_spec.rb +59 -50
  49. data/spec/grape/entity_spec.rb +13 -13
  50. data/spec/grape/exceptions/body_parse_errors_spec.rb +3 -0
  51. data/spec/grape/exceptions/invalid_accept_header_spec.rb +61 -22
  52. data/spec/grape/exceptions/validation_errors_spec.rb +13 -10
  53. data/spec/grape/exceptions/validation_spec.rb +5 -3
  54. data/spec/grape/extensions/param_builders/hash_spec.rb +7 -7
  55. data/spec/grape/extensions/param_builders/hash_with_indifferent_access_spec.rb +8 -8
  56. data/spec/grape/extensions/param_builders/hashie/mash_spec.rb +8 -8
  57. data/spec/grape/integration/rack_sendfile_spec.rb +1 -1
  58. data/spec/grape/loading_spec.rb +8 -8
  59. data/spec/grape/middleware/auth/dsl_spec.rb +14 -5
  60. data/spec/grape/middleware/auth/strategies_spec.rb +60 -20
  61. data/spec/grape/middleware/base_spec.rb +24 -15
  62. data/spec/grape/middleware/error_spec.rb +1 -0
  63. data/spec/grape/middleware/exception_spec.rb +111 -161
  64. data/spec/grape/middleware/formatter_spec.rb +25 -4
  65. data/spec/grape/middleware/globals_spec.rb +7 -4
  66. data/spec/grape/middleware/stack_spec.rb +11 -11
  67. data/spec/grape/middleware/versioner/accept_version_header_spec.rb +2 -1
  68. data/spec/grape/middleware/versioner/header_spec.rb +14 -13
  69. data/spec/grape/middleware/versioner/param_spec.rb +7 -1
  70. data/spec/grape/middleware/versioner/path_spec.rb +5 -1
  71. data/spec/grape/middleware/versioner_spec.rb +1 -1
  72. data/spec/grape/parser_spec.rb +4 -0
  73. data/spec/grape/path_spec.rb +52 -52
  74. data/spec/grape/presenters/presenter_spec.rb +7 -6
  75. data/spec/grape/request_spec.rb +6 -4
  76. data/spec/grape/util/inheritable_setting_spec.rb +7 -7
  77. data/spec/grape/util/inheritable_values_spec.rb +3 -2
  78. data/spec/grape/util/reverse_stackable_values_spec.rb +3 -1
  79. data/spec/grape/util/stackable_values_spec.rb +7 -5
  80. data/spec/grape/validations/instance_behaivour_spec.rb +9 -10
  81. data/spec/grape/validations/multiple_attributes_iterator_spec.rb +1 -0
  82. data/spec/grape/validations/params_scope_spec.rb +9 -7
  83. data/spec/grape/validations/single_attribute_iterator_spec.rb +1 -0
  84. data/spec/grape/validations/types/primitive_coercer_spec.rb +2 -2
  85. data/spec/grape/validations/types_spec.rb +8 -8
  86. data/spec/grape/validations/validators/all_or_none_spec.rb +50 -56
  87. data/spec/grape/validations/validators/allow_blank_spec.rb +136 -140
  88. data/spec/grape/validations/validators/at_least_one_of_spec.rb +50 -56
  89. data/spec/grape/validations/validators/coerce_spec.rb +10 -12
  90. data/spec/grape/validations/validators/default_spec.rb +72 -78
  91. data/spec/grape/validations/validators/exactly_one_of_spec.rb +71 -77
  92. data/spec/grape/validations/validators/except_values_spec.rb +1 -1
  93. data/spec/grape/validations/validators/mutual_exclusion_spec.rb +71 -77
  94. data/spec/grape/validations/validators/presence_spec.rb +16 -1
  95. data/spec/grape/validations/validators/regexp_spec.rb +25 -31
  96. data/spec/grape/validations/validators/same_as_spec.rb +14 -20
  97. data/spec/grape/validations/validators/values_spec.rb +172 -171
  98. data/spec/grape/validations_spec.rb +45 -16
  99. data/spec/integration/eager_load/eager_load_spec.rb +2 -2
  100. data/spec/integration/multi_json/json_spec.rb +1 -1
  101. data/spec/integration/multi_xml/xml_spec.rb +1 -1
  102. data/spec/shared/versioning_examples.rb +10 -7
  103. data/spec/spec_helper.rb +11 -1
  104. metadata +102 -102
@@ -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)