active_interaction 4.0.5 → 5.0.0

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 (77) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +149 -6
  3. data/README.md +67 -32
  4. data/lib/active_interaction/array_input.rb +77 -0
  5. data/lib/active_interaction/base.rb +14 -98
  6. data/lib/active_interaction/concerns/active_recordable.rb +3 -3
  7. data/lib/active_interaction/concerns/missable.rb +2 -2
  8. data/lib/active_interaction/errors.rb +6 -88
  9. data/lib/active_interaction/exceptions.rb +47 -0
  10. data/lib/active_interaction/filter/column.rb +59 -0
  11. data/lib/active_interaction/filter/error.rb +40 -0
  12. data/lib/active_interaction/filter.rb +44 -53
  13. data/lib/active_interaction/filters/abstract_date_time_filter.rb +9 -6
  14. data/lib/active_interaction/filters/abstract_numeric_filter.rb +7 -3
  15. data/lib/active_interaction/filters/array_filter.rb +36 -10
  16. data/lib/active_interaction/filters/boolean_filter.rb +4 -3
  17. data/lib/active_interaction/filters/date_filter.rb +1 -1
  18. data/lib/active_interaction/filters/date_time_filter.rb +1 -1
  19. data/lib/active_interaction/filters/decimal_filter.rb +1 -1
  20. data/lib/active_interaction/filters/float_filter.rb +1 -1
  21. data/lib/active_interaction/filters/hash_filter.rb +23 -15
  22. data/lib/active_interaction/filters/integer_filter.rb +1 -1
  23. data/lib/active_interaction/filters/interface_filter.rb +12 -12
  24. data/lib/active_interaction/filters/object_filter.rb +9 -3
  25. data/lib/active_interaction/filters/record_filter.rb +21 -11
  26. data/lib/active_interaction/filters/string_filter.rb +1 -1
  27. data/lib/active_interaction/filters/symbol_filter.rb +1 -1
  28. data/lib/active_interaction/filters/time_filter.rb +4 -4
  29. data/lib/active_interaction/hash_input.rb +43 -0
  30. data/lib/active_interaction/input.rb +23 -0
  31. data/lib/active_interaction/inputs.rb +157 -46
  32. data/lib/active_interaction/locale/en.yml +0 -1
  33. data/lib/active_interaction/locale/fr.yml +0 -1
  34. data/lib/active_interaction/locale/it.yml +0 -1
  35. data/lib/active_interaction/locale/ja.yml +0 -1
  36. data/lib/active_interaction/locale/pt-BR.yml +0 -1
  37. data/lib/active_interaction/modules/validation.rb +6 -17
  38. data/lib/active_interaction/version.rb +1 -1
  39. data/lib/active_interaction.rb +43 -36
  40. data/spec/active_interaction/array_input_spec.rb +166 -0
  41. data/spec/active_interaction/base_spec.rb +15 -240
  42. data/spec/active_interaction/concerns/active_modelable_spec.rb +3 -3
  43. data/spec/active_interaction/concerns/active_recordable_spec.rb +7 -7
  44. data/spec/active_interaction/concerns/hashable_spec.rb +8 -8
  45. data/spec/active_interaction/concerns/missable_spec.rb +9 -9
  46. data/spec/active_interaction/concerns/runnable_spec.rb +34 -32
  47. data/spec/active_interaction/errors_spec.rb +60 -43
  48. data/spec/active_interaction/{filter_column_spec.rb → filter/column_spec.rb} +3 -10
  49. data/spec/active_interaction/filter_spec.rb +6 -6
  50. data/spec/active_interaction/filters/abstract_date_time_filter_spec.rb +2 -2
  51. data/spec/active_interaction/filters/abstract_numeric_filter_spec.rb +2 -2
  52. data/spec/active_interaction/filters/array_filter_spec.rb +99 -24
  53. data/spec/active_interaction/filters/boolean_filter_spec.rb +12 -11
  54. data/spec/active_interaction/filters/date_filter_spec.rb +32 -27
  55. data/spec/active_interaction/filters/date_time_filter_spec.rb +34 -29
  56. data/spec/active_interaction/filters/decimal_filter_spec.rb +20 -18
  57. data/spec/active_interaction/filters/file_filter_spec.rb +7 -7
  58. data/spec/active_interaction/filters/float_filter_spec.rb +19 -17
  59. data/spec/active_interaction/filters/hash_filter_spec.rb +16 -18
  60. data/spec/active_interaction/filters/integer_filter_spec.rb +24 -22
  61. data/spec/active_interaction/filters/interface_filter_spec.rb +105 -82
  62. data/spec/active_interaction/filters/object_filter_spec.rb +52 -36
  63. data/spec/active_interaction/filters/record_filter_spec.rb +61 -39
  64. data/spec/active_interaction/filters/string_filter_spec.rb +7 -7
  65. data/spec/active_interaction/filters/symbol_filter_spec.rb +6 -6
  66. data/spec/active_interaction/filters/time_filter_spec.rb +57 -34
  67. data/spec/active_interaction/hash_input_spec.rb +58 -0
  68. data/spec/active_interaction/i18n_spec.rb +22 -17
  69. data/spec/active_interaction/inputs_spec.rb +167 -23
  70. data/spec/active_interaction/integration/array_interaction_spec.rb +3 -7
  71. data/spec/active_interaction/modules/validation_spec.rb +8 -31
  72. data/spec/spec_helper.rb +8 -0
  73. data/spec/support/concerns.rb +2 -2
  74. data/spec/support/filters.rb +27 -51
  75. data/spec/support/interactions.rb +4 -4
  76. metadata +45 -95
  77. data/lib/active_interaction/filter_column.rb +0 -57
@@ -1,22 +1,19 @@
1
1
  require 'spec_helper'
2
2
  require 'active_record'
3
- unless defined?(JRUBY_VERSION) # rubocop:disable Style/IfUnlessModifier
4
- require 'sqlite3'
5
- end
3
+ require 'sqlite3'
6
4
 
7
- unless defined?(JRUBY_VERSION)
8
- ActiveRecord::Base.establish_connection(
9
- adapter: 'sqlite3',
10
- database: ':memory:'
11
- )
12
- end
5
+ ActiveRecord::Base.establish_connection(
6
+ adapter: 'sqlite3',
7
+ database: ':memory:'
8
+ )
13
9
 
14
10
  describe ActiveInteraction::Errors do
15
- let(:klass) do
16
- Class.new do
17
- include ActiveInteraction::ActiveModelable
11
+ subject(:errors) { described_class.new(klass.new) }
18
12
 
19
- attr_reader :attribute
13
+ let(:klass) do
14
+ Class.new(ActiveInteraction::Base) do
15
+ string :attribute, defualt: nil
16
+ array :array, defualt: nil
20
17
 
21
18
  def self.name
22
19
  @name ||= SecureRandom.hex
@@ -24,8 +21,6 @@ describe ActiveInteraction::Errors do
24
21
  end
25
22
  end
26
23
 
27
- subject(:errors) { described_class.new(klass.new) }
28
-
29
24
  describe '#merge!' do
30
25
  let(:other) { described_class.new(klass.new) }
31
26
 
@@ -124,6 +119,25 @@ describe ActiveInteraction::Errors do
124
119
  end
125
120
  end
126
121
 
122
+ context 'with nested index errors' do
123
+ let(:other) { described_class.new(klass.new) }
124
+
125
+ before do
126
+ if ::ActiveRecord.respond_to?(:index_nested_attribute_errors)
127
+ allow(::ActiveRecord).to receive(:index_nested_attribute_errors).and_return(true)
128
+ else
129
+ allow(::ActiveRecord::Base).to receive(:index_nested_attribute_errors).and_return(true)
130
+ end
131
+
132
+ other.add(:'array[0]')
133
+ end
134
+
135
+ it 'adds the error' do
136
+ errors.merge!(other)
137
+ expect(errors.messages[:'array[0]']).to eql ['is invalid']
138
+ end
139
+ end
140
+
127
141
  context 'with ActiveModel errors' do
128
142
  let(:other) { ActiveModel::Errors.new(klass.new) }
129
143
 
@@ -139,40 +153,43 @@ describe ActiveInteraction::Errors do
139
153
  end
140
154
  end
141
155
 
142
- unless defined?(JRUBY_VERSION)
143
- context 'with nested errors' do
144
- before do
145
- # suppress create_table output
146
- allow($stdout).to receive(:puts)
147
- ActiveRecord::Schema.define do
148
- create_table(:as)
149
- create_table(:bs) do |t|
150
- t.column :a_id, :integer
151
- t.column :name, :string
152
- end
153
- end
154
-
155
- class A < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
156
- has_one :b
157
- accepts_nested_attributes_for :b
158
- end
156
+ context 'with nested errors' do
157
+ let(:a_klass) do
158
+ Class.new(ActiveRecord::Base) do
159
+ has_one :b
160
+ accepts_nested_attributes_for :b
161
+ end
162
+ end
163
+ let(:a) { A.create(b_attributes: { name: nil }) }
164
+ let(:b_klass) do
165
+ Class.new(ActiveRecord::Base) do
166
+ belongs_to :a
159
167
 
160
- class B < ActiveRecord::Base # rubocop:disable Lint/ConstantDefinitionInBlock
161
- belongs_to :a
168
+ validates :name, presence: true
169
+ end
170
+ end
162
171
 
163
- validates :name, presence: true
172
+ before do
173
+ # suppress create_table output
174
+ allow($stdout).to receive(:puts)
175
+ ActiveRecord::Schema.define do
176
+ create_table(:as)
177
+ create_table(:bs) do |t|
178
+ t.column :a_id, :integer
179
+ t.column :name, :string
164
180
  end
165
181
  end
166
182
 
167
- let(:a) { A.create(b_attributes: { name: nil }) }
183
+ stub_const('A', a_klass)
184
+ stub_const('B', b_klass)
185
+ end
168
186
 
169
- it 'merges the nested errors' do
170
- a.valid?
171
- expect(a.errors.messages).to eq('b.name': ["can't be blank"])
172
- expect(a.errors.size).to eql 1
173
- expect { errors.merge!(a.errors) }.to_not raise_error
174
- expect(errors.size).to eql 1
175
- end
187
+ it 'merges the nested errors' do
188
+ a.valid?
189
+ expect(a.errors.messages).to eq('b.name': ["can't be blank"])
190
+ expect(a.errors.size).to be 1
191
+ expect { errors.merge!(a.errors) }.to_not raise_error
192
+ expect(errors.size).to be 1
176
193
  end
177
194
  end
178
195
  end
@@ -1,9 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe ActiveInteraction::FilterColumn do
4
- let(:type) { :float }
3
+ describe ActiveInteraction::Filter::Column do
5
4
  subject(:column) { described_class.intern(type) }
6
5
 
6
+ let(:type) { :float }
7
+
7
8
  describe '.intern(type)' do
8
9
  it 'returns the same object for each type' do
9
10
  expect(described_class.intern(type)).to equal column
@@ -83,12 +84,4 @@ describe ActiveInteraction::FilterColumn do
83
84
  end
84
85
  end
85
86
  end
86
-
87
- describe '#type' do
88
- let(:type) { :float }
89
-
90
- it 'returns the type' do
91
- expect(column.type).to eql type
92
- end
93
- end
94
87
  end
@@ -5,30 +5,30 @@ describe ActiveInteraction::Filter, :filter do
5
5
 
6
6
  describe '#database_column_type' do
7
7
  it 'returns `:string`' do
8
- expect(subject.database_column_type).to eql :string
8
+ expect(filter.database_column_type).to be :string
9
9
  end
10
10
  end
11
11
 
12
12
  context 'with an unregistered subclass' do
13
- let(:described_class) { Class.new(ActiveInteraction::Filter) }
13
+ let(:klass) { Class.new(described_class) }
14
14
 
15
15
  describe '.slug' do
16
16
  it 'is nil' do
17
- expect(described_class.slug).to be_nil
17
+ expect(klass.slug).to be_nil
18
18
  end
19
19
  end
20
20
  end
21
21
 
22
22
  context 'with a registered subclass' do
23
- it_behaves_like 'a filter'
24
-
23
+ let(:slug) { SecureRandom.hex.to_sym }
25
24
  let(:described_class) do
26
25
  s = slug
27
26
  Class.new(ActiveInteraction::Filter) do
28
27
  register s
29
28
  end
30
29
  end
31
- let(:slug) { SecureRandom.hex.to_sym }
30
+
31
+ it_behaves_like 'a filter'
32
32
 
33
33
  describe '.slug' do
34
34
  it 'returns the registered slug' do
@@ -3,11 +3,11 @@ require 'spec_helper'
3
3
  describe ActiveInteraction::AbstractDateTimeFilter, :filter do
4
4
  include_context 'filters'
5
5
 
6
- describe '#cast' do
6
+ describe '#process' do
7
7
  let(:value) { nil }
8
8
 
9
9
  it 'raises an error' do
10
- expect { filter.send(:cast, value, nil) }.to raise_error NameError
10
+ expect { filter.process(value, nil) }.to raise_error NameError
11
11
  end
12
12
  end
13
13
  end
@@ -3,11 +3,11 @@ require 'spec_helper'
3
3
  describe ActiveInteraction::AbstractNumericFilter, :filter do
4
4
  include_context 'filters'
5
5
 
6
- describe '#cast' do
6
+ describe '#process' do
7
7
  let(:value) { nil }
8
8
 
9
9
  it 'raises an error' do
10
- expect { filter.send(:cast, value, nil) }.to raise_error NameError
10
+ expect { filter.process(value, nil) }.to raise_error NameError
11
11
  end
12
12
  end
13
13
  end
@@ -25,22 +25,22 @@ describe ActiveInteraction::ArrayFilter, :filter do
25
25
  end
26
26
  end
27
27
 
28
- context 'with a nested default' do
29
- let(:block) { proc { array default: nil } }
30
-
31
- it 'raises an error' do
32
- expect { filter }.to raise_error ActiveInteraction::InvalidDefaultError
33
- end
34
- end
35
-
36
- describe '#cast' do
37
- let(:result) { filter.send(:cast, value, nil) }
28
+ describe '#process' do
29
+ let(:result) { filter.process(value, nil) }
38
30
 
39
31
  context 'with an Array' do
40
32
  let(:value) { [] }
41
33
 
34
+ it 'returns an ArrayInput' do
35
+ expect(result).to be_an_instance_of ActiveInteraction::ArrayInput
36
+ end
37
+
42
38
  it 'returns the Array' do
43
- expect(result).to eql value
39
+ expect(result.value).to eql value
40
+ end
41
+
42
+ it 'has no children' do
43
+ expect(result.children).to eql []
44
44
  end
45
45
  end
46
46
 
@@ -54,7 +54,7 @@ describe ActiveInteraction::ArrayFilter, :filter do
54
54
  end
55
55
 
56
56
  it 'returns the Array' do
57
- expect(result).to eql value.to_ary
57
+ expect(result.value).to eql value.to_ary
58
58
  end
59
59
  end
60
60
 
@@ -62,7 +62,7 @@ describe ActiveInteraction::ArrayFilter, :filter do
62
62
  let(:value) { [[], false, 0.0, {}, 0, '', :''] }
63
63
 
64
64
  it 'returns the Array' do
65
- expect(result).to eql value
65
+ expect(result.value).to eql value
66
66
  end
67
67
  end
68
68
 
@@ -70,10 +70,31 @@ describe ActiveInteraction::ArrayFilter, :filter do
70
70
  let(:block) { proc { array } }
71
71
 
72
72
  context 'with an Array' do
73
- let(:value) { [] }
73
+ let(:child_value) { [] }
74
+ let(:value) { [child_value, child_value] }
74
75
 
75
76
  it 'returns the Array' do
76
- expect(result).to eql value
77
+ expect(result.value).to eql value
78
+ end
79
+
80
+ it 'has children' do
81
+ expect(result.children.size).to be 2
82
+ result.children.each do |child|
83
+ expect(child).to be_an_instance_of ActiveInteraction::ArrayInput
84
+ expect(child.value).to be child_value
85
+ end
86
+ end
87
+
88
+ context 'given a nil value' do
89
+ let(:value) { nil }
90
+
91
+ it 'returns an error' do
92
+ error = result.errors.first
93
+
94
+ expect(result.value).to eql value
95
+ expect(error).to be_an_instance_of ActiveInteraction::Filter::Error
96
+ expect(error.type).to be :missing
97
+ end
77
98
  end
78
99
  end
79
100
 
@@ -81,17 +102,71 @@ describe ActiveInteraction::ArrayFilter, :filter do
81
102
  let(:value) { [[]] }
82
103
 
83
104
  it 'returns the Array' do
84
- expect(result).to eql value
105
+ expect(result.value).to eql value
85
106
  end
86
107
  end
87
108
 
88
109
  context 'with a heterogenous Array' do
89
- let(:value) { [[], false, 0.0, {}, 0, '', :''] }
110
+ let(:value) { [[], false, 0.0] }
90
111
 
91
- it 'raises an error' do
92
- expect do
93
- result
94
- end.to raise_error ActiveInteraction::InvalidValueError
112
+ it 'indicates an error' do
113
+ error = result.errors.first
114
+
115
+ expect(result.errors.size).to be 1
116
+ expect(error).to be_an_instance_of ActiveInteraction::Filter::Error
117
+ expect(error.name).to be filter.name
118
+ expect(error.type).to be :invalid_type
119
+ end
120
+
121
+ context 'when :index_errors is true' do
122
+ before do
123
+ options[:index_errors] = true
124
+ end
125
+
126
+ it 'shows the index of where the error occurred' do
127
+ expect(result.errors.size).to be 2
128
+
129
+ result.errors.each.with_index(1) do |error, i|
130
+ expect(error).to be_an_instance_of ActiveInteraction::Filter::Error
131
+ expect(error.name).to be :"#{filter.name}[#{i}]"
132
+ expect(error.type).to be :invalid_type
133
+ end
134
+ end
135
+ end
136
+
137
+ context 'when ActiveRecord.index_nested_attribute_errors is true' do
138
+ before do
139
+ if ::ActiveRecord.respond_to?(:index_nested_attribute_errors)
140
+ allow(::ActiveRecord).to receive(:index_nested_attribute_errors).and_return(true)
141
+ else
142
+ allow(::ActiveRecord::Base).to receive(:index_nested_attribute_errors).and_return(true)
143
+ end
144
+ end
145
+
146
+ it 'shows the index of where the error occurred' do
147
+ expect(result.errors.size).to be 2
148
+
149
+ result.errors.each.with_index(1) do |error, i|
150
+ expect(error).to be_an_instance_of ActiveInteraction::Filter::Error
151
+ expect(error.name).to be :"#{filter.name}[#{i}]"
152
+ expect(error.type).to be :invalid_type
153
+ end
154
+ end
155
+
156
+ context 'when :index_errors is false' do
157
+ before do
158
+ options[:index_errors] = false
159
+ end
160
+
161
+ it 'does not attach the index' do
162
+ error = result.errors.first
163
+
164
+ expect(result.errors.size).to be 1
165
+ expect(error).to be_an_instance_of ActiveInteraction::Filter::Error
166
+ expect(error.name).to be filter.name
167
+ expect(error.type).to be :invalid_type
168
+ end
169
+ end
95
170
  end
96
171
  end
97
172
  end
@@ -144,9 +219,9 @@ describe ActiveInteraction::ArrayFilter, :filter do
144
219
 
145
220
  it 'has a filter with the right options' do
146
221
  expect(filter.filters[:'0'].options).to have_key(:class)
147
- expect(filter.filters[:'0'].options[:class]).to eql :Object
222
+ expect(filter.filters[:'0'].options[:class]).to be :Object
148
223
  expect(filter.filters[:'0'].options).to have_key(:converter)
149
- expect(filter.filters[:'0'].options[:converter]).to eql :new
224
+ expect(filter.filters[:'0'].options[:converter]).to be :new
150
225
  end
151
226
  end
152
227
  end
@@ -154,7 +229,7 @@ describe ActiveInteraction::ArrayFilter, :filter do
154
229
 
155
230
  describe '#database_column_type' do
156
231
  it 'returns :string' do
157
- expect(filter.database_column_type).to eql :string
232
+ expect(filter.database_column_type).to be :string
158
233
  end
159
234
  end
160
235
  end
@@ -4,11 +4,11 @@ describe ActiveInteraction::BooleanFilter, :filter do
4
4
  include_context 'filters'
5
5
  it_behaves_like 'a filter'
6
6
 
7
- describe '#cast' do
7
+ describe '#process' do
8
8
  context 'falsey' do
9
9
  [false, '0', 'false', 'FALSE', 'off', 'OFF'].each do |value|
10
10
  it "returns false for #{value.inspect}" do
11
- expect(filter.send(:cast, value, nil)).to be_falsey
11
+ expect(filter.process(value, nil).value).to be_falsey
12
12
  end
13
13
  end
14
14
 
@@ -22,7 +22,7 @@ describe ActiveInteraction::BooleanFilter, :filter do
22
22
  end
23
23
 
24
24
  it 'returns false' do
25
- expect(filter.send(:cast, value, nil)).to be_falsey
25
+ expect(filter.process(value, nil).value).to be_falsey
26
26
  end
27
27
  end
28
28
  end
@@ -30,7 +30,7 @@ describe ActiveInteraction::BooleanFilter, :filter do
30
30
  context 'truthy' do
31
31
  [true, '1', 'true', 'TRUE', 'on', 'ON'].each do |value|
32
32
  it "returns true for #{value.inspect}" do
33
- expect(filter.send(:cast, value, nil)).to be_truthy
33
+ expect(filter.process(value, nil).value).to be_truthy
34
34
  end
35
35
  end
36
36
 
@@ -44,7 +44,7 @@ describe ActiveInteraction::BooleanFilter, :filter do
44
44
  end
45
45
 
46
46
  it 'returns true' do
47
- expect(filter.send(:cast, value, nil)).to be_truthy
47
+ expect(filter.process(value, nil).value).to be_truthy
48
48
  end
49
49
  end
50
50
  end
@@ -62,17 +62,18 @@ describe ActiveInteraction::BooleanFilter, :filter do
62
62
  include_context 'optional'
63
63
 
64
64
  it 'returns the default' do
65
- expect(filter.send(:cast, value, nil)).to eql options[:default]
65
+ expect(filter.process(value, nil).value).to eql options[:default]
66
66
  end
67
67
  end
68
68
 
69
69
  context 'required' do
70
70
  include_context 'required'
71
71
 
72
- it 'raises an error' do
73
- expect do
74
- filter.send(:cast, value, nil)
75
- end.to raise_error ActiveInteraction::MissingValueError
72
+ it 'indicates an error' do
73
+ error = filter.process(value, nil).errors.first
74
+
75
+ expect(error).to be_an_instance_of ActiveInteraction::Filter::Error
76
+ expect(error.type).to be :missing
76
77
  end
77
78
  end
78
79
  end
@@ -80,7 +81,7 @@ describe ActiveInteraction::BooleanFilter, :filter do
80
81
 
81
82
  describe '#database_column_type' do
82
83
  it 'returns :boolean' do
83
- expect(filter.database_column_type).to eql :boolean
84
+ expect(filter.database_column_type).to be :boolean
84
85
  end
85
86
  end
86
87
  end
@@ -12,14 +12,14 @@ describe ActiveInteraction::DateFilter, :filter do
12
12
  end
13
13
  end
14
14
 
15
- describe '#cast' do
16
- let(:result) { filter.send(:cast, value, nil) }
15
+ describe '#process' do
16
+ let(:result) { filter.process(value, nil) }
17
17
 
18
18
  context 'with a Date' do
19
19
  let(:value) { Date.new }
20
20
 
21
21
  it 'returns the Date' do
22
- expect(result).to eql value
22
+ expect(result.value).to eql value
23
23
  end
24
24
  end
25
25
 
@@ -27,7 +27,7 @@ describe ActiveInteraction::DateFilter, :filter do
27
27
  let(:value) { '2011-12-13' }
28
28
 
29
29
  it 'returns a Date' do
30
- expect(result).to eql Date.parse(value)
30
+ expect(result.value).to eql Date.parse(value)
31
31
  end
32
32
 
33
33
  context 'with format' do
@@ -36,7 +36,7 @@ describe ActiveInteraction::DateFilter, :filter do
36
36
  let(:value) { '13/12/2011' }
37
37
 
38
38
  it 'returns a Date' do
39
- expect(result).to eql Date.strptime(value, format)
39
+ expect(result.value).to eql Date.strptime(value, format)
40
40
  end
41
41
  end
42
42
  end
@@ -44,19 +44,21 @@ describe ActiveInteraction::DateFilter, :filter do
44
44
  context 'with an invalid String' do
45
45
  let(:value) { 'invalid' }
46
46
 
47
- it 'raises an error' do
48
- expect do
49
- result
50
- end.to raise_error ActiveInteraction::InvalidValueError
47
+ it 'indicates an error' do
48
+ error = result.errors.first
49
+
50
+ expect(error).to be_an_instance_of ActiveInteraction::Filter::Error
51
+ expect(error.type).to be :invalid_type
51
52
  end
52
53
 
53
54
  context 'with format' do
54
55
  include_context 'with format'
55
56
 
56
57
  it 'raises an error' do
57
- expect do
58
- result
59
- end.to raise_error ActiveInteraction::InvalidValueError
58
+ error = result.errors.first
59
+
60
+ expect(error).to be_an_instance_of ActiveInteraction::Filter::Error
61
+ expect(error.type).to be :invalid_type
60
62
  end
61
63
  end
62
64
  end
@@ -71,7 +73,7 @@ describe ActiveInteraction::DateFilter, :filter do
71
73
  end
72
74
 
73
75
  it 'returns a Date' do
74
- expect(result).to eql Date.parse(value)
76
+ expect(result.value).to eql Date.parse(value)
75
77
  end
76
78
  end
77
79
 
@@ -88,17 +90,18 @@ describe ActiveInteraction::DateFilter, :filter do
88
90
  include_context 'optional'
89
91
 
90
92
  it 'returns the default' do
91
- expect(result).to eql options[:default]
93
+ expect(result.value).to eql options[:default]
92
94
  end
93
95
  end
94
96
 
95
97
  context 'required' do
96
98
  include_context 'required'
97
99
 
98
- it 'raises an error' do
99
- expect do
100
- result
101
- end.to raise_error ActiveInteraction::MissingValueError
100
+ it 'indicates an error' do
101
+ error = result.errors.first
102
+
103
+ expect(error).to be_an_instance_of ActiveInteraction::Filter::Error
104
+ expect(error.type).to be :missing
102
105
  end
103
106
  end
104
107
  end
@@ -116,7 +119,7 @@ describe ActiveInteraction::DateFilter, :filter do
116
119
  end
117
120
 
118
121
  it 'returns a Date' do
119
- expect(result).to eql Date.new(year, month, day)
122
+ expect(result.value).to eql Date.new(year, month, day)
120
123
  end
121
124
  end
122
125
 
@@ -124,10 +127,11 @@ describe ActiveInteraction::DateFilter, :filter do
124
127
  context 'empty' do
125
128
  let(:value) { ActiveInteraction::GroupedInput.new }
126
129
 
127
- it 'raises an error' do
128
- expect do
129
- result
130
- end.to raise_error ActiveInteraction::InvalidValueError
130
+ it 'indicates an error' do
131
+ error = result.errors.first
132
+
133
+ expect(error).to be_an_instance_of ActiveInteraction::Filter::Error
134
+ expect(error.type).to be :invalid_type
131
135
  end
132
136
  end
133
137
 
@@ -139,9 +143,10 @@ describe ActiveInteraction::DateFilter, :filter do
139
143
  end
140
144
 
141
145
  it 'raises an error' do
142
- expect do
143
- result
144
- end.to raise_error ActiveInteraction::InvalidValueError
146
+ error = result.errors.first
147
+
148
+ expect(error).to be_an_instance_of ActiveInteraction::Filter::Error
149
+ expect(error.type).to be :invalid_type
145
150
  end
146
151
  end
147
152
  end
@@ -149,7 +154,7 @@ describe ActiveInteraction::DateFilter, :filter do
149
154
 
150
155
  describe '#database_column_type' do
151
156
  it 'returns :date' do
152
- expect(filter.database_column_type).to eql :date
157
+ expect(filter.database_column_type).to be :date
153
158
  end
154
159
  end
155
160