virtus 1.0.1 → 2.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.
- checksums.yaml +5 -5
- data/.travis.yml +19 -15
- data/Changelog.md +43 -2
- data/Gemfile +5 -5
- data/README.md +113 -78
- data/Rakefile +13 -3
- data/lib/virtus.rb +46 -6
- data/lib/virtus/attribute.rb +21 -3
- data/lib/virtus/attribute/accessor.rb +11 -0
- data/lib/virtus/attribute/builder.rb +8 -13
- data/lib/virtus/attribute/collection.rb +12 -3
- data/lib/virtus/attribute/default_value.rb +2 -0
- data/lib/virtus/attribute/hash.rb +3 -3
- data/lib/virtus/attribute/nullify_blank.rb +24 -0
- data/lib/virtus/attribute/strict.rb +1 -1
- data/lib/virtus/attribute_set.rb +2 -2
- data/lib/virtus/builder.rb +2 -6
- data/lib/virtus/class_inclusions.rb +0 -1
- data/lib/virtus/coercer.rb +1 -0
- data/lib/virtus/configuration.rb +17 -36
- data/lib/virtus/extensions.rb +13 -21
- data/lib/virtus/instance_methods.rb +3 -2
- data/lib/virtus/model.rb +1 -3
- data/lib/virtus/module_extensions.rb +8 -2
- data/lib/virtus/support/equalizer.rb +1 -1
- data/lib/virtus/support/options.rb +2 -1
- data/lib/virtus/support/type_lookup.rb +1 -1
- data/lib/virtus/version.rb +1 -1
- data/spec/integration/attributes_attribute_spec.rb +28 -0
- data/spec/integration/building_module_spec.rb +22 -0
- data/spec/integration/collection_member_coercion_spec.rb +34 -13
- data/spec/integration/custom_attributes_spec.rb +2 -2
- data/spec/integration/custom_collection_attributes_spec.rb +6 -6
- data/spec/integration/default_values_spec.rb +8 -8
- data/spec/integration/defining_attributes_spec.rb +25 -18
- data/spec/integration/embedded_value_spec.rb +5 -5
- data/spec/integration/extending_objects_spec.rb +5 -5
- data/spec/integration/hash_attributes_coercion_spec.rb +16 -12
- data/spec/integration/mass_assignment_with_accessors_spec.rb +5 -5
- data/spec/integration/overriding_virtus_spec.rb +4 -4
- data/spec/integration/required_attributes_spec.rb +1 -1
- data/spec/integration/struct_as_embedded_value_spec.rb +4 -4
- data/spec/integration/using_modules_spec.rb +8 -8
- data/spec/integration/value_object_with_custom_constructor_spec.rb +4 -4
- data/spec/integration/virtus/instance_level_attributes_spec.rb +1 -1
- data/spec/integration/virtus/value_object_spec.rb +14 -14
- data/spec/shared/freeze_method_behavior.rb +6 -3
- data/spec/shared/idempotent_method_behaviour.rb +1 -1
- data/spec/shared/options_class_method.rb +3 -3
- data/spec/spec_helper.rb +2 -18
- data/spec/unit/virtus/attribute/boolean/coerce_spec.rb +3 -3
- data/spec/unit/virtus/attribute/boolean/value_coerced_predicate_spec.rb +3 -3
- data/spec/unit/virtus/attribute/class_methods/build_spec.rb +64 -24
- data/spec/unit/virtus/attribute/class_methods/coerce_spec.rb +2 -2
- data/spec/unit/virtus/attribute/coerce_spec.rb +58 -10
- data/spec/unit/virtus/attribute/coercible_predicate_spec.rb +2 -2
- data/spec/unit/virtus/attribute/collection/class_methods/build_spec.rb +15 -4
- data/spec/unit/virtus/attribute/collection/coerce_spec.rb +25 -4
- data/spec/unit/virtus/attribute/collection/value_coerced_predicate_spec.rb +31 -0
- data/spec/unit/virtus/attribute/comparison_spec.rb +20 -0
- data/spec/unit/virtus/attribute/custom_collection_spec.rb +8 -2
- data/spec/unit/virtus/attribute/defined_spec.rb +20 -0
- data/spec/unit/virtus/attribute/embedded_value/class_methods/build_spec.rb +30 -15
- data/spec/unit/virtus/attribute/embedded_value/coerce_spec.rb +25 -11
- data/spec/unit/virtus/attribute/get_spec.rb +2 -2
- data/spec/unit/virtus/attribute/hash/class_methods/build_spec.rb +21 -9
- data/spec/unit/virtus/attribute/hash/coerce_spec.rb +9 -9
- data/spec/unit/virtus/attribute/lazy_predicate_spec.rb +2 -2
- data/spec/unit/virtus/attribute/rename_spec.rb +6 -3
- data/spec/unit/virtus/attribute/required_predicate_spec.rb +2 -2
- data/spec/unit/virtus/attribute/set_default_value_spec.rb +43 -10
- data/spec/unit/virtus/attribute/set_spec.rb +1 -1
- data/spec/unit/virtus/attribute/value_coerced_predicate_spec.rb +2 -2
- data/spec/unit/virtus/attribute_set/append_spec.rb +6 -6
- data/spec/unit/virtus/attribute_set/define_reader_method_spec.rb +12 -11
- data/spec/unit/virtus/attribute_set/define_writer_method_spec.rb +13 -12
- data/spec/unit/virtus/attribute_set/each_spec.rb +21 -16
- data/spec/unit/virtus/attribute_set/element_reference_spec.rb +2 -2
- data/spec/unit/virtus/attribute_set/element_set_spec.rb +17 -9
- data/spec/unit/virtus/attribute_set/merge_spec.rb +7 -5
- data/spec/unit/virtus/attribute_set/reset_spec.rb +22 -11
- data/spec/unit/virtus/attribute_spec.rb +8 -7
- data/spec/unit/virtus/attributes_reader_spec.rb +1 -1
- data/spec/unit/virtus/attributes_writer_spec.rb +1 -1
- data/spec/unit/virtus/element_reader_spec.rb +1 -1
- data/spec/unit/virtus/freeze_spec.rb +23 -3
- data/spec/unit/virtus/model_spec.rb +38 -7
- data/spec/unit/virtus/module_spec.rb +59 -2
- data/spec/unit/virtus/set_default_attributes_spec.rb +10 -3
- data/spec/unit/virtus/value_object_spec.rb +15 -5
- data/virtus.gemspec +7 -5
- metadata +46 -44
- data/.ruby-version +0 -1
- data/Gemfile.devtools +0 -54
- data/config/flay.yml +0 -3
- data/config/flog.yml +0 -2
- data/config/mutant.yml +0 -15
- data/config/reek.yml +0 -146
- data/config/yardstick.yml +0 -2
@@ -19,7 +19,7 @@ describe Virtus::Attribute, '.coerce' do
|
|
19
19
|
described_class.coerce(true)
|
20
20
|
end
|
21
21
|
|
22
|
-
it {
|
22
|
+
it { is_expected.to be(true) }
|
23
23
|
end
|
24
24
|
|
25
25
|
context 'when it is set to false' do
|
@@ -27,6 +27,6 @@ describe Virtus::Attribute, '.coerce' do
|
|
27
27
|
described_class.coerce(false)
|
28
28
|
end
|
29
29
|
|
30
|
-
it {
|
30
|
+
it { is_expected.to be(false) }
|
31
31
|
end
|
32
32
|
end
|
@@ -7,10 +7,11 @@ describe Virtus::Attribute, '#coerce' do
|
|
7
7
|
|
8
8
|
let(:object) {
|
9
9
|
described_class.build(String,
|
10
|
-
:coercer => coercer, :strict => strict, :required => required)
|
10
|
+
:coercer => coercer, :strict => strict, :required => required, :nullify_blank => nullify_blank)
|
11
11
|
}
|
12
12
|
|
13
13
|
let(:required) { true }
|
14
|
+
let(:nullify_blank) { false }
|
14
15
|
let(:input) { 1 }
|
15
16
|
let(:output) { '1' }
|
16
17
|
|
@@ -18,7 +19,7 @@ describe Virtus::Attribute, '#coerce' do
|
|
18
19
|
let(:strict) { false }
|
19
20
|
|
20
21
|
it 'uses coercer to coerce the input value' do
|
21
|
-
|
22
|
+
mock(coercer).call(input) { output }
|
22
23
|
|
23
24
|
expect(subject).to be(output)
|
24
25
|
|
@@ -30,8 +31,8 @@ describe Virtus::Attribute, '#coerce' do
|
|
30
31
|
let(:strict) { true }
|
31
32
|
|
32
33
|
it 'uses coercer to coerce the input value' do
|
33
|
-
|
34
|
-
|
34
|
+
mock(coercer).call(input) { output }
|
35
|
+
mock(coercer).success?(String, output) { true }
|
35
36
|
|
36
37
|
expect(subject).to be(output)
|
37
38
|
|
@@ -44,8 +45,8 @@ describe Virtus::Attribute, '#coerce' do
|
|
44
45
|
let(:input) { nil }
|
45
46
|
|
46
47
|
it 'returns nil' do
|
47
|
-
|
48
|
-
|
48
|
+
mock(coercer).call(input) { input }
|
49
|
+
mock(coercer).success?(String, input) { false }
|
49
50
|
|
50
51
|
expect(subject).to be(nil)
|
51
52
|
|
@@ -58,8 +59,8 @@ describe Virtus::Attribute, '#coerce' do
|
|
58
59
|
let(:input) { nil }
|
59
60
|
|
60
61
|
it 'returns raises error' do
|
61
|
-
|
62
|
-
|
62
|
+
mock(coercer).call(input) { input }
|
63
|
+
mock(coercer).success?(String, input) { false }
|
63
64
|
|
64
65
|
expect { subject }.to raise_error(Virtus::CoercionError)
|
65
66
|
|
@@ -69,8 +70,8 @@ describe Virtus::Attribute, '#coerce' do
|
|
69
70
|
end
|
70
71
|
|
71
72
|
it 'raises error when input was not coerced' do
|
72
|
-
|
73
|
-
|
73
|
+
mock(coercer).call(input) { input }
|
74
|
+
mock(coercer).success?(String, input) { false }
|
74
75
|
|
75
76
|
expect { subject }.to raise_error(Virtus::CoercionError)
|
76
77
|
|
@@ -78,4 +79,51 @@ describe Virtus::Attribute, '#coerce' do
|
|
78
79
|
expect(coercer).to have_received.success?(String, input)
|
79
80
|
end
|
80
81
|
end
|
82
|
+
|
83
|
+
context 'when the input is an empty String' do
|
84
|
+
let(:input) { '' }
|
85
|
+
let(:output) { '' }
|
86
|
+
|
87
|
+
context 'when nullify_blank is turned on' do
|
88
|
+
let(:nullify_blank) { true }
|
89
|
+
let(:strict) { false }
|
90
|
+
let(:require) { false }
|
91
|
+
|
92
|
+
it 'returns nil' do
|
93
|
+
mock(coercer).call(input) { input }
|
94
|
+
mock(coercer).success?(String, input) { false }
|
95
|
+
|
96
|
+
expect(subject).to be_nil
|
97
|
+
|
98
|
+
expect(coercer).to have_received.call(input)
|
99
|
+
expect(coercer).to have_received.success?(String, input)
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'returns the ouput if it was coerced' do
|
103
|
+
mock(coercer).call(input) { output }
|
104
|
+
mock(coercer).success?(String, output) { true }
|
105
|
+
|
106
|
+
expect(subject).to be(output)
|
107
|
+
|
108
|
+
expect(coercer).to have_received.call(input)
|
109
|
+
expect(coercer).to have_received.success?(String, output)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
context 'when both nullify_blank and strict are turned on' do
|
114
|
+
let(:nullify_blank) { true }
|
115
|
+
let(:strict) { true }
|
116
|
+
|
117
|
+
it 'does not raises an coercion error' do
|
118
|
+
mock(coercer).call(input) { input }
|
119
|
+
mock(coercer).success?(String, input) { false }
|
120
|
+
|
121
|
+
expect { subject }.not_to raise_error
|
122
|
+
expect(subject).to be_nil
|
123
|
+
|
124
|
+
expect(coercer).to have_received.call(input)
|
125
|
+
expect(coercer).to have_received.success?(String, input)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
81
129
|
end
|
@@ -9,12 +9,12 @@ describe Virtus::Attribute, '#coercible?' do
|
|
9
9
|
context 'when :coerce is set to true' do
|
10
10
|
let(:coerce) { true }
|
11
11
|
|
12
|
-
it {
|
12
|
+
it { is_expected.to be(true) }
|
13
13
|
end
|
14
14
|
|
15
15
|
context 'when :coerce is set to false' do
|
16
16
|
let(:coerce) { false }
|
17
17
|
|
18
|
-
it {
|
18
|
+
it { is_expected.to be(false) }
|
19
19
|
end
|
20
20
|
end
|
@@ -1,12 +1,14 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Virtus::Attribute, '.build' do
|
4
|
-
subject { described_class.build(type) }
|
4
|
+
subject { described_class.build(type, options) }
|
5
5
|
|
6
|
-
|
7
|
-
it { should be_instance_of(Virtus::Attribute::Collection) }
|
6
|
+
let(:options) { {} }
|
8
7
|
|
9
|
-
|
8
|
+
shared_examples_for 'a valid collection attribute instance' do
|
9
|
+
it { is_expected.to be_instance_of(Virtus::Attribute::Collection) }
|
10
|
+
|
11
|
+
it { is_expected.to be_frozen }
|
10
12
|
end
|
11
13
|
|
12
14
|
context 'when type is Array' do
|
@@ -91,4 +93,13 @@ describe Virtus::Attribute, '.build' do
|
|
91
93
|
expect(subject.type.member_type).to be(Axiom::Types::String)
|
92
94
|
end
|
93
95
|
end
|
96
|
+
|
97
|
+
context 'when strict mode is used' do
|
98
|
+
let(:type) { Array[String] }
|
99
|
+
let(:options) { { strict: true } }
|
100
|
+
|
101
|
+
it 'sets strict mode for member type' do
|
102
|
+
expect(subject.member_type).to be_strict
|
103
|
+
end
|
104
|
+
end
|
94
105
|
end
|
@@ -16,10 +16,10 @@ describe Virtus::Attribute::Collection, '#coerce' do
|
|
16
16
|
}
|
17
17
|
|
18
18
|
it 'uses coercer to coerce members' do
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
mock(coercer).call(input) { input }
|
20
|
+
mock(member_type).finalize { member_type }
|
21
|
+
mock(member_type).coerce('1') { 1 }
|
22
|
+
mock(member_type).coerce('2') { 2 }
|
23
23
|
|
24
24
|
expect(subject).to eq([1, 2])
|
25
25
|
|
@@ -50,4 +50,25 @@ describe Virtus::Attribute::Collection, '#coerce' do
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
end
|
53
|
+
|
54
|
+
context 'when input is nil' do
|
55
|
+
let(:input) { nil }
|
56
|
+
|
57
|
+
fake(:coercer) { Virtus::Attribute::Coercer }
|
58
|
+
fake(:member_type) { Virtus::Attribute }
|
59
|
+
|
60
|
+
let(:member_primitive) { Integer }
|
61
|
+
|
62
|
+
let(:object) {
|
63
|
+
described_class.build(
|
64
|
+
Array[member_primitive], coercer: coercer, member_type: member_type
|
65
|
+
)
|
66
|
+
}
|
67
|
+
|
68
|
+
it 'returns nil' do
|
69
|
+
mock(coercer).call(input) { input }
|
70
|
+
|
71
|
+
expect(subject).to be(input)
|
72
|
+
end
|
73
|
+
end
|
53
74
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'set'
|
3
|
+
|
4
|
+
describe Virtus::Attribute::Collection, '#value_coerced?' do
|
5
|
+
subject { object.value_coerced?(input) }
|
6
|
+
|
7
|
+
let(:object) { described_class.build(Array[Integer]) }
|
8
|
+
|
9
|
+
context 'when input has correctly typed members' do
|
10
|
+
let(:input) { [1, 2, 3] }
|
11
|
+
|
12
|
+
it { is_expected.to be(true) }
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'when input has incorrectly typed members' do
|
16
|
+
let(:input) { [1, 2, '3'] }
|
17
|
+
|
18
|
+
it { is_expected.to be(false) }
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'when the collection type is incorrect' do
|
22
|
+
let(:input) { Set[1, 2, 3] }
|
23
|
+
|
24
|
+
it { is_expected.to be(false) }
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'when the input is empty' do
|
28
|
+
let(:input) { [] }
|
29
|
+
it { is_expected.to be(true) }
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Virtus::Attribute, '#== (defined by including Virtus::Equalizer)' do
|
4
|
+
let(:attribute) { described_class.build(String, :name => :name) }
|
5
|
+
|
6
|
+
it 'returns true when attributes have same type and options' do
|
7
|
+
equal_attribute = described_class.build(String, :name => :name)
|
8
|
+
expect(attribute == equal_attribute).to be_truthy
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'returns false when attributes have different type' do
|
12
|
+
different_attribute = described_class.build(Integer, :name => :name)
|
13
|
+
expect(attribute == different_attribute).to be_falsey
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'returns false when attributes have different options' do
|
17
|
+
different_attribute = described_class.build(Integer, :name => :name_two)
|
18
|
+
expect(attribute == different_attribute).to be_falsey
|
19
|
+
end
|
20
|
+
end
|
@@ -12,12 +12,18 @@ describe Virtus::Attribute::Collection, 'custom subclass' do
|
|
12
12
|
context 'when primitive is set on the attribute subclass' do
|
13
13
|
let(:attribute_class) { Class.new(described_class).primitive(primitive) }
|
14
14
|
|
15
|
-
|
15
|
+
describe '#primitive' do
|
16
|
+
subject { super().primitive }
|
17
|
+
it { is_expected.to be(primitive) }
|
18
|
+
end
|
16
19
|
end
|
17
20
|
|
18
21
|
context 'when primitive is not set on the attribute subclass' do
|
19
22
|
let(:attribute_class) { Class.new(described_class) }
|
20
23
|
|
21
|
-
|
24
|
+
describe '#primitive' do
|
25
|
+
subject { super().primitive }
|
26
|
+
it { is_expected.to be(primitive) }
|
27
|
+
end
|
22
28
|
end
|
23
29
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Virtus::Attribute, '#defined?' do
|
4
|
+
subject { object.defined?(instance) }
|
5
|
+
|
6
|
+
let(:object) { described_class.build(String, :name => name) }
|
7
|
+
|
8
|
+
let(:model) { Class.new { attr_accessor :test } }
|
9
|
+
let(:name) { :test }
|
10
|
+
let(:instance) { model.new }
|
11
|
+
|
12
|
+
context 'when the attribute value has not been defined' do
|
13
|
+
it { is_expected.to be(false) }
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'when the attribute value has been defined' do
|
17
|
+
before { instance.test = nil }
|
18
|
+
it { is_expected.to be(true) }
|
19
|
+
end
|
20
|
+
end
|
@@ -6,50 +6,65 @@ describe Virtus::Attribute::EmbeddedValue, '.build' do
|
|
6
6
|
context 'when type is a Virtus.model' do
|
7
7
|
let(:type) { Class.new { include Virtus.model } }
|
8
8
|
|
9
|
-
it {
|
9
|
+
it { is_expected.to be_frozen }
|
10
10
|
|
11
|
-
it {
|
11
|
+
it { is_expected.to be_instance_of(Virtus::Attribute::EmbeddedValue) }
|
12
12
|
|
13
|
-
|
13
|
+
describe '#coercer' do
|
14
|
+
subject { super().coercer }
|
15
|
+
it { is_expected.to be_instance_of(described_class::FromOpenStruct) }
|
16
|
+
end
|
14
17
|
end
|
15
18
|
|
16
19
|
context 'when type includes Virtus' do
|
17
20
|
let(:type) { Class.new { include Virtus } }
|
18
21
|
|
19
|
-
it {
|
22
|
+
it { is_expected.to be_frozen }
|
20
23
|
|
21
|
-
it {
|
24
|
+
it { is_expected.to be_instance_of(Virtus::Attribute::EmbeddedValue) }
|
22
25
|
|
23
|
-
|
26
|
+
describe '#coercer' do
|
27
|
+
subject { super().coercer }
|
28
|
+
it { is_expected.to be_instance_of(described_class::FromOpenStruct) }
|
29
|
+
end
|
24
30
|
end
|
25
31
|
|
26
32
|
context 'when type is an OpenStruct subclass' do
|
27
33
|
let(:type) { Class.new(OpenStruct) }
|
28
34
|
|
29
|
-
it {
|
35
|
+
it { is_expected.to be_frozen }
|
30
36
|
|
31
|
-
it {
|
37
|
+
it { is_expected.to be_instance_of(Virtus::Attribute::EmbeddedValue) }
|
32
38
|
|
33
|
-
|
39
|
+
describe '#coercer' do
|
40
|
+
subject { super().coercer }
|
41
|
+
it { is_expected.to be_instance_of(described_class::FromOpenStruct) }
|
42
|
+
end
|
34
43
|
end
|
35
44
|
|
36
45
|
context 'when type is OpenStruct' do
|
37
46
|
let(:type) { OpenStruct }
|
38
47
|
|
39
|
-
it {
|
48
|
+
it { is_expected.to be_frozen }
|
40
49
|
|
41
|
-
it {
|
50
|
+
it { is_expected.to be_instance_of(Virtus::Attribute::EmbeddedValue) }
|
42
51
|
|
43
|
-
|
52
|
+
describe '#coercer' do
|
53
|
+
subject { super().coercer }
|
54
|
+
it { is_expected.to be_instance_of(described_class::FromOpenStruct) }
|
55
|
+
end
|
44
56
|
end
|
45
57
|
|
46
58
|
context 'when type is Struct' do
|
47
59
|
let(:type) { Struct.new(:test) }
|
48
60
|
|
49
|
-
it {
|
61
|
+
it { is_expected.to be_frozen }
|
50
62
|
|
51
|
-
it {
|
63
|
+
it { is_expected.to be_instance_of(Virtus::Attribute::EmbeddedValue) }
|
52
64
|
|
53
|
-
|
65
|
+
describe '#coercer' do
|
66
|
+
subject { super().coercer }
|
67
|
+
it { is_expected.to be_instance_of(described_class::FromStruct) }
|
68
|
+
end
|
54
69
|
end
|
55
70
|
end
|
@@ -12,22 +12,29 @@ describe Virtus::Attribute::EmbeddedValue, '#coerce' do
|
|
12
12
|
context 'when input is an attribute hash' do
|
13
13
|
let(:input) { Hash[name: 'Piotr', age: 30] }
|
14
14
|
|
15
|
-
it {
|
15
|
+
it { is_expected.to be_instance_of(model) }
|
16
16
|
|
17
|
-
|
18
|
-
|
17
|
+
describe '#name' do
|
18
|
+
subject { super().name }
|
19
|
+
it { is_expected.to eql('Piotr') }
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#age' do
|
23
|
+
subject { super().age }
|
24
|
+
it { is_expected.to eql(30) }
|
25
|
+
end
|
19
26
|
end
|
20
27
|
|
21
28
|
context 'when input is nil' do
|
22
29
|
let(:input) { nil }
|
23
30
|
|
24
|
-
it {
|
31
|
+
it { is_expected.to be(nil) }
|
25
32
|
end
|
26
33
|
|
27
34
|
context 'when input is a model instance' do
|
28
35
|
let(:input) { OpenStruct.new }
|
29
36
|
|
30
|
-
it {
|
37
|
+
it { is_expected.to be(input) }
|
31
38
|
end
|
32
39
|
end
|
33
40
|
|
@@ -37,22 +44,29 @@ describe Virtus::Attribute::EmbeddedValue, '#coerce' do
|
|
37
44
|
context 'when input is an attribute hash' do
|
38
45
|
let(:input) { ['Piotr', 30] }
|
39
46
|
|
40
|
-
it {
|
47
|
+
it { is_expected.to be_instance_of(model) }
|
41
48
|
|
42
|
-
|
43
|
-
|
49
|
+
describe '#name' do
|
50
|
+
subject { super().name }
|
51
|
+
it { is_expected.to eql('Piotr') }
|
52
|
+
end
|
53
|
+
|
54
|
+
describe '#age' do
|
55
|
+
subject { super().age }
|
56
|
+
it { is_expected.to eql(30) }
|
57
|
+
end
|
44
58
|
end
|
45
59
|
|
46
60
|
context 'when input is nil' do
|
47
61
|
let(:input) { nil }
|
48
62
|
|
49
|
-
it {
|
63
|
+
it { is_expected.to be(nil) }
|
50
64
|
end
|
51
65
|
|
52
66
|
context 'when input is a model instance' do
|
53
67
|
let(:input) { model.new('Piotr', 30) }
|
54
68
|
|
55
|
-
it {
|
69
|
+
it { is_expected.to be(input) }
|
56
70
|
end
|
57
71
|
end
|
58
72
|
|
@@ -63,7 +77,7 @@ describe Virtus::Attribute::EmbeddedValue, '#coerce' do
|
|
63
77
|
context 'when input is coercible' do
|
64
78
|
let(:input) { ['Piotr'] }
|
65
79
|
|
66
|
-
it {
|
80
|
+
it { is_expected.to eql(model.new('Piotr')) }
|
67
81
|
end
|
68
82
|
|
69
83
|
context 'when input is not coercible' do
|