active_interaction 5.2.0 → 5.5.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +39 -0
- data/README.md +11 -12
- data/lib/active_interaction/base.rb +2 -0
- data/lib/active_interaction/errors.rb +16 -16
- data/lib/active_interaction/filters/hash_filter.rb +5 -1
- data/lib/active_interaction/grouped_input.rb +23 -3
- data/lib/active_interaction/version.rb +1 -1
- metadata +12 -115
- data/spec/active_interaction/array_input_spec.rb +0 -166
- data/spec/active_interaction/base_spec.rb +0 -537
- data/spec/active_interaction/concerns/active_modelable_spec.rb +0 -45
- data/spec/active_interaction/concerns/active_recordable_spec.rb +0 -49
- data/spec/active_interaction/concerns/hashable_spec.rb +0 -46
- data/spec/active_interaction/concerns/missable_spec.rb +0 -99
- data/spec/active_interaction/concerns/runnable_spec.rb +0 -397
- data/spec/active_interaction/errors_spec.rb +0 -196
- data/spec/active_interaction/filter/column_spec.rb +0 -87
- data/spec/active_interaction/filter_spec.rb +0 -60
- data/spec/active_interaction/filters/abstract_date_time_filter_spec.rb +0 -13
- data/spec/active_interaction/filters/abstract_numeric_filter_spec.rb +0 -13
- data/spec/active_interaction/filters/array_filter_spec.rb +0 -250
- data/spec/active_interaction/filters/boolean_filter_spec.rb +0 -87
- data/spec/active_interaction/filters/date_filter_spec.rb +0 -178
- data/spec/active_interaction/filters/date_time_filter_spec.rb +0 -189
- data/spec/active_interaction/filters/decimal_filter_spec.rb +0 -126
- data/spec/active_interaction/filters/file_filter_spec.rb +0 -40
- data/spec/active_interaction/filters/float_filter_spec.rb +0 -110
- data/spec/active_interaction/filters/hash_filter_spec.rb +0 -129
- data/spec/active_interaction/filters/integer_filter_spec.rb +0 -104
- data/spec/active_interaction/filters/interface_filter_spec.rb +0 -461
- data/spec/active_interaction/filters/object_filter_spec.rb +0 -237
- data/spec/active_interaction/filters/record_filter_spec.rb +0 -206
- data/spec/active_interaction/filters/string_filter_spec.rb +0 -60
- data/spec/active_interaction/filters/symbol_filter_spec.rb +0 -46
- data/spec/active_interaction/filters/time_filter_spec.rb +0 -251
- data/spec/active_interaction/grouped_input_spec.rb +0 -17
- data/spec/active_interaction/hash_input_spec.rb +0 -58
- data/spec/active_interaction/i18n_spec.rb +0 -113
- data/spec/active_interaction/inputs_spec.rb +0 -266
- data/spec/active_interaction/integration/array_interaction_spec.rb +0 -88
- data/spec/active_interaction/integration/boolean_interaction_spec.rb +0 -5
- data/spec/active_interaction/integration/date_interaction_spec.rb +0 -5
- data/spec/active_interaction/integration/date_time_interaction_spec.rb +0 -5
- data/spec/active_interaction/integration/file_interaction_spec.rb +0 -18
- data/spec/active_interaction/integration/float_interaction_spec.rb +0 -5
- data/spec/active_interaction/integration/hash_interaction_spec.rb +0 -76
- data/spec/active_interaction/integration/integer_interaction_spec.rb +0 -5
- data/spec/active_interaction/integration/interface_interaction_spec.rb +0 -19
- data/spec/active_interaction/integration/object_interaction_spec.rb +0 -14
- data/spec/active_interaction/integration/record_integration_spec.rb +0 -5
- data/spec/active_interaction/integration/string_interaction_spec.rb +0 -5
- data/spec/active_interaction/integration/symbol_interaction_spec.rb +0 -5
- data/spec/active_interaction/integration/time_interaction_spec.rb +0 -88
- data/spec/active_interaction/modules/validation_spec.rb +0 -57
- data/spec/spec_helper.rb +0 -20
- data/spec/support/concerns.rb +0 -13
- data/spec/support/filters.rb +0 -227
- data/spec/support/interactions.rb +0 -124
@@ -1,113 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe ActiveInteraction do
|
4
|
-
context 'I18n.load_path' do
|
5
|
-
it 'contains localization file paths' do
|
6
|
-
expect(I18n.load_path)
|
7
|
-
.to include a_string_ending_with('active_interaction/locale/en.yml')
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
I18nInteraction = Class.new(TestInteraction) do
|
13
|
-
hash :a do
|
14
|
-
hash :x
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
TYPES = ActiveInteraction::Filter
|
19
|
-
.const_get(:CLASSES)
|
20
|
-
.keys
|
21
|
-
.map(&:to_s)
|
22
|
-
|
23
|
-
describe I18nInteraction do
|
24
|
-
include_context 'interactions'
|
25
|
-
|
26
|
-
shared_examples 'translation' do |locale|
|
27
|
-
around do |example|
|
28
|
-
old_locale = I18n.locale
|
29
|
-
I18n.locale = locale
|
30
|
-
|
31
|
-
example.run
|
32
|
-
|
33
|
-
I18n.locale = old_locale
|
34
|
-
end
|
35
|
-
|
36
|
-
context 'types' do
|
37
|
-
TYPES.each do |type|
|
38
|
-
it "has a translation for #{type}" do
|
39
|
-
key = "#{described_class.i18n_scope}.types.#{type}"
|
40
|
-
expect { I18n.translate(key, raise: true) }.to_not raise_error
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
context 'error messages' do
|
46
|
-
let(:translation) { I18n.translate(key, type: type, raise: true) }
|
47
|
-
let(:type) { I18n.translate("#{described_class.i18n_scope}.types.hash") }
|
48
|
-
|
49
|
-
shared_examples 'translations' do |key, value|
|
50
|
-
context key.inspect do
|
51
|
-
let(:key) { "#{described_class.i18n_scope}.errors.messages.#{key}" }
|
52
|
-
|
53
|
-
before { inputs[:a] = value }
|
54
|
-
|
55
|
-
it 'has a translation' do
|
56
|
-
expect { translation }.to_not raise_error
|
57
|
-
end
|
58
|
-
|
59
|
-
it 'returns the translation' do
|
60
|
-
expect(outcome.errors[:a]).to include translation
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
include_examples 'translations', :invalid_type, Object.new
|
66
|
-
include_examples 'translations', :missing, nil
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
context 'english' do
|
71
|
-
include_examples 'translation', :en
|
72
|
-
end
|
73
|
-
|
74
|
-
context 'brazilian portuguese' do
|
75
|
-
include_examples 'translation', :'pt-BR'
|
76
|
-
end
|
77
|
-
|
78
|
-
context 'french' do
|
79
|
-
include_examples 'translation', :fr
|
80
|
-
end
|
81
|
-
|
82
|
-
context 'italian' do
|
83
|
-
include_examples 'translation', :it
|
84
|
-
end
|
85
|
-
|
86
|
-
context 'hsilgne' do
|
87
|
-
# This must appear before including the translation examples so that the
|
88
|
-
# locale is available before it is assigned.
|
89
|
-
around do |example|
|
90
|
-
old_locals = I18n.config.available_locales
|
91
|
-
I18n.config.available_locales += [:hsilgne]
|
92
|
-
|
93
|
-
I18n.backend.store_translations('hsilgne',
|
94
|
-
active_interaction: {
|
95
|
-
errors: {
|
96
|
-
messages: {
|
97
|
-
invalid: 'is invalid'.reverse,
|
98
|
-
invalid_type: "%<type>s} #{'is not a valid'.reverse}",
|
99
|
-
missing: 'missing'.reverse
|
100
|
-
}
|
101
|
-
},
|
102
|
-
types: TYPES.each_with_object({}) { |e, a| a[e] = e.reverse }
|
103
|
-
}
|
104
|
-
)
|
105
|
-
|
106
|
-
example.run
|
107
|
-
|
108
|
-
I18n.config.available_locales = old_locals
|
109
|
-
end
|
110
|
-
|
111
|
-
include_examples 'translation', :hsilgne
|
112
|
-
end
|
113
|
-
end
|
@@ -1,266 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe ActiveInteraction::Inputs do
|
4
|
-
subject(:inputs) { described_class.new(args, base_class.new) }
|
5
|
-
|
6
|
-
let(:args) { {} }
|
7
|
-
let(:base_class) { ActiveInteraction::Base }
|
8
|
-
|
9
|
-
describe '.reserved?(name)' do
|
10
|
-
it 'returns true for anything starting with "_interaction_"' do
|
11
|
-
expect(described_class).to be_reserved('_interaction_')
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'returns true for existing instance methods' do
|
15
|
-
(
|
16
|
-
(ActiveInteraction::Base.instance_methods - Object.instance_methods) +
|
17
|
-
(ActiveInteraction::Base.private_instance_methods - Object.private_instance_methods)
|
18
|
-
).each do |method|
|
19
|
-
expect(described_class).to be_reserved(method)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'returns false for anything else' do
|
24
|
-
expect(described_class).to_not be_reserved(SecureRandom.hex)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
describe '#normalized' do
|
29
|
-
let(:result) { inputs.normalized }
|
30
|
-
|
31
|
-
context 'with invalid inputs' do
|
32
|
-
let(:args) { nil }
|
33
|
-
|
34
|
-
it 'raises an error' do
|
35
|
-
expect { result }.to raise_error ArgumentError
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
context 'with non-hash inputs' do
|
40
|
-
let(:args) { [%i[k v]] }
|
41
|
-
|
42
|
-
it 'raises an error' do
|
43
|
-
expect { result }.to raise_error ArgumentError
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
context 'with ActiveInteraction::Inputs inputs' do
|
48
|
-
let(:args) { described_class.new({ key: :value }, base_class.new) }
|
49
|
-
|
50
|
-
it 'does not raise an error' do
|
51
|
-
expect { result }.to_not raise_error
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
context 'with ActionController::Parameters inputs' do
|
56
|
-
let(:args) { ::ActionController::Parameters.new }
|
57
|
-
|
58
|
-
it 'does not raise an error' do
|
59
|
-
expect { result }.to_not raise_error
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
context 'with simple inputs' do
|
64
|
-
before { args[:key] = :value }
|
65
|
-
|
66
|
-
it 'sends them straight through' do
|
67
|
-
expect(result).to eql args
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
context 'with groupable inputs' do
|
72
|
-
context 'without a matching simple input' do
|
73
|
-
before do
|
74
|
-
args.merge!(
|
75
|
-
'key(1i)' => :value1,
|
76
|
-
'key(2i)' => :value2
|
77
|
-
)
|
78
|
-
end
|
79
|
-
|
80
|
-
it 'groups the inputs into a GroupedInput' do
|
81
|
-
expect(result).to eq(
|
82
|
-
key: ActiveInteraction::GroupedInput.new(
|
83
|
-
'1' => :value1,
|
84
|
-
'2' => :value2
|
85
|
-
)
|
86
|
-
)
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
context 'with a matching simple input' do
|
91
|
-
before do
|
92
|
-
args.merge!(
|
93
|
-
'key(1i)' => :value1,
|
94
|
-
key: :value2
|
95
|
-
)
|
96
|
-
end
|
97
|
-
|
98
|
-
it 'groups the inputs into a GroupedInput' do
|
99
|
-
expect(result).to eq(
|
100
|
-
key: ActiveInteraction::GroupedInput.new(
|
101
|
-
'1' => :value1
|
102
|
-
)
|
103
|
-
)
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
context 'with a reserved name' do
|
109
|
-
before { args[:_interaction_key] = :value }
|
110
|
-
|
111
|
-
it 'skips the input' do
|
112
|
-
expect(result).to_not have_key(:_interaction_key)
|
113
|
-
end
|
114
|
-
end
|
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
|
266
|
-
end
|
@@ -1,88 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'active_record'
|
3
|
-
require 'sqlite3'
|
4
|
-
|
5
|
-
ActiveRecord::Base.establish_connection(
|
6
|
-
adapter: 'sqlite3',
|
7
|
-
database: ':memory:'
|
8
|
-
)
|
9
|
-
|
10
|
-
ActiveRecord::Schema.define do
|
11
|
-
create_table(:lists)
|
12
|
-
create_table(:elements) { |t| t.column(:list_id, :integer) }
|
13
|
-
end
|
14
|
-
|
15
|
-
class List < ActiveRecord::Base
|
16
|
-
has_many :elements
|
17
|
-
end
|
18
|
-
|
19
|
-
class Element < ActiveRecord::Base
|
20
|
-
belongs_to :list
|
21
|
-
end
|
22
|
-
|
23
|
-
ArrayInteraction = Class.new(TestInteraction) do
|
24
|
-
array :a do
|
25
|
-
array
|
26
|
-
end
|
27
|
-
array :b, default: [[]] do
|
28
|
-
array
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
describe ArrayInteraction do
|
33
|
-
include_context 'interactions'
|
34
|
-
it_behaves_like 'an interaction', :array, -> { [] }
|
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 }
|
37
|
-
|
38
|
-
context 'with inputs[:a]' do
|
39
|
-
let(:a) { [[]] }
|
40
|
-
|
41
|
-
before { inputs[:a] = a }
|
42
|
-
|
43
|
-
it 'returns the correct value for :a' do
|
44
|
-
expect(result[:a]).to eql a
|
45
|
-
end
|
46
|
-
|
47
|
-
it 'returns the correct value for :b' do
|
48
|
-
expect(result[:b]).to eql [[]]
|
49
|
-
end
|
50
|
-
|
51
|
-
it 'does not raise an error with an invalid nested value' do
|
52
|
-
inputs[:a] = [false]
|
53
|
-
expect { outcome }.to_not raise_error
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
context 'with an invalid default' do
|
58
|
-
it 'raises an error' do
|
59
|
-
expect do
|
60
|
-
Class.new(ActiveInteraction::Base) do
|
61
|
-
array :a, default: Object.new
|
62
|
-
end
|
63
|
-
end.to raise_error ActiveInteraction::InvalidDefaultError
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
context 'with an invalid default as a proc' do
|
68
|
-
it 'does not raise an error' do
|
69
|
-
expect do
|
70
|
-
Class.new(ActiveInteraction::Base) do
|
71
|
-
array :a, default: -> { Object.new }
|
72
|
-
end
|
73
|
-
end.to_not raise_error
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
context 'with an invalid nested default' do
|
78
|
-
it 'raises an error' do
|
79
|
-
expect do
|
80
|
-
Class.new(ActiveInteraction::Base) do
|
81
|
-
array :a, default: [Object.new] do
|
82
|
-
array
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end.to raise_error ActiveInteraction::InvalidDefaultError
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'action_dispatch'
|
3
|
-
|
4
|
-
FileInteraction = Class.new(TestInteraction) do
|
5
|
-
file :a
|
6
|
-
end
|
7
|
-
|
8
|
-
describe FileInteraction do
|
9
|
-
include_context 'interactions'
|
10
|
-
it_behaves_like 'an interaction', :file, -> { File.open(__FILE__) }
|
11
|
-
|
12
|
-
it 'works with an uploaded file' do
|
13
|
-
file = File.open(__FILE__)
|
14
|
-
uploaded_file = ActionDispatch::Http::UploadedFile.new(tempfile: file)
|
15
|
-
inputs[:a] = uploaded_file
|
16
|
-
expect(outcome).to be_valid
|
17
|
-
end
|
18
|
-
end
|
@@ -1,76 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
HashInteraction = Class.new(TestInteraction) do
|
4
|
-
hash :a do
|
5
|
-
hash :x
|
6
|
-
end
|
7
|
-
hash :b, default: {} do
|
8
|
-
hash :x, default: {}
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
describe HashInteraction do
|
13
|
-
include_context 'interactions'
|
14
|
-
it_behaves_like 'an interaction', :hash, -> { {} }
|
15
|
-
|
16
|
-
context 'with inputs[:a]' do
|
17
|
-
let(:a) { { x: {} } }
|
18
|
-
|
19
|
-
before { inputs[:a] = a }
|
20
|
-
|
21
|
-
it 'returns the correct value for :a' do
|
22
|
-
expect(result[:a]).to eql ActiveSupport::HashWithIndifferentAccess.new(a)
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'returns the correct value for :b' do
|
26
|
-
expect(result[:b]).to eql('x' => {})
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'does not raise an error with an invalid nested value' do
|
30
|
-
inputs[:a] = { x: false }
|
31
|
-
expect { outcome }.to_not raise_error
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
context 'with an invalid default' do
|
36
|
-
it 'raises an error' do
|
37
|
-
expect do
|
38
|
-
Class.new(ActiveInteraction::Base) do
|
39
|
-
hash :a, default: Object.new
|
40
|
-
end
|
41
|
-
end.to raise_error ActiveInteraction::InvalidDefaultError
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
context 'with an invalid default as a proc' do
|
46
|
-
it 'does not raise an error' do
|
47
|
-
expect do
|
48
|
-
Class.new(ActiveInteraction::Base) do
|
49
|
-
array :a, default: -> { Object.new }
|
50
|
-
end
|
51
|
-
end.to_not raise_error
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
context 'with an invalid nested default' do
|
56
|
-
it 'raises an error with a non-empty hash' do
|
57
|
-
expect do
|
58
|
-
Class.new(ActiveInteraction::Base) do
|
59
|
-
hash :a, default: { x: Object.new } do
|
60
|
-
hash :x
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end.to raise_error ActiveInteraction::InvalidDefaultError
|
64
|
-
end
|
65
|
-
|
66
|
-
it 'raises an error' do
|
67
|
-
expect do
|
68
|
-
Class.new(ActiveInteraction::Base) do
|
69
|
-
hash :a, default: {} do
|
70
|
-
hash :x
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end.to raise_error ActiveInteraction::InvalidDefaultError
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'json'
|
3
|
-
require 'yaml'
|
4
|
-
|
5
|
-
InterfaceInteraction = Class.new(TestInteraction) do
|
6
|
-
interface :anything, methods: []
|
7
|
-
end
|
8
|
-
|
9
|
-
describe InterfaceInteraction do
|
10
|
-
include_context 'interactions'
|
11
|
-
it_behaves_like 'an interaction',
|
12
|
-
:interface,
|
13
|
-
-> { [JSON, YAML].sample },
|
14
|
-
methods: %i[dump load]
|
15
|
-
|
16
|
-
it 'succeeds when given nil' do
|
17
|
-
expect { result }.to_not raise_error
|
18
|
-
end
|
19
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
ObjectInteraction = Class.new(TestInteraction) do
|
4
|
-
object :object
|
5
|
-
end
|
6
|
-
|
7
|
-
describe ObjectInteraction do
|
8
|
-
include_context 'interactions'
|
9
|
-
it_behaves_like 'an interaction', :object, -> { // }, class: Regexp
|
10
|
-
|
11
|
-
it 'succeeds when given nil' do
|
12
|
-
expect { result }.to_not raise_error
|
13
|
-
end
|
14
|
-
end
|