active_interaction 4.0.6 → 5.1.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 (79) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +156 -7
  3. data/CONTRIBUTING.md +11 -3
  4. data/README.md +260 -219
  5. data/lib/active_interaction/array_input.rb +77 -0
  6. data/lib/active_interaction/base.rb +14 -98
  7. data/lib/active_interaction/concerns/active_recordable.rb +3 -3
  8. data/lib/active_interaction/concerns/missable.rb +2 -2
  9. data/lib/active_interaction/errors.rb +6 -88
  10. data/lib/active_interaction/exceptions.rb +47 -0
  11. data/lib/active_interaction/filter/column.rb +59 -0
  12. data/lib/active_interaction/filter/error.rb +40 -0
  13. data/lib/active_interaction/filter.rb +44 -53
  14. data/lib/active_interaction/filters/abstract_date_time_filter.rb +9 -6
  15. data/lib/active_interaction/filters/abstract_numeric_filter.rb +7 -3
  16. data/lib/active_interaction/filters/array_filter.rb +40 -6
  17. data/lib/active_interaction/filters/boolean_filter.rb +4 -3
  18. data/lib/active_interaction/filters/date_filter.rb +1 -1
  19. data/lib/active_interaction/filters/date_time_filter.rb +1 -1
  20. data/lib/active_interaction/filters/decimal_filter.rb +1 -1
  21. data/lib/active_interaction/filters/float_filter.rb +1 -1
  22. data/lib/active_interaction/filters/hash_filter.rb +23 -15
  23. data/lib/active_interaction/filters/integer_filter.rb +1 -1
  24. data/lib/active_interaction/filters/interface_filter.rb +12 -12
  25. data/lib/active_interaction/filters/object_filter.rb +9 -3
  26. data/lib/active_interaction/filters/record_filter.rb +21 -11
  27. data/lib/active_interaction/filters/string_filter.rb +1 -1
  28. data/lib/active_interaction/filters/symbol_filter.rb +1 -1
  29. data/lib/active_interaction/filters/time_filter.rb +4 -4
  30. data/lib/active_interaction/hash_input.rb +43 -0
  31. data/lib/active_interaction/input.rb +23 -0
  32. data/lib/active_interaction/inputs.rb +161 -46
  33. data/lib/active_interaction/locale/en.yml +0 -1
  34. data/lib/active_interaction/locale/fr.yml +0 -1
  35. data/lib/active_interaction/locale/it.yml +0 -1
  36. data/lib/active_interaction/locale/ja.yml +0 -1
  37. data/lib/active_interaction/locale/pt-BR.yml +0 -1
  38. data/lib/active_interaction/modules/validation.rb +6 -17
  39. data/lib/active_interaction/version.rb +1 -1
  40. data/lib/active_interaction.rb +41 -36
  41. data/spec/active_interaction/array_input_spec.rb +166 -0
  42. data/spec/active_interaction/base_spec.rb +34 -248
  43. data/spec/active_interaction/concerns/active_modelable_spec.rb +3 -3
  44. data/spec/active_interaction/concerns/active_recordable_spec.rb +7 -7
  45. data/spec/active_interaction/concerns/hashable_spec.rb +8 -8
  46. data/spec/active_interaction/concerns/missable_spec.rb +9 -9
  47. data/spec/active_interaction/concerns/runnable_spec.rb +34 -32
  48. data/spec/active_interaction/errors_spec.rb +60 -43
  49. data/spec/active_interaction/{filter_column_spec.rb → filter/column_spec.rb} +3 -10
  50. data/spec/active_interaction/filter_spec.rb +6 -6
  51. data/spec/active_interaction/filters/abstract_date_time_filter_spec.rb +2 -2
  52. data/spec/active_interaction/filters/abstract_numeric_filter_spec.rb +2 -2
  53. data/spec/active_interaction/filters/array_filter_spec.rb +109 -16
  54. data/spec/active_interaction/filters/boolean_filter_spec.rb +12 -11
  55. data/spec/active_interaction/filters/date_filter_spec.rb +32 -27
  56. data/spec/active_interaction/filters/date_time_filter_spec.rb +34 -29
  57. data/spec/active_interaction/filters/decimal_filter_spec.rb +20 -18
  58. data/spec/active_interaction/filters/file_filter_spec.rb +7 -7
  59. data/spec/active_interaction/filters/float_filter_spec.rb +19 -17
  60. data/spec/active_interaction/filters/hash_filter_spec.rb +16 -18
  61. data/spec/active_interaction/filters/integer_filter_spec.rb +24 -22
  62. data/spec/active_interaction/filters/interface_filter_spec.rb +105 -82
  63. data/spec/active_interaction/filters/object_filter_spec.rb +52 -36
  64. data/spec/active_interaction/filters/record_filter_spec.rb +61 -39
  65. data/spec/active_interaction/filters/string_filter_spec.rb +7 -7
  66. data/spec/active_interaction/filters/symbol_filter_spec.rb +6 -6
  67. data/spec/active_interaction/filters/time_filter_spec.rb +57 -34
  68. data/spec/active_interaction/hash_input_spec.rb +58 -0
  69. data/spec/active_interaction/i18n_spec.rb +22 -17
  70. data/spec/active_interaction/inputs_spec.rb +170 -18
  71. data/spec/active_interaction/integration/array_interaction_spec.rb +3 -7
  72. data/spec/active_interaction/integration/record_integration_spec.rb +5 -0
  73. data/spec/active_interaction/modules/validation_spec.rb +8 -31
  74. data/spec/spec_helper.rb +9 -0
  75. data/spec/support/concerns.rb +2 -2
  76. data/spec/support/filters.rb +27 -51
  77. data/spec/support/interactions.rb +4 -4
  78. metadata +50 -50
  79. data/lib/active_interaction/filter_column.rb +0 -57
@@ -1,11 +1,14 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ActiveInteraction::Inputs do
4
- subject(:inputs) { described_class.new }
4
+ subject(:inputs) { described_class.new(args, base_class.new) }
5
+
6
+ let(:args) { {} }
7
+ let(:base_class) { ActiveInteraction::Base }
5
8
 
6
9
  describe '.reserved?(name)' do
7
10
  it 'returns true for anything starting with "_interaction_"' do
8
- expect(described_class.reserved?('_interaction_')).to be_truthy
11
+ expect(described_class).to be_reserved('_interaction_')
9
12
  end
10
13
 
11
14
  it 'returns true for existing instance methods' do
@@ -13,21 +16,20 @@ describe ActiveInteraction::Inputs do
13
16
  (ActiveInteraction::Base.instance_methods - Object.instance_methods) +
14
17
  (ActiveInteraction::Base.private_instance_methods - Object.private_instance_methods)
15
18
  ).each do |method|
16
- expect(described_class.reserved?(method)).to be_truthy
19
+ expect(described_class).to be_reserved(method)
17
20
  end
18
21
  end
19
22
 
20
23
  it 'returns false for anything else' do
21
- expect(described_class.reserved?(SecureRandom.hex)).to be_falsey
24
+ expect(described_class).to_not be_reserved(SecureRandom.hex)
22
25
  end
23
26
  end
24
27
 
25
- describe '.process(inputs)' do
26
- let(:inputs) { {} }
27
- let(:result) { described_class.process(inputs) }
28
+ describe '#normalized' do
29
+ let(:result) { inputs.normalized }
28
30
 
29
31
  context 'with invalid inputs' do
30
- let(:inputs) { nil }
32
+ let(:args) { nil }
31
33
 
32
34
  it 'raises an error' do
33
35
  expect { result }.to raise_error ArgumentError
@@ -35,23 +37,23 @@ describe ActiveInteraction::Inputs do
35
37
  end
36
38
 
37
39
  context 'with non-hash inputs' do
38
- let(:inputs) { [%i[k v]] }
40
+ let(:args) { [%i[k v]] }
39
41
 
40
42
  it 'raises an error' do
41
43
  expect { result }.to raise_error ArgumentError
42
44
  end
43
45
  end
44
46
 
45
- context 'with ActionController::Parameters inputs' do
46
- let(:inputs) { ActionController::Parameters.new }
47
+ context 'with ActiveInteraction::Inputs inputs' do
48
+ let(:args) { described_class.new({ key: :value }, base_class.new) }
47
49
 
48
50
  it 'does not raise an error' do
49
51
  expect { result }.to_not raise_error
50
52
  end
51
53
  end
52
54
 
53
- context 'with Inputs inputs' do
54
- let(:inputs) { ActiveInteraction::Inputs.new }
55
+ context 'with ActionController::Parameters inputs' do
56
+ let(:args) { ::ActionController::Parameters.new }
55
57
 
56
58
  it 'does not raise an error' do
57
59
  expect { result }.to_not raise_error
@@ -59,17 +61,17 @@ describe ActiveInteraction::Inputs do
59
61
  end
60
62
 
61
63
  context 'with simple inputs' do
62
- before { inputs[:key] = :value }
64
+ before { args[:key] = :value }
63
65
 
64
66
  it 'sends them straight through' do
65
- expect(result).to eql inputs
67
+ expect(result).to eql args
66
68
  end
67
69
  end
68
70
 
69
71
  context 'with groupable inputs' do
70
72
  context 'without a matching simple input' do
71
73
  before do
72
- inputs.merge!(
74
+ args.merge!(
73
75
  'key(1i)' => :value1,
74
76
  'key(2i)' => :value2
75
77
  )
@@ -87,7 +89,7 @@ describe ActiveInteraction::Inputs do
87
89
 
88
90
  context 'with a matching simple input' do
89
91
  before do
90
- inputs.merge!(
92
+ args.merge!(
91
93
  'key(1i)' => :value1,
92
94
  key: :value2
93
95
  )
@@ -104,11 +106,161 @@ describe ActiveInteraction::Inputs do
104
106
  end
105
107
 
106
108
  context 'with a reserved name' do
107
- before { inputs[:_interaction_key] = :value }
109
+ before { args[:_interaction_key] = :value }
108
110
 
109
111
  it 'skips the input' do
110
112
  expect(result).to_not have_key(:_interaction_key)
111
113
  end
112
114
  end
113
115
  end
116
+
117
+ describe '#given?' do
118
+ let(:base_class) do
119
+ Class.new(ActiveInteraction::Base) do
120
+ float :x,
121
+ default: nil
122
+
123
+ def execute; end
124
+ end
125
+ end
126
+
127
+ it 'is false when the input is not given' do
128
+ expect(inputs.given?(:x)).to be false
129
+ end
130
+
131
+ it 'is true when the input is nil' do
132
+ args[:x] = nil
133
+ expect(inputs.given?(:x)).to be true
134
+ end
135
+
136
+ it 'is true when the input is given' do
137
+ args[:x] = rand
138
+ expect(inputs.given?(:x)).to be true
139
+ end
140
+
141
+ it 'symbolizes its argument' do
142
+ args[:x] = rand
143
+ expect(inputs.given?('x')).to be true
144
+ end
145
+
146
+ it 'only tracks inputs with filters' do
147
+ args[:y] = rand
148
+ expect(inputs.given?(:y)).to be false
149
+ end
150
+
151
+ context 'nested hash values' do
152
+ let(:base_class) do
153
+ Class.new(ActiveInteraction::Base) do
154
+ hash :x, default: {} do
155
+ boolean :y,
156
+ default: true
157
+ end
158
+
159
+ def execute; end
160
+ end
161
+ end
162
+
163
+ it 'is true when the nested inputs symbols are given' do
164
+ described_class.class_exec do
165
+ def execute
166
+ given?(:x, :y)
167
+ end
168
+ end
169
+
170
+ args[:x] = { y: false }
171
+ expect(inputs.given?(:x, :y)).to be true
172
+ end
173
+
174
+ it 'is true when the nested inputs strings are given' do
175
+ args['x'] = { 'y' => false }
176
+ expect(inputs.given?(:x, :y)).to be true
177
+ end
178
+
179
+ it 'is false when the nested input is not given' do
180
+ args[:x] = {}
181
+ expect(inputs.given?(:x, :y)).to be false
182
+ end
183
+
184
+ it 'is false when the first input is not given' do
185
+ expect(inputs.given?(:x, :y)).to be false
186
+ end
187
+
188
+ it 'is false when the first input is nil' do
189
+ args[:x] = nil
190
+ expect(inputs.given?(:x, :y)).to be false
191
+ end
192
+
193
+ it 'returns false if you go too far' do
194
+ args[:x] = { y: true }
195
+ expect(inputs.given?(:x, :y, :z)).to be false
196
+ end
197
+ end
198
+
199
+ context 'nested array values' do
200
+ let(:base_class) do
201
+ Class.new(ActiveInteraction::Base) do
202
+ array :x do
203
+ hash do
204
+ boolean :y, default: true
205
+ end
206
+ end
207
+
208
+ def execute; end
209
+ end
210
+ end
211
+
212
+ context 'has a positive index' do
213
+ it 'returns true if found' do
214
+ args[:x] = [{ y: true }]
215
+ expect(inputs.given?(:x, 0, :y)).to be true
216
+ end
217
+
218
+ it 'returns false if not found' do
219
+ args[:x] = []
220
+ expect(inputs.given?(:x, 0, :y)).to be false
221
+ end
222
+ end
223
+
224
+ context 'has a negative index' do
225
+ it 'returns true if found' do
226
+ args[:x] = [{ y: true }]
227
+ expect(inputs.given?(:x, -1, :y)).to be true
228
+ end
229
+
230
+ it 'returns false if not found' do
231
+ args[:x] = []
232
+ expect(inputs.given?(:x, -1, :y)).to be false
233
+ end
234
+ end
235
+
236
+ it 'returns false if you go too far' do
237
+ args[:x] = [{}]
238
+ expect(inputs.given?(:x, 10, :y)).to be false
239
+ end
240
+ end
241
+
242
+ context 'multi-part date values' do
243
+ let(:base_class) do
244
+ Class.new(ActiveInteraction::Base) do
245
+ date :thing,
246
+ default: nil
247
+
248
+ def execute; end
249
+ end
250
+ end
251
+
252
+ it 'returns true when the input is given' do
253
+ args.merge!(
254
+ 'thing(1i)' => '2020',
255
+ 'thing(2i)' => '12',
256
+ 'thing(3i)' => '31'
257
+ )
258
+ expect(inputs.given?(:thing)).to be true
259
+ end
260
+
261
+ it 'returns false if not found' do
262
+ expect(inputs.given?(:thing)).to be false
263
+ end
264
+ end
265
+ end
114
266
  end
@@ -1,10 +1,6 @@
1
1
  require 'spec_helper'
2
2
  require 'active_record'
3
- if defined?(JRUBY_VERSION)
4
- require 'activerecord-jdbcsqlite3-adapter'
5
- else
6
- require 'sqlite3'
7
- end
3
+ require 'sqlite3'
8
4
 
9
5
  ActiveRecord::Base.establish_connection(
10
6
  adapter: 'sqlite3',
@@ -36,8 +32,8 @@ end
36
32
  describe ArrayInteraction do
37
33
  include_context 'interactions'
38
34
  it_behaves_like 'an interaction', :array, -> { [] }
39
- it_behaves_like 'an interaction', :array, -> { Element.where('1 = 1') }
40
- it_behaves_like 'an interaction', :array, -> { List.create!.elements }
35
+ it_behaves_like 'an interaction', :array, -> { Element.where('1 = 1') }, ->(result) { result.to_a }
36
+ it_behaves_like 'an interaction', :array, -> { List.create!.elements }, ->(result) { result.to_a }
41
37
 
42
38
  context 'with inputs[:a]' do
43
39
  let(:a) { [[]] }
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'RecordIntegration' do
4
+ it_behaves_like 'an interaction', :record, -> { Encoding::US_ASCII }, class: Encoding
5
+ end
@@ -22,11 +22,11 @@ describe ActiveInteraction::Validation do
22
22
  end
23
23
  end
24
24
 
25
- context 'filter.cast returns a value' do
25
+ context 'filter returns no errors' do
26
26
  let(:inputs) { { name: 1 } }
27
27
 
28
28
  before do
29
- allow(filter).to receive(:cast).and_return(1)
29
+ allow(filter).to receive(:process).and_return(ActiveInteraction::Input.new(filter, value: 1))
30
30
  end
31
31
 
32
32
  it 'returns no errors' do
@@ -34,14 +34,15 @@ describe ActiveInteraction::Validation do
34
34
  end
35
35
  end
36
36
 
37
- context 'filter throws' do
37
+ context 'filter returns with errors' do
38
38
  before do
39
- allow(filter).to receive(:cast).and_raise(exception)
39
+ allow(filter).to receive(:process).and_return(ActiveInteraction::Input.new(filter, error: exception))
40
40
  end
41
41
 
42
- context 'InvalidValueError' do
43
- let(:exception) { ActiveInteraction::InvalidValueError }
44
- let(:filter) { ActiveInteraction::FloatFilter.new(:name, {}) }
42
+ context 'Filter::Error' do
43
+ let(:filter) { ActiveInteraction::ArrayFilter.new(:name, [1.0, 'a']) { float } }
44
+
45
+ let(:exception) { ActiveInteraction::Filter::Error.new(filter, :invalid_type) }
45
46
 
46
47
  it 'returns an :invalid_type error' do
47
48
  type = I18n.translate(
@@ -51,30 +52,6 @@ describe ActiveInteraction::Validation do
51
52
  expect(result).to eql [[filter.name, :invalid_type, { type: type }]]
52
53
  end
53
54
  end
54
-
55
- context 'MissingValueError' do
56
- let(:exception) { ActiveInteraction::MissingValueError }
57
-
58
- it 'returns a :missing error' do
59
- expect(result).to eql [[filter.name, :missing]]
60
- end
61
- end
62
-
63
- context 'InvalidNestedValueError' do
64
- let(:exception) do
65
- ActiveInteraction::InvalidNestedValueError.new(name, value)
66
- end
67
- let(:name) { SecureRandom.hex.to_sym }
68
- let(:value) { double }
69
-
70
- it 'returns an :invalid_nested error' do
71
- expect(result).to eql [[
72
- filter.name,
73
- :invalid_nested,
74
- { name: name.inspect, value: value.inspect }
75
- ]]
76
- end
77
- end
78
55
  end
79
56
  end
80
57
  end
data/spec/spec_helper.rb CHANGED
@@ -2,10 +2,19 @@ require 'i18n'
2
2
  I18n.config.enforce_available_locales = true if I18n.config.respond_to?(:enforce_available_locales)
3
3
 
4
4
  require 'active_interaction'
5
+ require 'active_record'
5
6
 
6
7
  Dir['./spec/support/**/*.rb'].sort.each { |f| require f }
7
8
 
8
9
  RSpec.configure do |config|
9
10
  config.run_all_when_everything_filtered = true
10
11
  config.filter_run_including :focus
12
+
13
+ config.before(:suite) do
14
+ if ActiveRecord.respond_to?(:index_nested_attribute_errors)
15
+ ActiveRecord.index_nested_attribute_errors = false
16
+ else
17
+ ActiveRecord::Base.index_nested_attribute_errors = false
18
+ end
19
+ end
11
20
  end
@@ -1,4 +1,6 @@
1
1
  shared_context 'concerns' do |concern|
2
+ subject(:instance) { klass.new }
3
+
2
4
  let(:klass) do
3
5
  Class.new do
4
6
  include concern
@@ -8,6 +10,4 @@ shared_context 'concerns' do |concern|
8
10
  end
9
11
  end
10
12
  end
11
-
12
- subject(:instance) { klass.new }
13
13
  end
@@ -1,10 +1,10 @@
1
1
  shared_context 'filters' do
2
+ subject(:filter) { described_class.new(name, options, &block) }
3
+
2
4
  let(:block) { nil }
3
5
  let(:name) { SecureRandom.hex.to_sym }
4
6
  let(:options) { {} }
5
7
 
6
- subject(:filter) { described_class.new(name, options, &block) }
7
-
8
8
  shared_context 'optional' do
9
9
  before do
10
10
  options[:default] = nil
@@ -45,71 +45,35 @@ shared_examples_for 'a filter' do
45
45
  end
46
46
  end
47
47
 
48
- describe '#cast' do
49
- let(:value) { nil }
50
- let(:result) { filter.send(:cast, value, nil) }
51
-
52
- context 'optional' do
53
- include_context 'optional'
54
-
55
- it 'returns nil' do
56
- expect(result).to be_nil
57
- end
58
- end
59
-
60
- context 'required' do
61
- include_context 'required'
62
-
63
- it 'raises an error' do
64
- expect { result }.to raise_error ActiveInteraction::MissingValueError
65
- end
66
-
67
- context 'with an invalid default' do
68
- let(:value) { Object.new }
69
-
70
- it 'raises an error' do
71
- expect { result }.to raise_error ActiveInteraction::InvalidValueError
72
- end
73
- end
74
- end
75
-
76
- # BasicObject is missing a lot of methods
77
- context 'with a BasicObject' do
78
- let(:value) { BasicObject.new }
79
-
80
- it 'raises an error' do
81
- expect { result }.to raise_error ActiveInteraction::InvalidValueError
82
- end
83
- end
84
- end
85
-
86
- describe '#clean' do
48
+ describe '#process' do
87
49
  let(:value) { nil }
88
50
 
89
51
  context 'optional' do
90
52
  include_context 'optional'
91
53
 
92
54
  it 'returns the default' do
93
- expect(filter.clean(value, nil)).to eql options[:default]
55
+ expect(filter.process(value, nil).value).to eql options[:default]
94
56
  end
95
57
  end
96
58
 
97
59
  context 'required' do
98
60
  include_context 'required'
99
61
 
100
- it 'raises an error' do
101
- expect do
102
- filter.clean(value, nil)
103
- end.to raise_error ActiveInteraction::MissingValueError
62
+ it 'indicates an error' do
63
+ error = filter.process(value, nil).errors.first
64
+
65
+ expect(error).to be_an_instance_of ActiveInteraction::Filter::Error
66
+ expect(error.type).to be :missing
104
67
  end
105
68
 
106
69
  context 'with an invalid value' do
107
70
  let(:value) { Object.new }
108
71
 
109
- it 'raises an error' do
110
- expect do
111
- filter.clean(value, nil)
112
- end.to raise_error ActiveInteraction::InvalidValueError
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 :invalid_type
113
77
  end
114
78
  end
115
79
  end
@@ -121,10 +85,22 @@ shared_examples_for 'a filter' do
121
85
 
122
86
  it 'raises an error' do
123
87
  expect do
124
- filter.clean(value, nil)
88
+ filter.process(value, nil)
125
89
  end.to raise_error ActiveInteraction::InvalidDefaultError
126
90
  end
127
91
  end
92
+
93
+ # BasicObject is missing a lot of methods
94
+ context 'with a BasicObject' do
95
+ let(:value) { BasicObject.new }
96
+
97
+ it 'indicates an error' do
98
+ error = filter.process(value, nil).errors.first
99
+
100
+ expect(error).to be_an_instance_of ActiveInteraction::Filter::Error
101
+ expect(error.type).to be :invalid_type
102
+ end
103
+ end
128
104
  end
129
105
 
130
106
  describe '#default' do
@@ -14,7 +14,7 @@ shared_context 'interactions' do
14
14
  let(:result) { outcome.result }
15
15
  end
16
16
 
17
- shared_examples_for 'an interaction' do |type, generator, filter_options = {}|
17
+ shared_examples_for 'an interaction' do |type, generator, adjust_output = nil, **filter_options|
18
18
  include_context 'interactions'
19
19
 
20
20
  let(:described_class) do
@@ -73,7 +73,7 @@ shared_examples_for 'an interaction' do |type, generator, filter_options = {}|
73
73
  end
74
74
 
75
75
  it 'returns the correct value for :required' do
76
- expect(result[:required]).to eql required
76
+ expect(result[:required]).to eql(adjust_output ? adjust_output.call(required) : required)
77
77
  end
78
78
 
79
79
  it 'returns nil for :optional' do
@@ -107,7 +107,7 @@ shared_examples_for 'an interaction' do |type, generator, filter_options = {}|
107
107
  before { inputs[:optional] = optional }
108
108
 
109
109
  it 'returns the correct value for :optional' do
110
- expect(result[:optional]).to eql optional
110
+ expect(result[:optional]).to eql(adjust_output ? adjust_output.call(optional) : optional)
111
111
  end
112
112
  end
113
113
 
@@ -117,7 +117,7 @@ shared_examples_for 'an interaction' do |type, generator, filter_options = {}|
117
117
  before { inputs[:default] = default }
118
118
 
119
119
  it 'returns the correct value for :default' do
120
- expect(result[:default]).to eql default
120
+ expect(result[:default]).to eql(adjust_output ? adjust_output.call(default) : default)
121
121
  end
122
122
  end
123
123
  end