active_interaction 3.8.3 → 4.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 (86) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +157 -0
  3. data/README.md +93 -107
  4. data/lib/active_interaction.rb +1 -7
  5. data/lib/active_interaction/base.rb +23 -26
  6. data/lib/active_interaction/concerns/active_modelable.rb +1 -3
  7. data/lib/active_interaction/concerns/active_recordable.rb +1 -6
  8. data/lib/active_interaction/concerns/hashable.rb +0 -1
  9. data/lib/active_interaction/concerns/missable.rb +0 -1
  10. data/lib/active_interaction/concerns/runnable.rb +6 -12
  11. data/lib/active_interaction/errors.rb +3 -6
  12. data/lib/active_interaction/filter.rb +51 -37
  13. data/lib/active_interaction/filter_column.rb +0 -3
  14. data/lib/active_interaction/filters/abstract_date_time_filter.rb +34 -36
  15. data/lib/active_interaction/filters/abstract_numeric_filter.rb +27 -17
  16. data/lib/active_interaction/filters/array_filter.rb +57 -36
  17. data/lib/active_interaction/filters/boolean_filter.rb +26 -12
  18. data/lib/active_interaction/filters/date_filter.rb +1 -2
  19. data/lib/active_interaction/filters/date_time_filter.rb +1 -2
  20. data/lib/active_interaction/filters/decimal_filter.rb +10 -28
  21. data/lib/active_interaction/filters/file_filter.rb +6 -5
  22. data/lib/active_interaction/filters/float_filter.rb +1 -2
  23. data/lib/active_interaction/filters/hash_filter.rb +37 -27
  24. data/lib/active_interaction/filters/integer_filter.rb +7 -8
  25. data/lib/active_interaction/filters/interface_filter.rb +48 -14
  26. data/lib/active_interaction/filters/object_filter.rb +23 -50
  27. data/lib/active_interaction/filters/record_filter.rb +10 -35
  28. data/lib/active_interaction/filters/string_filter.rb +21 -12
  29. data/lib/active_interaction/filters/symbol_filter.rb +13 -7
  30. data/lib/active_interaction/filters/time_filter.rb +19 -22
  31. data/lib/active_interaction/grouped_input.rb +0 -3
  32. data/lib/active_interaction/inputs.rb +89 -0
  33. data/lib/active_interaction/modules/input_processor.rb +1 -4
  34. data/lib/active_interaction/modules/validation.rb +9 -12
  35. data/lib/active_interaction/version.rb +1 -3
  36. data/spec/active_interaction/base_spec.rb +13 -41
  37. data/spec/active_interaction/concerns/active_modelable_spec.rb +0 -2
  38. data/spec/active_interaction/concerns/active_recordable_spec.rb +0 -2
  39. data/spec/active_interaction/concerns/hashable_spec.rb +1 -3
  40. data/spec/active_interaction/concerns/missable_spec.rb +0 -2
  41. data/spec/active_interaction/concerns/runnable_spec.rb +9 -13
  42. data/spec/active_interaction/errors_spec.rb +4 -25
  43. data/spec/active_interaction/filter_column_spec.rb +0 -2
  44. data/spec/active_interaction/filter_spec.rb +0 -2
  45. data/spec/active_interaction/filters/abstract_date_time_filter_spec.rb +1 -3
  46. data/spec/active_interaction/filters/abstract_numeric_filter_spec.rb +1 -3
  47. data/spec/active_interaction/filters/array_filter_spec.rb +41 -15
  48. data/spec/active_interaction/filters/boolean_filter_spec.rb +58 -4
  49. data/spec/active_interaction/filters/date_filter_spec.rb +43 -3
  50. data/spec/active_interaction/filters/date_time_filter_spec.rb +43 -3
  51. data/spec/active_interaction/filters/decimal_filter_spec.rb +57 -3
  52. data/spec/active_interaction/filters/file_filter_spec.rb +1 -3
  53. data/spec/active_interaction/filters/float_filter_spec.rb +60 -4
  54. data/spec/active_interaction/filters/hash_filter_spec.rb +19 -9
  55. data/spec/active_interaction/filters/integer_filter_spec.rb +49 -7
  56. data/spec/active_interaction/filters/interface_filter_spec.rb +397 -24
  57. data/spec/active_interaction/filters/object_filter_spec.rb +23 -59
  58. data/spec/active_interaction/filters/record_filter_spec.rb +23 -49
  59. data/spec/active_interaction/filters/string_filter_spec.rb +15 -3
  60. data/spec/active_interaction/filters/symbol_filter_spec.rb +15 -3
  61. data/spec/active_interaction/filters/time_filter_spec.rb +65 -3
  62. data/spec/active_interaction/grouped_input_spec.rb +0 -2
  63. data/spec/active_interaction/i18n_spec.rb +3 -7
  64. data/spec/active_interaction/{modules/input_processor_spec.rb → inputs_spec.rb} +3 -5
  65. data/spec/active_interaction/integration/array_interaction_spec.rb +18 -22
  66. data/spec/active_interaction/integration/boolean_interaction_spec.rb +0 -2
  67. data/spec/active_interaction/integration/date_interaction_spec.rb +0 -2
  68. data/spec/active_interaction/integration/date_time_interaction_spec.rb +0 -2
  69. data/spec/active_interaction/integration/file_interaction_spec.rb +0 -2
  70. data/spec/active_interaction/integration/float_interaction_spec.rb +0 -2
  71. data/spec/active_interaction/integration/hash_interaction_spec.rb +0 -2
  72. data/spec/active_interaction/integration/integer_interaction_spec.rb +0 -2
  73. data/spec/active_interaction/integration/interface_interaction_spec.rb +1 -3
  74. data/spec/active_interaction/integration/object_interaction_spec.rb +0 -2
  75. data/spec/active_interaction/integration/string_interaction_spec.rb +0 -2
  76. data/spec/active_interaction/integration/symbol_interaction_spec.rb +0 -2
  77. data/spec/active_interaction/integration/time_interaction_spec.rb +14 -18
  78. data/spec/active_interaction/modules/validation_spec.rb +1 -3
  79. data/spec/spec_helper.rb +2 -6
  80. data/spec/support/concerns.rb +0 -2
  81. data/spec/support/filters.rb +13 -9
  82. data/spec/support/interactions.rb +22 -14
  83. metadata +77 -52
  84. data/lib/active_interaction/backports.rb +0 -59
  85. data/lib/active_interaction/filters/abstract_filter.rb +0 -19
  86. data/spec/active_interaction/filters/abstract_filter_spec.rb +0 -8
@@ -1,5 +1,3 @@
1
- # coding: utf-8
2
-
3
1
  require 'spec_helper'
4
2
 
5
3
  describe ActiveInteraction::FileFilter, :filter do
@@ -7,7 +5,7 @@ describe ActiveInteraction::FileFilter, :filter do
7
5
  it_behaves_like 'a filter'
8
6
 
9
7
  describe '#cast' do
10
- let(:result) { filter.cast(value, nil) }
8
+ let(:result) { filter.send(:cast, value, nil) }
11
9
 
12
10
  context 'with a File' do
13
11
  let(:value) { File.new(__FILE__) }
@@ -1,5 +1,4 @@
1
- # coding: utf-8
2
-
1
+ require 'bigdecimal'
3
2
  require 'spec_helper'
4
3
 
5
4
  describe ActiveInteraction::FloatFilter, :filter do
@@ -7,7 +6,7 @@ describe ActiveInteraction::FloatFilter, :filter do
7
6
  it_behaves_like 'a filter'
8
7
 
9
8
  describe '#cast' do
10
- let(:result) { filter.cast(value, nil) }
9
+ let(:result) { filter.send(:cast, value, nil) }
11
10
 
12
11
  context 'with a Float' do
13
12
  let(:value) { rand }
@@ -17,8 +16,22 @@ describe ActiveInteraction::FloatFilter, :filter do
17
16
  end
18
17
  end
19
18
 
19
+ context 'with an implicit Integer' do
20
+ let(:value) do
21
+ Class.new do
22
+ def to_int
23
+ @to_int ||= rand(1 << 16)
24
+ end
25
+ end.new
26
+ end
27
+
28
+ it 'returns a Float' do
29
+ expect(result).to eql value.to_int.to_f
30
+ end
31
+ end
32
+
20
33
  context 'with a Numeric' do
21
- let(:value) { rand(1 << 16) }
34
+ let(:value) { BigDecimal('1.2') }
22
35
 
23
36
  it 'returns a Float' do
24
37
  expect(result).to eql value.to_f
@@ -42,6 +55,49 @@ describe ActiveInteraction::FloatFilter, :filter do
42
55
  end.to raise_error ActiveInteraction::InvalidValueError
43
56
  end
44
57
  end
58
+
59
+ context 'with an implicit String' do
60
+ let(:value) do
61
+ Class.new do
62
+ def to_str
63
+ '1.1'
64
+ end
65
+ end.new
66
+ end
67
+
68
+ it 'returns a Float' do
69
+ # apparently `Float()` doesn't do this even though `Integer()` does
70
+ expect(result).to eql Float(value.to_str)
71
+ end
72
+ end
73
+
74
+ context 'with a blank String' do
75
+ let(:value) do
76
+ Class.new do
77
+ def to_str
78
+ ' '
79
+ end
80
+ end.new
81
+ end
82
+
83
+ context 'optional' do
84
+ include_context 'optional'
85
+
86
+ it 'returns the default' do
87
+ expect(result).to eql options[:default]
88
+ end
89
+ end
90
+
91
+ context 'required' do
92
+ include_context 'required'
93
+
94
+ it 'raises an error' do
95
+ expect do
96
+ result
97
+ end.to raise_error ActiveInteraction::MissingValueError
98
+ end
99
+ end
100
+ end
45
101
  end
46
102
 
47
103
  describe '#database_column_type' do
@@ -1,5 +1,3 @@
1
- # coding: utf-8
2
-
3
1
  require 'spec_helper'
4
2
 
5
3
  describe ActiveInteraction::HashFilter, :filter do
@@ -15,7 +13,7 @@ describe ActiveInteraction::HashFilter, :filter do
15
13
  end
16
14
 
17
15
  describe '#cast' do
18
- let(:result) { filter.cast(value, nil) }
16
+ let(:result) { filter.send(:cast, value, nil) }
19
17
 
20
18
  context 'with a Hash' do
21
19
  let(:value) { {} }
@@ -25,6 +23,20 @@ describe ActiveInteraction::HashFilter, :filter do
25
23
  end
26
24
  end
27
25
 
26
+ context 'with an implicit Hash' do
27
+ let(:value) do
28
+ Class.new do
29
+ def to_hash
30
+ {}
31
+ end
32
+ end.new
33
+ end
34
+
35
+ it 'returns the Hash' do
36
+ expect(result).to eql value.to_hash
37
+ end
38
+ end
39
+
28
40
  context 'with a non-empty Hash' do
29
41
  let(:value) { { a: {} } }
30
42
 
@@ -66,12 +78,10 @@ describe ActiveInteraction::HashFilter, :filter do
66
78
  end
67
79
 
68
80
  it 'populates the error' do
69
- begin
70
- result
71
- rescue ActiveInteraction::InvalidNestedValueError => e
72
- expect(e.filter_name).to eql k
73
- expect(e.input_value).to eql v
74
- end
81
+ result
82
+ rescue ActiveInteraction::InvalidNestedValueError => e
83
+ expect(e.filter_name).to eql k
84
+ expect(e.input_value).to eql v
75
85
  end
76
86
  end
77
87
  end
@@ -1,5 +1,3 @@
1
- # coding: utf-8
2
-
3
1
  require 'spec_helper'
4
2
 
5
3
  describe ActiveInteraction::IntegerFilter, :filter do
@@ -7,7 +5,7 @@ describe ActiveInteraction::IntegerFilter, :filter do
7
5
  it_behaves_like 'a filter'
8
6
 
9
7
  describe '#cast' do
10
- let(:result) { filter.cast(value, nil) }
8
+ let(:result) { filter.send(:cast, value, nil) }
11
9
 
12
10
  context 'with an Integer' do
13
11
  let(:value) { rand(1 << 16) }
@@ -29,7 +27,7 @@ describe ActiveInteraction::IntegerFilter, :filter do
29
27
  let(:value) { rand(1 << 16).to_s }
30
28
 
31
29
  it 'returns an Integer' do
32
- expect(result).to eql Integer(value)
30
+ expect(result).to eql Integer(value, 10)
33
31
  end
34
32
  end
35
33
 
@@ -43,12 +41,56 @@ describe ActiveInteraction::IntegerFilter, :filter do
43
41
  end
44
42
  end
45
43
 
44
+ context 'with an implicit String' do
45
+ let(:value) do
46
+ Class.new do
47
+ def to_str
48
+ '1'
49
+ end
50
+ end.new
51
+ end
52
+
53
+ it 'returns an Integer' do
54
+ # jRuby freezes on the implicit string value
55
+ expect(result).to eql Integer(value.to_str, 10)
56
+ end
57
+ end
58
+
59
+ context 'with a blank String' do
60
+ let(:value) do
61
+ Class.new do
62
+ def to_str
63
+ ' '
64
+ end
65
+ end.new
66
+ end
67
+
68
+ context 'optional' do
69
+ include_context 'optional'
70
+
71
+ it 'returns the default' do
72
+ expect(result).to eql options[:default]
73
+ end
74
+ end
75
+
76
+ context 'required' do
77
+ include_context 'required'
78
+
79
+ it 'raises an error' do
80
+ expect do
81
+ result
82
+ end.to raise_error ActiveInteraction::MissingValueError
83
+ end
84
+ end
85
+ end
86
+
46
87
  it 'supports different bases' do
47
- expect(filter.cast('07', nil)).to eql 7
88
+ expect(
89
+ described_class.new(name, base: 8).send(:cast, '071', nil)
90
+ ).to eql 57
48
91
  expect do
49
- filter.cast('08', nil)
92
+ described_class.new(name, base: 8).send(:cast, '081', nil)
50
93
  end.to raise_error ActiveInteraction::InvalidValueError
51
- expect(described_class.new(name, base: 10).cast('08', nil)).to eql 8
52
94
  end
53
95
  end
54
96
 
@@ -1,47 +1,420 @@
1
- # coding: utf-8
2
-
3
1
  require 'spec_helper'
4
- require 'json'
5
- require 'yaml'
2
+
3
+ module InterfaceModule; end
4
+
5
+ class InterfaceClass; end # rubocop:disable Lint/EmptyClass
6
6
 
7
7
  describe ActiveInteraction::InterfaceFilter, :filter do
8
8
  include_context 'filters'
9
- it_behaves_like 'a filter'
10
-
11
- before { options[:methods] = %i[dump load] }
9
+ it_behaves_like 'a filter' do
10
+ let(:name) { :interface_module }
11
+ end
12
12
 
13
13
  describe '#cast' do
14
- let(:result) { filter.cast(value, nil) }
14
+ let(:result) { filter.send(:cast, value, nil) }
15
15
 
16
- context 'with a BasicObject' do
17
- let(:value) { BasicObject.new }
16
+ context 'with an implicit constant name' do
17
+ context 'passed an instance' do
18
+ context 'with the module included' do
19
+ let(:name) { :interface_module }
20
+ let(:value) do
21
+ Class.new do
22
+ include InterfaceModule
23
+ end.new
24
+ end
18
25
 
19
- it 'raises an error' do
20
- expect { result }.to raise_error ActiveInteraction::InvalidValueError
26
+ it 'returns a the value' do
27
+ expect(result).to eql value
28
+ end
29
+ end
30
+
31
+ context 'with the class inherited from' do
32
+ let(:name) { :interface_class }
33
+ let(:value) do
34
+ Class.new(InterfaceClass) {}.new # rubocop:disable Lint/EmptyBlock
35
+ end
36
+
37
+ it 'returns a the value' do
38
+ expect(result).to eql value
39
+ end
40
+ end
41
+
42
+ context 'that is extended by the ancestor' do
43
+ let(:name) { :interface_module }
44
+ let(:value) do
45
+ Class.new {}.new.extend(InterfaceModule) # rubocop:disable Lint/EmptyBlock
46
+ end
47
+
48
+ it 'returns a the value' do
49
+ expect(result).to eql value
50
+ end
51
+ end
52
+
53
+ context 'that does not match' do
54
+ let(:name) { :interface_module }
55
+ let(:value) { Class.new }
56
+
57
+ it 'raises an error' do
58
+ expect do
59
+ result
60
+ end.to raise_error ActiveInteraction::InvalidValueError
61
+ end
62
+ end
63
+
64
+ context 'with the class itself' do
65
+ let(:name) { :interface_class }
66
+ let(:value) do
67
+ InterfaceClass.new
68
+ end
69
+
70
+ it 'raises an error' do
71
+ expect do
72
+ result
73
+ end.to raise_error ActiveInteraction::InvalidValueError
74
+ end
75
+ end
76
+ end
77
+
78
+ context 'passed a class' do
79
+ context 'with the class inherited from' do
80
+ let(:name) { :interface_class }
81
+ let(:value) do
82
+ Class.new(InterfaceClass) {} # rubocop:disable Lint/EmptyBlock
83
+ end
84
+
85
+ it 'returns a the value' do
86
+ expect(result).to eql value
87
+ end
88
+ end
89
+
90
+ context 'that is extended by the ancestor' do
91
+ let(:name) { :interface_module }
92
+ let(:value) do
93
+ Class.new do
94
+ extend InterfaceModule
95
+ end
96
+ end
97
+
98
+ it 'returns a the value' do
99
+ expect(result).to eql value
100
+ end
101
+ end
102
+
103
+ context 'that does not match' do
104
+ let(:name) { :interface_class }
105
+ let(:value) { Class }
106
+
107
+ it 'raises an error' do
108
+ expect do
109
+ result
110
+ end.to raise_error ActiveInteraction::InvalidValueError
111
+ end
112
+ end
113
+
114
+ context 'with the class itself' do
115
+ let(:name) { :interface_class }
116
+ let(:value) { InterfaceClass }
117
+
118
+ it 'raises an error' do
119
+ expect do
120
+ result
121
+ end.to raise_error ActiveInteraction::InvalidValueError
122
+ end
123
+ end
124
+ end
125
+
126
+ context 'passed a module' do
127
+ context 'that is extended by the ancestor' do
128
+ let(:name) { :interface_module }
129
+ let(:value) do
130
+ Module.new do
131
+ extend InterfaceModule
132
+ end
133
+ end
134
+
135
+ it 'returns a the value' do
136
+ expect(result).to eql value
137
+ end
138
+ end
139
+
140
+ context 'that does not match' do
141
+ let(:name) { :interface_module }
142
+ let(:value) { Module.new }
143
+
144
+ it 'raises an error' do
145
+ expect do
146
+ result
147
+ end.to raise_error ActiveInteraction::InvalidValueError
148
+ end
149
+ end
150
+
151
+ context 'with the module itself' do
152
+ let(:name) { :interface_module }
153
+ let(:value) { InterfaceModule }
154
+
155
+ it 'raises an error' do
156
+ expect do
157
+ result
158
+ end.to raise_error ActiveInteraction::InvalidValueError
159
+ end
160
+ end
161
+ end
162
+
163
+ context 'given an invalid name' do
164
+ let(:name) { :invalid }
165
+ let(:value) { Object }
166
+
167
+ it 'raises an error' do
168
+ expect do
169
+ result
170
+ end.to raise_error ActiveInteraction::InvalidNameError
171
+ end
21
172
  end
22
173
  end
23
174
 
24
- context 'with an Object' do
25
- let(:value) { Object.new }
175
+ context 'with a constant given' do
176
+ context 'passed an instance' do
177
+ context 'with the module included' do
178
+ before { options.merge!(from: :interface_module) }
179
+ let(:value) do
180
+ Class.new do
181
+ include InterfaceModule
182
+ end.new
183
+ end
26
184
 
27
- it 'raises an error' do
28
- expect { result }.to raise_error ActiveInteraction::InvalidValueError
185
+ it 'returns a the value' do
186
+ expect(result).to eql value
187
+ end
188
+ end
189
+
190
+ context 'with the class inherited from' do
191
+ before { options.merge!(from: :interface_class) }
192
+ let(:value) do
193
+ Class.new(InterfaceClass) {}.new # rubocop:disable Lint/EmptyBlock
194
+ end
195
+
196
+ it 'returns a the value' do
197
+ expect(result).to eql value
198
+ end
199
+ end
200
+
201
+ context 'that is extended by the ancestor' do
202
+ before { options.merge!(from: :interface_module) }
203
+ let(:value) do
204
+ Class.new {}.new.extend(InterfaceModule) # rubocop:disable Lint/EmptyBlock
205
+ end
206
+
207
+ it 'returns a the value' do
208
+ expect(result).to eql value
209
+ end
210
+ end
211
+
212
+ context 'that does not match' do
213
+ let(:name) { :interface_class }
214
+ let(:value) { Class.new }
215
+
216
+ it 'raises an error' do
217
+ expect do
218
+ result
219
+ end.to raise_error ActiveInteraction::InvalidValueError
220
+ end
221
+ end
222
+
223
+ context 'with the class itself' do
224
+ let(:name) { :interface_class }
225
+ let(:value) { InterfaceClass.new }
226
+
227
+ it 'raises an error' do
228
+ expect do
229
+ result
230
+ end.to raise_error ActiveInteraction::InvalidValueError
231
+ end
232
+ end
233
+ end
234
+
235
+ context 'passed a class' do
236
+ context 'with the class inherited from' do
237
+ before { options.merge!(from: :interface_class) }
238
+ let(:value) do
239
+ Class.new(InterfaceClass) {} # rubocop:disable Lint/EmptyBlock
240
+ end
241
+
242
+ it 'returns a the value' do
243
+ expect(result).to eql value
244
+ end
245
+ end
246
+
247
+ context 'that is extended by the ancestor' do
248
+ before { options.merge!(from: :interface_module) }
249
+ let(:value) do
250
+ Class.new do
251
+ extend InterfaceModule
252
+ end
253
+ end
254
+
255
+ it 'returns a the value' do
256
+ expect(result).to eql value
257
+ end
258
+ end
259
+
260
+ context 'that does not match' do
261
+ let(:name) { :interface_class }
262
+ let(:value) { Class }
263
+
264
+ it 'raises an error' do
265
+ expect do
266
+ result
267
+ end.to raise_error ActiveInteraction::InvalidValueError
268
+ end
269
+ end
270
+
271
+ context 'with the class itself' do
272
+ let(:name) { :interface_class }
273
+ let(:value) { InterfaceClass }
274
+
275
+ it 'raises an error' do
276
+ expect do
277
+ result
278
+ end.to raise_error ActiveInteraction::InvalidValueError
279
+ end
280
+ end
281
+ end
282
+
283
+ context 'passed a module' do
284
+ context 'that is extended by the ancestor' do
285
+ before { options.merge!(from: :interface_module) }
286
+ let(:value) do
287
+ Module.new do
288
+ extend InterfaceModule
289
+ end
290
+ end
291
+
292
+ it 'returns a the value' do
293
+ expect(result).to eql value
294
+ end
295
+ end
296
+
297
+ context 'that does not match' do
298
+ let(:name) { :interface_module }
299
+ let(:value) { Module.new }
300
+
301
+ it 'raises an error' do
302
+ expect do
303
+ result
304
+ end.to raise_error ActiveInteraction::InvalidValueError
305
+ end
306
+ end
307
+
308
+ context 'with the module itself' do
309
+ let(:name) { :interface_module }
310
+ let(:value) { InterfaceModule }
311
+
312
+ it 'raises an error' do
313
+ expect do
314
+ result
315
+ end.to raise_error ActiveInteraction::InvalidValueError
316
+ end
317
+ end
318
+ end
319
+
320
+ context 'given an invalid name' do
321
+ before { options.merge!(from: :invalid) }
322
+ let(:value) { Object }
323
+
324
+ it 'raises an error' do
325
+ expect do
326
+ result
327
+ end.to raise_error ActiveInteraction::InvalidNameError
328
+ end
29
329
  end
30
330
  end
31
331
 
32
- context 'with JSON' do
33
- let(:value) { JSON }
332
+ context 'with methods passed' do
333
+ before { options[:methods] = %i[dump load] }
334
+
335
+ context 'passed an valid instance' do
336
+ let(:value) do
337
+ Class.new do
338
+ def dump; end
34
339
 
35
- it 'returns an Array' do
36
- expect(result).to eql value
340
+ def load; end
341
+ end.new
342
+ end
343
+
344
+ it 'returns a the value' do
345
+ expect(result).to eql value
346
+ end
347
+ end
348
+
349
+ context 'passed an invalid instance' do
350
+ let(:value) { Class.new }
351
+
352
+ it 'raises an error' do
353
+ expect do
354
+ result
355
+ end.to raise_error ActiveInteraction::InvalidValueError
356
+ end
357
+ end
358
+
359
+ context 'passed a class' do
360
+ let(:value) do
361
+ Class.new do
362
+ def self.dump; end
363
+
364
+ def self.load; end
365
+ end
366
+ end
367
+
368
+ it 'returns a the value' do
369
+ expect(result).to eql value
370
+ end
371
+ end
372
+
373
+ context 'passed an invalid class' do
374
+ let(:value) { Class }
375
+
376
+ it 'raises an error' do
377
+ expect do
378
+ result
379
+ end.to raise_error ActiveInteraction::InvalidValueError
380
+ end
381
+ end
382
+
383
+ context 'passed a module' do
384
+ let(:value) do
385
+ Module.new do
386
+ def self.dump; end
387
+
388
+ def self.load; end
389
+ end
390
+ end
391
+
392
+ it 'returns a the value' do
393
+ expect(result).to eql value
394
+ end
395
+ end
396
+
397
+ context 'passed an invalid module' do
398
+ let(:value) { Module.new }
399
+
400
+ it 'raises an error' do
401
+ expect do
402
+ result
403
+ end.to raise_error ActiveInteraction::InvalidValueError
404
+ end
37
405
  end
38
406
  end
39
407
 
40
- context 'with YAML' do
41
- let(:value) { YAML }
408
+ context 'with from and methods passed' do
409
+ before do
410
+ options[:from] = :module
411
+ options[:methods] = %i[dump load]
412
+ end
42
413
 
43
- it 'returns an Hash' do
44
- expect(result).to eql value
414
+ it 'raises an error' do
415
+ expect do
416
+ filter
417
+ end.to raise_error ActiveInteraction::InvalidFilterError
45
418
  end
46
419
  end
47
420
  end