compel 0.1.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 +7 -0
- data/.gitignore +20 -0
- data/.rspec +3 -0
- data/.travis.yml +3 -0
- data/Gemfile +3 -0
- data/LICENSE +22 -0
- data/README.md +131 -0
- data/Rakefile +5 -0
- data/compel.gemspec +25 -0
- data/lib/compel/coercion/boolean.rb +21 -0
- data/lib/compel/coercion/date.rb +13 -0
- data/lib/compel/coercion/datetime.rb +13 -0
- data/lib/compel/coercion/float.rb +13 -0
- data/lib/compel/coercion/hash.rb +13 -0
- data/lib/compel/coercion/integer.rb +13 -0
- data/lib/compel/coercion/json.rb +13 -0
- data/lib/compel/coercion/string.rb +17 -0
- data/lib/compel/coercion/time.rb +13 -0
- data/lib/compel/coercion/type.rb +30 -0
- data/lib/compel/coercion.rb +33 -0
- data/lib/compel/contract.rb +101 -0
- data/lib/compel/errors.rb +53 -0
- data/lib/compel/invalid_params_error.rb +9 -0
- data/lib/compel/param.rb +46 -0
- data/lib/compel/param_type_error.rb +7 -0
- data/lib/compel/param_validation_error.rb +7 -0
- data/lib/compel/validation.rb +72 -0
- data/lib/compel/version.rb +3 -0
- data/lib/compel.rb +42 -0
- data/spec/compel/coercion_spec.rb +186 -0
- data/spec/compel/compel_spec.rb +279 -0
- data/spec/compel/contract_spec.rb +36 -0
- data/spec/compel/errors_spec.rb +48 -0
- data/spec/compel/param_spec.rb +25 -0
- data/spec/compel/validation_spec.rb +73 -0
- data/spec/spec_helper.rb +1 -0
- metadata +141 -0
@@ -0,0 +1,72 @@
|
|
1
|
+
module Compel
|
2
|
+
|
3
|
+
module Validation
|
4
|
+
|
5
|
+
def valid?(value, options)
|
6
|
+
validate(value, options).length == 0
|
7
|
+
end
|
8
|
+
|
9
|
+
def validate!(value, options)
|
10
|
+
errors = validate(value, options)
|
11
|
+
|
12
|
+
if errors.length > 0
|
13
|
+
raise ParamValidationError, errors[0]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def validate(value, options)
|
18
|
+
errors = []
|
19
|
+
|
20
|
+
options.each do |option, option_value|
|
21
|
+
# most of this code snippet is from sinatra-param gem
|
22
|
+
# https://github.com/mattt/sinatra-param
|
23
|
+
# by Mattt Thompson (@mattt)
|
24
|
+
begin
|
25
|
+
case option.to_sym
|
26
|
+
when :required
|
27
|
+
raise ParamValidationError, 'is required' if option_value && value.nil?
|
28
|
+
when :blank
|
29
|
+
raise ParamValidationError, 'cannot be blank' if !option_value && case value
|
30
|
+
when String
|
31
|
+
!(/\S/ === value)
|
32
|
+
when Array, Hash
|
33
|
+
value.empty?
|
34
|
+
else
|
35
|
+
value.nil?
|
36
|
+
end
|
37
|
+
when :format
|
38
|
+
raise ParamValidationError, 'must be a string if using the format validation' unless value.kind_of?(String)
|
39
|
+
raise ParamValidationError, "must match format #{option_value}" unless value =~ option_value
|
40
|
+
when :is
|
41
|
+
raise ParamValidationError, "must be #{option_value}" unless value === option_value
|
42
|
+
when :in, :within, :range
|
43
|
+
raise ParamValidationError, "must be within #{option_value}" unless value.nil? || case option_value
|
44
|
+
when Range
|
45
|
+
option_value.include?(value)
|
46
|
+
else
|
47
|
+
Array(option_value).include?(value)
|
48
|
+
end
|
49
|
+
when :min
|
50
|
+
raise ParamValidationError, "cannot be less than #{option_value}" unless value.nil? || option_value <= value
|
51
|
+
when :max
|
52
|
+
raise ParamValidationError, "cannot be greater than #{option_value}" unless value.nil? || option_value >= value
|
53
|
+
when :length
|
54
|
+
raise ParamValidationError, "cannot have length different than #{option_value}" unless value.nil? || option_value == "#{value}".length
|
55
|
+
when :min_length
|
56
|
+
raise ParamValidationError, "cannot have length less than #{option_value}" unless value.nil? || option_value <= value.length
|
57
|
+
when :max_length
|
58
|
+
raise ParamValidationError, "cannot have length greater than #{option_value}" unless value.nil? || option_value >= value.length
|
59
|
+
end
|
60
|
+
rescue ParamValidationError => exception
|
61
|
+
errors << exception.message
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
errors
|
66
|
+
end
|
67
|
+
|
68
|
+
extend self
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
data/lib/compel.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'hashie'
|
3
|
+
require 'hashie/extensions/symbolize_keys'
|
4
|
+
|
5
|
+
require 'compel/coercion/type'
|
6
|
+
require 'compel/coercion/integer'
|
7
|
+
require 'compel/coercion/float'
|
8
|
+
require 'compel/coercion/string'
|
9
|
+
require 'compel/coercion/date'
|
10
|
+
require 'compel/coercion/time'
|
11
|
+
require 'compel/coercion/datetime'
|
12
|
+
require 'compel/coercion/hash'
|
13
|
+
require 'compel/coercion/json'
|
14
|
+
require 'compel/coercion/boolean'
|
15
|
+
|
16
|
+
require 'compel/invalid_params_error'
|
17
|
+
require 'compel/param_validation_error'
|
18
|
+
require 'compel/param_type_error'
|
19
|
+
|
20
|
+
require 'compel/param'
|
21
|
+
require 'compel/contract'
|
22
|
+
require 'compel/coercion'
|
23
|
+
require 'compel/validation'
|
24
|
+
require 'compel/errors'
|
25
|
+
|
26
|
+
module Compel
|
27
|
+
|
28
|
+
Boolean = Coercion::Boolean
|
29
|
+
|
30
|
+
def self.run!(params, &block)
|
31
|
+
Contract.new(params, &block).validate.raise?
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.run?(params, &block)
|
35
|
+
Contract.new(params, &block).validate.valid?
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.run(params, &block)
|
39
|
+
Contract.new(params, &block).validate.serialize
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,186 @@
|
|
1
|
+
describe Compel::Coercion do
|
2
|
+
|
3
|
+
context 'Type coercion' do
|
4
|
+
|
5
|
+
context 'Integer' do
|
6
|
+
|
7
|
+
it 'should coerce' do
|
8
|
+
value = Compel::Coercion.coerce!(123, Integer)
|
9
|
+
expect(value).to eq(123)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should coerce 1' do
|
13
|
+
value = Compel::Coercion.coerce!('123', Integer)
|
14
|
+
expect(value).to eq(123)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should coerce 2' do
|
18
|
+
value = Compel::Coercion.coerce!(123.3, Integer)
|
19
|
+
expect(value).to eq(123)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should not coerce' do
|
23
|
+
expect(Compel::Coercion.valid?('123abc', Integer)).to eq(false)
|
24
|
+
|
25
|
+
expect { Compel::Coercion.coerce!('123abc', Integer) }.to \
|
26
|
+
raise_error Compel::ParamTypeError, "'123abc' is not a valid Integer"
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'Float' do
|
32
|
+
|
33
|
+
it 'should coerce' do
|
34
|
+
value = Compel::Coercion.coerce!('1.2', Float)
|
35
|
+
|
36
|
+
expect(value).to eq(1.2)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should not coerce' do
|
40
|
+
expect(Compel::Coercion.valid?('1.a233', Float)).to eq(false)
|
41
|
+
|
42
|
+
expect { Compel::Coercion.coerce!('1.a233', Float) }.to \
|
43
|
+
raise_error Compel::ParamTypeError, "'1.a233' is not a valid Float"
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'String' do
|
49
|
+
|
50
|
+
it 'should coerce' do
|
51
|
+
value = Compel::Coercion.coerce!('abc', String)
|
52
|
+
|
53
|
+
expect(value).to eq('abc')
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should not coerce' do
|
57
|
+
value = 1.2
|
58
|
+
|
59
|
+
expect(Compel::Coercion.valid?(value, String)).to eq(false)
|
60
|
+
|
61
|
+
expect { Compel::Coercion.coerce!(value, String) }.to \
|
62
|
+
raise_error Compel::ParamTypeError, "'#{value}' is not a valid String"
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
context 'Date' do
|
68
|
+
|
69
|
+
it 'should coerce' do
|
70
|
+
value = Compel::Coercion.coerce!('2015-12-22', Date)
|
71
|
+
|
72
|
+
expect(value).to eq(Date.parse('2015-12-22'))
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'should not coerce' do
|
76
|
+
value = '2015-0'
|
77
|
+
|
78
|
+
expect(Compel::Coercion.valid?(value, Date)).to eq(false)
|
79
|
+
|
80
|
+
expect { Compel::Coercion.coerce!(value, Date) }.to \
|
81
|
+
raise_error Compel::ParamTypeError, "'#{value}' is not a valid Date"
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
context 'DateTime' do
|
87
|
+
|
88
|
+
it 'should coerce' do
|
89
|
+
value = Compel::Coercion.coerce!('2015-12-22', DateTime)
|
90
|
+
|
91
|
+
expect(value).to be_a DateTime
|
92
|
+
expect(value.year).to eq(2015)
|
93
|
+
expect(value.month).to eq(12)
|
94
|
+
expect(value.day).to eq(22)
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
context 'Hash' do
|
100
|
+
|
101
|
+
it 'should coerce' do
|
102
|
+
value = Compel::Coercion.coerce!({
|
103
|
+
first_name: 'Joaquim',
|
104
|
+
last_name: 'Adráz'
|
105
|
+
}, Hash)
|
106
|
+
|
107
|
+
expect(value).to eq({
|
108
|
+
'first_name' => 'Joaquim',
|
109
|
+
'last_name' => 'Adráz'
|
110
|
+
})
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'should coerce 1' do
|
114
|
+
value = Compel::Coercion.coerce!({
|
115
|
+
'first_name' => 'Joaquim',
|
116
|
+
'last_name' => 'Adráz'
|
117
|
+
}, Hash)
|
118
|
+
|
119
|
+
expect(value).to eq({
|
120
|
+
'first_name' => 'Joaquim',
|
121
|
+
'last_name' => 'Adráz'
|
122
|
+
})
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'should coerce 2' do
|
126
|
+
value = Compel::Coercion.coerce!(Hashie::Mash.new({
|
127
|
+
first_name: 'Joaquim',
|
128
|
+
last_name: 'Adráz'
|
129
|
+
}), Hash)
|
130
|
+
|
131
|
+
expect(value).to eq({
|
132
|
+
'first_name' => 'Joaquim',
|
133
|
+
'last_name' => 'Adráz'
|
134
|
+
})
|
135
|
+
end
|
136
|
+
|
137
|
+
it 'should not coerce' do
|
138
|
+
expect { Compel::Coercion.coerce!(123, Hash) }.to \
|
139
|
+
raise_error Compel::ParamTypeError, "'123' is not a valid Hash"
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'should not coerce 1' do
|
143
|
+
expect { Compel::Coercion.coerce!('hash', Hash) }.to \
|
144
|
+
raise_error Compel::ParamTypeError, "'hash' is not a valid Hash"
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'should not coerce 2' do
|
148
|
+
expect { Compel::Coercion.coerce!(['hash'], Hash) }.to \
|
149
|
+
raise_error Compel::ParamTypeError, "'[\"hash\"]' is not a valid Hash"
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
|
154
|
+
context 'JSON' do
|
155
|
+
|
156
|
+
it 'should coerce' do
|
157
|
+
value = Compel::Coercion.coerce! \
|
158
|
+
"{\"first_name\":\"Joaquim\",\"last_name\":\"Adráz\"}", JSON
|
159
|
+
|
160
|
+
expect(value).to eq({
|
161
|
+
'first_name' => 'Joaquim',
|
162
|
+
'last_name' => 'Adráz'
|
163
|
+
})
|
164
|
+
end
|
165
|
+
|
166
|
+
end
|
167
|
+
|
168
|
+
context 'Boolean' do
|
169
|
+
|
170
|
+
it 'should coerce' do
|
171
|
+
value = Compel::Coercion.coerce!('f', Compel::Boolean)
|
172
|
+
|
173
|
+
expect(value).to eq(false)
|
174
|
+
end
|
175
|
+
|
176
|
+
it 'should coerce' do
|
177
|
+
value = Compel::Coercion.coerce!('0', Compel::Boolean)
|
178
|
+
|
179
|
+
expect(value).to eq(false)
|
180
|
+
end
|
181
|
+
|
182
|
+
end
|
183
|
+
|
184
|
+
end
|
185
|
+
|
186
|
+
end
|
@@ -0,0 +1,279 @@
|
|
1
|
+
describe Compel do
|
2
|
+
|
3
|
+
def make_the_call(method, params)
|
4
|
+
Compel.send(method, params) do
|
5
|
+
param :first_name, String, required: true
|
6
|
+
param :last_name, String, required: true
|
7
|
+
param :birth_date, DateTime
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
context '#run!' do
|
12
|
+
|
13
|
+
it 'should raise InvalidParamsError exception' do
|
14
|
+
params = {
|
15
|
+
first_name: 'Joaquim'
|
16
|
+
}
|
17
|
+
|
18
|
+
expect{ make_the_call(:run!, params) }.to \
|
19
|
+
raise_error Compel::InvalidParamsError, 'params are invalid'
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'shoudl raise InvalidParamsError exception with errors' do
|
23
|
+
params = {
|
24
|
+
first_name: 'Joaquim'
|
25
|
+
}
|
26
|
+
|
27
|
+
expect{ make_the_call(:run!, params) }.to raise_error do |exception|
|
28
|
+
expect(exception.params).to eq \
|
29
|
+
Hashie::Mash.new(first_name: 'Joaquim')
|
30
|
+
|
31
|
+
expect(exception.errors).to eq \
|
32
|
+
Hashie::Mash.new(last_name: ['is required'])
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
context '#run?' do
|
39
|
+
|
40
|
+
it 'should return true' do
|
41
|
+
params = {
|
42
|
+
first_name: 'Joaquim',
|
43
|
+
last_name: 'Adráz',
|
44
|
+
birth_date: '1989-08-06T09:00:00'
|
45
|
+
}
|
46
|
+
|
47
|
+
expect(make_the_call(:run?, params)).to eq(true)
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should return false' do
|
51
|
+
params = {
|
52
|
+
first_name: 'Joaquim'
|
53
|
+
}
|
54
|
+
|
55
|
+
expect(make_the_call(:run?, params)).to eq(false)
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
context '#run' do
|
61
|
+
|
62
|
+
def make_the_call(method, params)
|
63
|
+
Compel.send(method, params) do
|
64
|
+
param :first_name, String, required: true
|
65
|
+
param :last_name, String, required: true
|
66
|
+
param :birth_date, DateTime
|
67
|
+
param :age, Integer
|
68
|
+
param :admin, Compel::Boolean
|
69
|
+
param :blog_role, Hash do
|
70
|
+
param :admin, Compel::Boolean, required: true
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'should compel returning coerced values' do
|
76
|
+
params = {
|
77
|
+
first_name: 'Joaquim',
|
78
|
+
last_name: 'Adráz',
|
79
|
+
birth_date: '1989-08-06T09:00:00',
|
80
|
+
age: '26',
|
81
|
+
admin: 'f',
|
82
|
+
blog_role: {
|
83
|
+
admin: '0'
|
84
|
+
}
|
85
|
+
}
|
86
|
+
|
87
|
+
expect(make_the_call(:run, params)).to eq \
|
88
|
+
Hashie::Mash.new({
|
89
|
+
first_name: 'Joaquim',
|
90
|
+
last_name: 'Adráz',
|
91
|
+
birth_date: DateTime.parse('1989-08-06T09:00:00'),
|
92
|
+
age: 26,
|
93
|
+
admin: false,
|
94
|
+
blog_role: {
|
95
|
+
admin: false
|
96
|
+
}
|
97
|
+
})
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'should not compel for invalid params' do
|
101
|
+
expect{ make_the_call(:run, 1) }.to \
|
102
|
+
raise_error Compel::ParamTypeError, 'params must be an Hash'
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'should not compel for invalid params 1' do
|
106
|
+
expect{ make_the_call(:run, nil) }.to \
|
107
|
+
raise_error Compel::ParamTypeError, 'params must be an Hash'
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'should not compel' do
|
111
|
+
params = {
|
112
|
+
first_name: 'Joaquim'
|
113
|
+
}
|
114
|
+
|
115
|
+
expect(make_the_call(:run, params)).to eq \
|
116
|
+
Hashie::Mash.new({
|
117
|
+
first_name: 'Joaquim',
|
118
|
+
errors: {
|
119
|
+
last_name: ['is required']
|
120
|
+
}
|
121
|
+
})
|
122
|
+
end
|
123
|
+
|
124
|
+
context 'nested Hash' do
|
125
|
+
|
126
|
+
def make_the_call(method, params)
|
127
|
+
Compel.send(method, params) do
|
128
|
+
param :address, Hash, required: true do
|
129
|
+
param :line_one, String, required: true
|
130
|
+
param :line_two, String
|
131
|
+
param :post_code, Hash, required: true do
|
132
|
+
param :prefix, Integer, length: 4, required: true
|
133
|
+
param :suffix, Integer, length: 3
|
134
|
+
param :county, Hash do
|
135
|
+
param :code, String, length: 2, required: true
|
136
|
+
param :name, String
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'should run?' do
|
144
|
+
params = {
|
145
|
+
address: {
|
146
|
+
line_one: 'Lisbon',
|
147
|
+
line_two: 'Portugal',
|
148
|
+
post_code: {
|
149
|
+
prefix: 1100,
|
150
|
+
suffix: 100
|
151
|
+
}
|
152
|
+
}
|
153
|
+
}
|
154
|
+
|
155
|
+
expect(make_the_call(:run?, params)).to eq(true)
|
156
|
+
end
|
157
|
+
|
158
|
+
it 'should not compel' do
|
159
|
+
params = {
|
160
|
+
address: {
|
161
|
+
line_two: 'Portugal'
|
162
|
+
}
|
163
|
+
}
|
164
|
+
|
165
|
+
expect(make_the_call(:run, params)).to eq \
|
166
|
+
Hashie::Mash.new({
|
167
|
+
address: {
|
168
|
+
line_two: 'Portugal'
|
169
|
+
},
|
170
|
+
errors: {
|
171
|
+
address: {
|
172
|
+
line_one: ['is required'],
|
173
|
+
post_code: ['params must be an Hash']
|
174
|
+
}
|
175
|
+
}
|
176
|
+
})
|
177
|
+
end
|
178
|
+
|
179
|
+
it 'should not compel 1' do
|
180
|
+
params = {
|
181
|
+
address: {
|
182
|
+
line_two: 'Portugal',
|
183
|
+
post_code: {
|
184
|
+
prefix: '1',
|
185
|
+
county: {
|
186
|
+
code: 'LX'
|
187
|
+
}
|
188
|
+
}
|
189
|
+
}
|
190
|
+
}
|
191
|
+
|
192
|
+
expect(make_the_call(:run, params)).to eq \
|
193
|
+
Hashie::Mash.new({
|
194
|
+
address: {
|
195
|
+
line_two: 'Portugal',
|
196
|
+
post_code: {
|
197
|
+
prefix: 1,
|
198
|
+
county: {
|
199
|
+
code: 'LX'
|
200
|
+
}
|
201
|
+
}
|
202
|
+
},
|
203
|
+
errors: {
|
204
|
+
address: {
|
205
|
+
line_one: ['is required'],
|
206
|
+
post_code: {
|
207
|
+
prefix: ['cannot have length different than 4']
|
208
|
+
}
|
209
|
+
}
|
210
|
+
}
|
211
|
+
})
|
212
|
+
end
|
213
|
+
|
214
|
+
it 'should not compel 2' do
|
215
|
+
params = {
|
216
|
+
address: {
|
217
|
+
post_code: {
|
218
|
+
suffix: '1234'
|
219
|
+
}
|
220
|
+
}
|
221
|
+
}
|
222
|
+
|
223
|
+
expect(make_the_call(:run, params)).to eq \
|
224
|
+
Hashie::Mash.new({
|
225
|
+
address: {
|
226
|
+
post_code: {
|
227
|
+
suffix: 1234
|
228
|
+
}
|
229
|
+
},
|
230
|
+
errors: {
|
231
|
+
address: {
|
232
|
+
line_one: ['is required'],
|
233
|
+
post_code: {
|
234
|
+
prefix: ['is required'],
|
235
|
+
suffix: ['cannot have length different than 3']
|
236
|
+
}
|
237
|
+
}
|
238
|
+
}
|
239
|
+
})
|
240
|
+
end
|
241
|
+
|
242
|
+
it 'should not compel 3' do
|
243
|
+
params = {
|
244
|
+
address: {
|
245
|
+
post_code: {
|
246
|
+
prefix: '1100',
|
247
|
+
suffix: '100',
|
248
|
+
county: {}
|
249
|
+
},
|
250
|
+
}
|
251
|
+
}
|
252
|
+
|
253
|
+
expect(make_the_call(:run, params)).to eq \
|
254
|
+
Hashie::Mash.new({
|
255
|
+
address: {
|
256
|
+
post_code: {
|
257
|
+
prefix: 1100,
|
258
|
+
suffix: 100,
|
259
|
+
county: {}
|
260
|
+
}
|
261
|
+
},
|
262
|
+
errors: {
|
263
|
+
address: {
|
264
|
+
line_one: ['is required'],
|
265
|
+
post_code: {
|
266
|
+
county: {
|
267
|
+
code: ['is required']
|
268
|
+
}
|
269
|
+
}
|
270
|
+
}
|
271
|
+
}
|
272
|
+
})
|
273
|
+
end
|
274
|
+
|
275
|
+
end
|
276
|
+
|
277
|
+
end
|
278
|
+
|
279
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
describe Compel::Contract do
|
2
|
+
|
3
|
+
context '#conditions' do
|
4
|
+
|
5
|
+
it 'should build with conditions block option' do
|
6
|
+
contract = \
|
7
|
+
Compel::Contract.new({ first_name: 'Joaquim' }) do
|
8
|
+
param :address, Hash, required: true do
|
9
|
+
param :post_code, String
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
expect(contract.conditions[:address].type).to eq(Hash)
|
14
|
+
expect(contract.conditions[:address].required?).to eq(true)
|
15
|
+
expect(contract.conditions[:address].conditions?).to eq(true)
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'params' do
|
21
|
+
|
22
|
+
it 'should return coerced params' do
|
23
|
+
contract = \
|
24
|
+
Compel::Contract.new(date: '2015-12-22') { param :date, DateTime }
|
25
|
+
.validate
|
26
|
+
|
27
|
+
expect(contract.coerced_params.date).to be_a DateTime
|
28
|
+
expect(contract.coerced_params.date.year).to eq(2015)
|
29
|
+
expect(contract.coerced_params.date.month).to eq(12)
|
30
|
+
expect(contract.coerced_params.date.day).to eq(22)
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
describe Compel::Errors do
|
2
|
+
|
3
|
+
it 'should add error' do
|
4
|
+
errors = Compel::Errors.new
|
5
|
+
errors.add(:first_name, 'is required')
|
6
|
+
|
7
|
+
expect(errors.to_hash[:first_name]).to include('is required')
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should add multiple errors' do
|
11
|
+
errors = Compel::Errors.new
|
12
|
+
errors.add(:first_name, 'is required')
|
13
|
+
errors.add(:first_name, 'is invalid')
|
14
|
+
|
15
|
+
expect(errors.to_hash[:first_name]).to include('is required')
|
16
|
+
expect(errors.to_hash[:first_name]).to include('is invalid')
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should add Compel::Errors' do
|
20
|
+
address_errors = Compel::Errors.new
|
21
|
+
address_errors.add(:line_one, 'is required')
|
22
|
+
address_errors.add(:post_code, 'must be an Hash')
|
23
|
+
|
24
|
+
errors = Compel::Errors.new
|
25
|
+
errors.add(:address, address_errors)
|
26
|
+
|
27
|
+
expect(errors.to_hash[:address][:line_one]).to include('is required')
|
28
|
+
expect(errors.to_hash[:address][:post_code]).to include('must be an Hash')
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should add nested Compel::Errors' do
|
32
|
+
post_code_errors = Compel::Errors.new
|
33
|
+
post_code_errors.add(:prefix, 'is invalid')
|
34
|
+
post_code_errors.add(:suffix, 'is required')
|
35
|
+
|
36
|
+
address_errors = Compel::Errors.new
|
37
|
+
address_errors.add(:line_one, 'is required')
|
38
|
+
address_errors.add(:post_code, post_code_errors)
|
39
|
+
|
40
|
+
errors = Compel::Errors.new
|
41
|
+
errors.add(:address, address_errors)
|
42
|
+
|
43
|
+
expect(errors.to_hash[:address][:line_one]).to include('is required')
|
44
|
+
expect(errors.to_hash[:address][:post_code][:prefix]).to include('is invalid')
|
45
|
+
expect(errors.to_hash[:address][:post_code][:suffix]).to include('is required')
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
describe Compel::Param do
|
2
|
+
|
3
|
+
context 'default value' do
|
4
|
+
|
5
|
+
it 'should override default value when value is given' do
|
6
|
+
param = Compel::Param.new(:number, Integer, nil, { default: 123 })
|
7
|
+
|
8
|
+
expect(param.value).to eq(123)
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should use default value when not given a value' do
|
12
|
+
param = Compel::Param.new(:number, Integer, 123, { default: 456 })
|
13
|
+
|
14
|
+
expect(param.value).to eq(123)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should allow proc as default value' do
|
18
|
+
param = Compel::Param.new(:year, Integer, nil, { default: Proc.new { Time.now.year } })
|
19
|
+
|
20
|
+
expect(param.value).to eq(Time.now.year)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|