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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +18 -0
- data/CONTRIBUTING.md +1 -0
- data/README.md +9 -1
- data/lib/grape/api.rb +12 -0
- data/lib/grape/dry_types.rb +12 -0
- data/lib/grape/dsl/headers.rb +5 -2
- data/lib/grape/dsl/helpers.rb +1 -1
- data/lib/grape/middleware/auth/dsl.rb +7 -1
- data/lib/grape/middleware/base.rb +1 -1
- data/lib/grape/util/json.rb +2 -0
- data/lib/grape/util/strict_hash_configuration.rb +1 -1
- data/lib/grape/validations/types/array_coercer.rb +0 -2
- data/lib/grape/validations/types/dry_type_coercer.rb +1 -10
- data/lib/grape/validations/types/json.rb +0 -2
- data/lib/grape/validations/types/primitive_coercer.rb +5 -7
- data/lib/grape/validations/types/set_coercer.rb +0 -3
- data/lib/grape/validations/types.rb +83 -9
- data/lib/grape/validations/validators/all_or_none_of_validator.rb +16 -0
- data/lib/grape/validations/validators/allow_blank_validator.rb +20 -0
- data/lib/grape/validations/validators/as_validator.rb +14 -0
- data/lib/grape/validations/validators/at_least_one_of_validator.rb +15 -0
- data/lib/grape/validations/validators/base.rb +73 -71
- data/lib/grape/validations/validators/coerce_validator.rb +75 -0
- data/lib/grape/validations/validators/default_validator.rb +51 -0
- data/lib/grape/validations/validators/exactly_one_of_validator.rb +17 -0
- data/lib/grape/validations/validators/except_values_validator.rb +24 -0
- data/lib/grape/validations/validators/multiple_params_base.rb +24 -22
- data/lib/grape/validations/validators/mutual_exclusion_validator.rb +16 -0
- data/lib/grape/validations/validators/presence_validator.rb +15 -0
- data/lib/grape/validations/validators/regexp_validator.rb +16 -0
- data/lib/grape/validations/validators/same_as_validator.rb +29 -0
- data/lib/grape/validations/validators/values_validator.rb +88 -0
- data/lib/grape/version.rb +1 -1
- data/lib/grape.rb +59 -24
- data/spec/grape/api/custom_validations_spec.rb +77 -46
- data/spec/grape/api/deeply_included_options_spec.rb +3 -3
- data/spec/grape/api/defines_boolean_in_params_spec.rb +2 -1
- data/spec/grape/api/invalid_format_spec.rb +2 -0
- data/spec/grape/api/recognize_path_spec.rb +1 -1
- data/spec/grape/api/shared_helpers_exactly_one_of_spec.rb +9 -15
- data/spec/grape/api_remount_spec.rb +16 -15
- data/spec/grape/api_spec.rb +317 -193
- data/spec/grape/dsl/callbacks_spec.rb +1 -0
- data/spec/grape/dsl/headers_spec.rb +39 -9
- data/spec/grape/dsl/helpers_spec.rb +3 -2
- data/spec/grape/dsl/inside_route_spec.rb +6 -4
- data/spec/grape/dsl/logger_spec.rb +16 -18
- data/spec/grape/dsl/middleware_spec.rb +1 -0
- data/spec/grape/dsl/parameters_spec.rb +1 -0
- data/spec/grape/dsl/request_response_spec.rb +1 -0
- data/spec/grape/dsl/routing_spec.rb +9 -6
- data/spec/grape/endpoint/declared_spec.rb +12 -12
- data/spec/grape/endpoint_spec.rb +59 -50
- data/spec/grape/entity_spec.rb +13 -13
- data/spec/grape/exceptions/body_parse_errors_spec.rb +3 -0
- data/spec/grape/exceptions/invalid_accept_header_spec.rb +61 -22
- data/spec/grape/exceptions/validation_errors_spec.rb +13 -10
- data/spec/grape/exceptions/validation_spec.rb +5 -3
- data/spec/grape/extensions/param_builders/hash_spec.rb +7 -7
- data/spec/grape/extensions/param_builders/hash_with_indifferent_access_spec.rb +8 -8
- data/spec/grape/extensions/param_builders/hashie/mash_spec.rb +8 -8
- data/spec/grape/integration/rack_sendfile_spec.rb +1 -1
- data/spec/grape/loading_spec.rb +8 -8
- data/spec/grape/middleware/auth/dsl_spec.rb +14 -5
- data/spec/grape/middleware/auth/strategies_spec.rb +60 -20
- data/spec/grape/middleware/base_spec.rb +24 -15
- data/spec/grape/middleware/error_spec.rb +1 -0
- data/spec/grape/middleware/exception_spec.rb +111 -161
- data/spec/grape/middleware/formatter_spec.rb +25 -4
- data/spec/grape/middleware/globals_spec.rb +7 -4
- data/spec/grape/middleware/stack_spec.rb +11 -11
- data/spec/grape/middleware/versioner/accept_version_header_spec.rb +2 -1
- data/spec/grape/middleware/versioner/header_spec.rb +14 -13
- data/spec/grape/middleware/versioner/param_spec.rb +7 -1
- data/spec/grape/middleware/versioner/path_spec.rb +5 -1
- data/spec/grape/middleware/versioner_spec.rb +1 -1
- data/spec/grape/parser_spec.rb +4 -0
- data/spec/grape/path_spec.rb +52 -52
- data/spec/grape/presenters/presenter_spec.rb +7 -6
- data/spec/grape/request_spec.rb +6 -4
- data/spec/grape/util/inheritable_setting_spec.rb +7 -7
- data/spec/grape/util/inheritable_values_spec.rb +3 -2
- data/spec/grape/util/reverse_stackable_values_spec.rb +3 -1
- data/spec/grape/util/stackable_values_spec.rb +7 -5
- data/spec/grape/validations/instance_behaivour_spec.rb +9 -10
- data/spec/grape/validations/multiple_attributes_iterator_spec.rb +1 -0
- data/spec/grape/validations/params_scope_spec.rb +9 -7
- data/spec/grape/validations/single_attribute_iterator_spec.rb +1 -0
- data/spec/grape/validations/types/primitive_coercer_spec.rb +2 -2
- data/spec/grape/validations/types_spec.rb +8 -8
- data/spec/grape/validations/validators/all_or_none_spec.rb +50 -56
- data/spec/grape/validations/validators/allow_blank_spec.rb +136 -140
- data/spec/grape/validations/validators/at_least_one_of_spec.rb +50 -56
- data/spec/grape/validations/validators/coerce_spec.rb +10 -12
- data/spec/grape/validations/validators/default_spec.rb +72 -78
- data/spec/grape/validations/validators/exactly_one_of_spec.rb +71 -77
- data/spec/grape/validations/validators/except_values_spec.rb +1 -1
- data/spec/grape/validations/validators/mutual_exclusion_spec.rb +71 -77
- data/spec/grape/validations/validators/presence_spec.rb +16 -1
- data/spec/grape/validations/validators/regexp_spec.rb +25 -31
- data/spec/grape/validations/validators/same_as_spec.rb +14 -20
- data/spec/grape/validations/validators/values_spec.rb +172 -171
- data/spec/grape/validations_spec.rb +45 -16
- data/spec/integration/eager_load/eager_load_spec.rb +2 -2
- data/spec/integration/multi_json/json_spec.rb +1 -1
- data/spec/integration/multi_xml/xml_spec.rb +1 -1
- data/spec/shared/versioning_examples.rb +10 -7
- data/spec/spec_helper.rb +11 -1
- metadata +116 -116
- data/lib/grape/validations/types/build_coercer.rb +0 -94
- data/lib/grape/validations/validators/all_or_none.rb +0 -16
- data/lib/grape/validations/validators/allow_blank.rb +0 -18
- data/lib/grape/validations/validators/as.rb +0 -12
- data/lib/grape/validations/validators/at_least_one_of.rb +0 -15
- data/lib/grape/validations/validators/coerce.rb +0 -87
- data/lib/grape/validations/validators/default.rb +0 -49
- data/lib/grape/validations/validators/exactly_one_of.rb +0 -17
- data/lib/grape/validations/validators/except_values.rb +0 -22
- data/lib/grape/validations/validators/mutual_exclusion.rb +0 -16
- data/lib/grape/validations/validators/presence.rb +0 -13
- data/lib/grape/validations/validators/regexp.rb +0 -14
- data/lib/grape/validations/validators/same_as.rb +0 -27
- 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
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
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
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
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
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
26
|
+
params do
|
27
|
+
requires :id
|
28
|
+
optional :type1, default: 'default-type1'
|
29
|
+
optional :type2, default: 'default-type2'
|
30
|
+
end
|
32
31
|
|
33
|
-
|
34
|
-
|
35
|
-
|
32
|
+
get '/message' do
|
33
|
+
{ id: params[:id], type1: params[:type1], type2: params[:type2] }
|
34
|
+
end
|
36
35
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
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
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
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
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
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
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
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
|
-
|
78
|
-
|
79
|
-
|
75
|
+
end
|
76
|
+
get '/nested_optional_array' do
|
77
|
+
{ root: params[:root] }
|
78
|
+
end
|
80
79
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
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
|
-
|
93
|
-
|
94
|
-
|
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
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
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
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
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
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
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
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
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
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
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
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
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
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
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
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
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
|
-
|
92
|
-
|
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
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
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
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
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
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
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
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
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
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
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
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
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
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
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
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
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
|
-
|
92
|
-
|
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)
|