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
@@ -9,9 +9,9 @@ describe Virtus::AttributeSet, '#[]' do
|
|
9
9
|
let(:parent) { described_class.new }
|
10
10
|
let(:object) { described_class.new(parent, attributes) }
|
11
11
|
|
12
|
-
it {
|
12
|
+
it { is_expected.to equal(attribute) }
|
13
13
|
|
14
14
|
it 'allows indexed access to attributes by the string representation of their name' do
|
15
|
-
object[name.to_s].
|
15
|
+
expect(object[name.to_s]).to equal(attribute)
|
16
16
|
end
|
17
17
|
end
|
@@ -11,7 +11,7 @@ describe Virtus::AttributeSet, '#[]=' do
|
|
11
11
|
context 'with a new attribute' do
|
12
12
|
let(:attribute) { Virtus::Attribute.build(String, :name => name) }
|
13
13
|
|
14
|
-
it {
|
14
|
+
it { is_expected.to equal(attribute) }
|
15
15
|
|
16
16
|
it 'adds an attribute' do
|
17
17
|
expect { subject }.to change { object.to_a }.from(attributes).to([ attribute ])
|
@@ -35,22 +35,30 @@ describe Virtus::AttributeSet, '#[]=' do
|
|
35
35
|
let(:attributes) { [ original ] }
|
36
36
|
let(:attribute) { Virtus::Attribute.build(String, :name => name) }
|
37
37
|
|
38
|
-
it {
|
38
|
+
it { is_expected.to equal(attribute) }
|
39
39
|
|
40
|
-
it
|
41
|
-
expect { subject }.to change { object.to_a
|
40
|
+
it "replaces the original attribute object" do
|
41
|
+
expect { subject }.to change { object.to_a.map(&:__id__) }.
|
42
|
+
from(attributes.map(&:__id__)).
|
43
|
+
to([attribute.__id__])
|
42
44
|
end
|
43
45
|
|
44
|
-
it 'allows #[] to access the attribute with a
|
45
|
-
expect { subject }.to change { object['name'] }.
|
46
|
+
it 'allows #[] to access the attribute with a string' do
|
47
|
+
expect { subject }.to change { object['name'].__id__ }.
|
48
|
+
from(original.__id__).
|
49
|
+
to(attribute.__id__)
|
46
50
|
end
|
47
51
|
|
48
|
-
it 'allows #[] to access the attribute with a
|
49
|
-
expect { subject }.to change { object[:name] }.
|
52
|
+
it 'allows #[] to access the attribute with a symbol' do
|
53
|
+
expect { subject }.to change { object[:name].__id__ }.
|
54
|
+
from(original.__id__).
|
55
|
+
to(attribute.__id__)
|
50
56
|
end
|
51
57
|
|
52
58
|
it 'allows #reset to track overridden attributes' do
|
53
|
-
expect { subject }.to change { object.reset.to_a
|
59
|
+
expect { subject }.to change { object.reset.to_a.map(&:__id__) }.
|
60
|
+
from(attributes.map(&:__id__)).
|
61
|
+
to([attribute.__id__])
|
54
62
|
end
|
55
63
|
end
|
56
64
|
end
|
@@ -12,7 +12,7 @@ describe Virtus::AttributeSet, '#merge' do
|
|
12
12
|
let(:attributes) { [] }
|
13
13
|
let(:attribute) { Virtus::Attribute.build(String, :name => name) }
|
14
14
|
|
15
|
-
it {
|
15
|
+
it { is_expected.to equal(object) }
|
16
16
|
|
17
17
|
it 'adds an attribute' do
|
18
18
|
expect { subject }.to change { object.to_a }.from(attributes).to([attribute])
|
@@ -21,12 +21,14 @@ describe Virtus::AttributeSet, '#merge' do
|
|
21
21
|
|
22
22
|
context 'with a duplicate attribute' do
|
23
23
|
let(:attributes) { [Virtus::Attribute.build(String, :name => name)] }
|
24
|
-
let(:attribute) {
|
24
|
+
let(:attribute) { Virtus::Attribute.build(String, :name => name) }
|
25
25
|
|
26
|
-
it {
|
26
|
+
it { is_expected.to equal(object) }
|
27
27
|
|
28
|
-
it
|
29
|
-
expect { subject }.to change { object.to_a
|
28
|
+
it "replaces the original attribute object" do
|
29
|
+
expect { subject }.to change { object.to_a.map(&:__id__) }.
|
30
|
+
from(attributes.map(&:__id__)).
|
31
|
+
to([attribute.__id__])
|
30
32
|
end
|
31
33
|
end
|
32
34
|
end
|
@@ -11,27 +11,36 @@ describe Virtus::AttributeSet, '#reset' do
|
|
11
11
|
context 'when the parent has no attributes' do
|
12
12
|
let(:parent) { described_class.new }
|
13
13
|
|
14
|
-
it {
|
14
|
+
it { is_expected.to equal(object) }
|
15
15
|
|
16
|
-
|
16
|
+
describe '#to_set' do
|
17
|
+
subject { super().to_set }
|
18
|
+
it { is_expected.to eq(Set[ attribute ]) }
|
19
|
+
end
|
17
20
|
end
|
18
21
|
|
19
22
|
context 'when the parent has attributes that are not duplicates' do
|
20
23
|
let(:parent_attribute) { Virtus::Attribute.build(String, :name => :parent_name) }
|
21
24
|
let(:parent) { described_class.new([ parent_attribute ]) }
|
22
25
|
|
23
|
-
it {
|
26
|
+
it { is_expected.to equal(object) }
|
24
27
|
|
25
|
-
|
28
|
+
describe '#to_set' do
|
29
|
+
subject { super().to_set }
|
30
|
+
it { is_expected.to eq(Set[ attribute, parent_attribute ]) }
|
31
|
+
end
|
26
32
|
end
|
27
33
|
|
28
34
|
context 'when the parent has attributes that are duplicates' do
|
29
35
|
let(:parent_attribute) { Virtus::Attribute.build(String, :name => name) }
|
30
36
|
let(:parent) { described_class.new([ parent_attribute ]) }
|
31
37
|
|
32
|
-
it {
|
38
|
+
it { is_expected.to equal(object) }
|
33
39
|
|
34
|
-
|
40
|
+
describe '#to_set' do
|
41
|
+
subject { super().to_set }
|
42
|
+
it { is_expected.to eq(Set[ attribute ]) }
|
43
|
+
end
|
35
44
|
end
|
36
45
|
|
37
46
|
context 'when the parent has changed' do
|
@@ -39,19 +48,21 @@ describe Virtus::AttributeSet, '#reset' do
|
|
39
48
|
let(:parent) { described_class.new([ parent_attribute ]) }
|
40
49
|
let(:new_attribute) { Virtus::Attribute.build(String, :name => :parent_name) }
|
41
50
|
|
42
|
-
it {
|
51
|
+
it { is_expected.to equal(object) }
|
43
52
|
|
44
53
|
it 'includes changes from the parent' do
|
45
|
-
expect
|
46
|
-
|
47
|
-
|
54
|
+
expect(object.to_set).to eql(Set[attribute, parent_attribute])
|
55
|
+
|
56
|
+
parent << new_attribute
|
57
|
+
|
58
|
+
expect(subject.to_set).to eql(Set[attribute, new_attribute])
|
48
59
|
end
|
49
60
|
end
|
50
61
|
|
51
62
|
context 'when the parent is nil' do
|
52
63
|
let(:parent) { nil }
|
53
64
|
|
54
|
-
it {
|
65
|
+
it { is_expected.to equal(object) }
|
55
66
|
|
56
67
|
it 'includes changes from the parent' do
|
57
68
|
expect { subject }.to_not change { object.to_set }
|
@@ -4,14 +4,15 @@ describe Virtus, '#attribute' do
|
|
4
4
|
let(:name) { :test }
|
5
5
|
let(:options) { {} }
|
6
6
|
|
7
|
-
|
7
|
+
shared_examples_for 'a class with boolean attribute' do
|
8
8
|
subject { Test }
|
9
9
|
|
10
10
|
let(:object) { subject.new }
|
11
11
|
|
12
12
|
it 'defines reader and writer' do
|
13
13
|
object.test = true
|
14
|
-
|
14
|
+
|
15
|
+
expect(object).to be_test
|
15
16
|
end
|
16
17
|
|
17
18
|
it 'defines predicate method' do
|
@@ -21,9 +22,9 @@ describe Virtus, '#attribute' do
|
|
21
22
|
end
|
22
23
|
end
|
23
24
|
|
24
|
-
|
25
|
-
it {
|
26
|
-
it {
|
25
|
+
shared_examples_for 'an object with string attribute' do
|
26
|
+
it { is_expected.to respond_to(:test) }
|
27
|
+
it { is_expected.to respond_to(:test=) }
|
27
28
|
|
28
29
|
it 'can write and read the attribute' do
|
29
30
|
subject.test = :foo
|
@@ -217,8 +218,8 @@ describe Virtus, '#attribute' do
|
|
217
218
|
}
|
218
219
|
}
|
219
220
|
|
220
|
-
it {
|
221
|
-
it {
|
221
|
+
it { is_expected.to respond_to(:test) }
|
222
|
+
it { is_expected.to respond_to(:test=) }
|
222
223
|
|
223
224
|
it 'writes and reads attributes' do
|
224
225
|
subject.test = :foo
|
@@ -9,13 +9,33 @@ describe Virtus, '#freeze' do
|
|
9
9
|
|
10
10
|
attribute :name, String, :default => 'foo', :lazy => true
|
11
11
|
attribute :age, Integer, :default => 30
|
12
|
+
attribute :rand, Float, :default => Proc.new { rand }
|
12
13
|
}
|
13
14
|
}
|
14
15
|
|
15
16
|
let(:object) { model.new }
|
16
17
|
|
17
|
-
it {
|
18
|
+
it { is_expected.to be_frozen }
|
18
19
|
|
19
|
-
|
20
|
-
|
20
|
+
describe '#name' do
|
21
|
+
subject { super().name }
|
22
|
+
it { is_expected.to eql('foo') }
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#age' do
|
26
|
+
subject { super().age }
|
27
|
+
it { is_expected.to be(30) }
|
28
|
+
end
|
29
|
+
|
30
|
+
it "does not change dynamic default values" do
|
31
|
+
original_value = object.rand
|
32
|
+
object.freeze
|
33
|
+
expect(object.rand).to eq original_value
|
34
|
+
end
|
35
|
+
|
36
|
+
it "does not change default attributes that have been explicitly set" do
|
37
|
+
object.rand = 3.14
|
38
|
+
object.freeze
|
39
|
+
expect(object.rand).to eq 3.14
|
40
|
+
end
|
21
41
|
end
|
@@ -1,14 +1,14 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Virtus, '.model' do
|
4
|
-
|
4
|
+
shared_examples_for 'a model with constructor' do
|
5
5
|
it 'accepts attribute hash' do
|
6
6
|
instance = subject.new(:name => 'Jane')
|
7
7
|
expect(instance.name).to eql('Jane')
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
-
|
11
|
+
shared_examples_for 'a model with mass-assignment' do
|
12
12
|
let(:attributes) do
|
13
13
|
{ :name => 'Jane', :something => nil }
|
14
14
|
end
|
@@ -22,7 +22,7 @@ describe Virtus, '.model' do
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
|
25
|
+
shared_examples_for 'a model with strict mode turned off' do
|
26
26
|
it 'has attributes with strict set to false' do
|
27
27
|
expect(subject.send(:attribute_set)[:name]).to_not be_strict
|
28
28
|
end
|
@@ -148,8 +148,8 @@ describe Virtus, '.model' do
|
|
148
148
|
model.send(:include, mod)
|
149
149
|
end
|
150
150
|
|
151
|
-
it {
|
152
|
-
it {
|
151
|
+
it { is_expected.not_to respond_to(:attributes) }
|
152
|
+
it { is_expected.not_to respond_to(:attributes=) }
|
153
153
|
end
|
154
154
|
|
155
155
|
context 'with an instance' do
|
@@ -159,8 +159,39 @@ describe Virtus, '.model' do
|
|
159
159
|
subject.extend(mod)
|
160
160
|
end
|
161
161
|
|
162
|
-
it {
|
163
|
-
it {
|
162
|
+
it { is_expected.not_to respond_to(:attributes) }
|
163
|
+
it { is_expected.not_to respond_to(:attributes=) }
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
context 'when :required is set' do
|
168
|
+
let(:mod) { Virtus.model(:required => false) }
|
169
|
+
let(:model) { Class.new }
|
170
|
+
|
171
|
+
context 'with a class' do
|
172
|
+
subject { model.new }
|
173
|
+
|
174
|
+
before do
|
175
|
+
model.send(:include, mod)
|
176
|
+
model.attribute :name, String
|
177
|
+
end
|
178
|
+
|
179
|
+
it 'has attributes with :required option inherited from module' do
|
180
|
+
expect(model.attribute_set[:name]).to_not be_required
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
context 'with an instance' do
|
185
|
+
subject { model.new }
|
186
|
+
|
187
|
+
before do
|
188
|
+
subject.extend(mod)
|
189
|
+
subject.attribute :name, String
|
190
|
+
end
|
191
|
+
|
192
|
+
it 'has attributes with strict set to true' do
|
193
|
+
expect(subject.send(:attribute_set)[:name]).not_to be_required
|
194
|
+
end
|
164
195
|
end
|
165
196
|
end
|
166
197
|
end
|
@@ -1,14 +1,14 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Virtus, '.module' do
|
4
|
-
|
4
|
+
shared_examples_for 'a valid virtus object' do
|
5
5
|
it 'reads and writes attribute' do
|
6
6
|
instance.name = 'John'
|
7
7
|
expect(instance.name).to eql('John')
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
-
|
11
|
+
shared_examples_for 'an object extended with virtus module' do
|
12
12
|
context 'with default configuration' do
|
13
13
|
subject { Virtus.module }
|
14
14
|
|
@@ -114,4 +114,61 @@ describe Virtus, '.module' do
|
|
114
114
|
end
|
115
115
|
end
|
116
116
|
|
117
|
+
context 'as a peer to another module within a class' do
|
118
|
+
subject { Virtus.module }
|
119
|
+
let(:other) { Module.new }
|
120
|
+
|
121
|
+
before do
|
122
|
+
other.send(:include, Virtus.module)
|
123
|
+
other.attribute :last_name, String, :default => 'Doe'
|
124
|
+
other.attribute :something_else
|
125
|
+
model.send(:include, mod)
|
126
|
+
model.send(:include, other)
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'provides attributes for the model from both modules' do
|
130
|
+
expect(model.attribute_set[:name]).to be_kind_of(Virtus::Attribute)
|
131
|
+
expect(model.attribute_set[:something]).to be_kind_of(Virtus::Attribute)
|
132
|
+
expect(model.attribute_set[:last_name]).to be_kind_of(Virtus::Attribute)
|
133
|
+
expect(model.attribute_set[:something_else]).to be_kind_of(Virtus::Attribute)
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'includes the attributes from both modules' do
|
137
|
+
expect(model.new.attributes.keys).to eq(
|
138
|
+
[:name, :something, :last_name, :something_else]
|
139
|
+
)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
context 'with multiple other modules mixed into it' do
|
144
|
+
subject { Virtus.module }
|
145
|
+
let(:other) { Module.new }
|
146
|
+
let(:yet_another) { Module.new }
|
147
|
+
|
148
|
+
before do
|
149
|
+
other.send(:include, Virtus.module)
|
150
|
+
other.attribute :last_name, String, :default => 'Doe'
|
151
|
+
other.attribute :something_else
|
152
|
+
yet_another.send(:include, Virtus.module)
|
153
|
+
yet_another.send(:include, mod)
|
154
|
+
yet_another.send(:include, other)
|
155
|
+
yet_another.attribute :middle_name, String, :default => 'Foobar'
|
156
|
+
model.send(:include, yet_another)
|
157
|
+
end
|
158
|
+
|
159
|
+
it 'provides attributes for the model from all modules' do
|
160
|
+
expect(model.attribute_set[:name]).to be_kind_of(Virtus::Attribute)
|
161
|
+
expect(model.attribute_set[:something]).to be_kind_of(Virtus::Attribute)
|
162
|
+
expect(model.attribute_set[:last_name]).to be_kind_of(Virtus::Attribute)
|
163
|
+
expect(model.attribute_set[:something_else]).to be_kind_of(Virtus::Attribute)
|
164
|
+
expect(model.attribute_set[:middle_name]).to be_kind_of(Virtus::Attribute)
|
165
|
+
end
|
166
|
+
|
167
|
+
it 'includes the attributes from all modules' do
|
168
|
+
expect(model.new.attributes.keys).to eq(
|
169
|
+
[:name, :something, :last_name, :something_else, :middle_name]
|
170
|
+
)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
117
174
|
end
|
@@ -18,8 +18,15 @@ describe Virtus, '#set_default_attributes!' do
|
|
18
18
|
object.set_default_attributes!
|
19
19
|
end
|
20
20
|
|
21
|
-
it {
|
21
|
+
it { is_expected.to be(object) }
|
22
22
|
|
23
|
-
|
24
|
-
|
23
|
+
describe '#name' do
|
24
|
+
subject { super().name }
|
25
|
+
it { is_expected.to eql('foo') }
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#age' do
|
29
|
+
subject { super().age }
|
30
|
+
it { is_expected.to be(30) }
|
31
|
+
end
|
25
32
|
end
|
@@ -1,13 +1,20 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Virtus::ValueObject do
|
4
|
-
|
4
|
+
shared_examples_for 'a valid value object' do
|
5
5
|
subject { model.new(attributes) }
|
6
6
|
|
7
7
|
let(:attributes) { Hash[:id => 1, :name => 'Jane Doe'] }
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
describe '#id' do
|
10
|
+
subject { super().id }
|
11
|
+
it { is_expected.to be(1) }
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '#name' do
|
15
|
+
subject { super().name }
|
16
|
+
it { is_expected.to eql('Jane Doe') }
|
17
|
+
end
|
11
18
|
|
12
19
|
it 'sets private writers' do
|
13
20
|
expect(subject.class.attribute_set[:id]).to_not be_public_writer
|
@@ -43,7 +50,7 @@ describe Virtus::ValueObject do
|
|
43
50
|
end
|
44
51
|
end
|
45
52
|
|
46
|
-
|
53
|
+
shared_examples_for 'a valid value object with mass-assignment turned on' do
|
47
54
|
subject { model.new }
|
48
55
|
|
49
56
|
it 'disallows mass-assignment' do
|
@@ -95,7 +102,10 @@ describe Virtus::ValueObject do
|
|
95
102
|
|
96
103
|
let(:attributes) { Hash[:id => 1, :name => 'Jane Doe', :email => 'jane@doe.com'] }
|
97
104
|
|
98
|
-
|
105
|
+
describe '#email' do
|
106
|
+
subject { super().email }
|
107
|
+
it { is_expected.to eql('jane@doe.com') }
|
108
|
+
end
|
99
109
|
|
100
110
|
it 'sets private writers for additional values' do
|
101
111
|
expect(subclass.attribute_set[:email]).to_not be_public_writer
|