setsumei 0.0.10 → 0.0.12
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 +7 -0
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +1 -0
- data/.travis.yml +7 -0
- data/README.md +1 -0
- data/Rakefile +7 -0
- data/lib/setsumei/describable.rb +17 -18
- data/lib/setsumei/describable/attribute.rb +43 -0
- data/lib/setsumei/describable/boolean_attribute.rb +4 -29
- data/lib/setsumei/describable/date_time_attribute.rb +21 -0
- data/lib/setsumei/describable/float_attribute.rb +4 -29
- data/lib/setsumei/describable/int_attribute.rb +4 -28
- data/lib/setsumei/describable/object_attribute.rb +9 -35
- data/lib/setsumei/describable/string_attribute.rb +4 -28
- data/lib/setsumei/version.rb +1 -1
- data/setsumei.gemspec +3 -2
- data/spec/setsumei/describable/attribute_spec.rb +94 -0
- data/spec/setsumei/describable/boolean_attribute_spec.rb +13 -71
- data/spec/setsumei/describable/date_attribute_spec.rb +18 -79
- data/spec/setsumei/describable/float_attribute_spec.rb +8 -69
- data/spec/setsumei/describable/int_attribute_spec.rb +10 -69
- data/spec/setsumei/describable/object_attribute_spec.rb +20 -75
- data/spec/setsumei/describable/string_attribute_spec.rb +7 -66
- data/spec/setsumei/describable/time_attribute_spec.rb +20 -78
- data/spec/setsumei/describable_spec.rb +2 -2
- data/spec/spec_helper.rb +0 -1
- data/spec/support/shared_examples/attribute_options.rb +4 -4
- data/spec/support/shared_examples/attribute_type_creation.rb +1 -1
- metadata +65 -35
- metadata.gz.sig +3 -0
- data/lib/setsumei/describable/date_attribute.rb +0 -40
- data/lib/setsumei/describable/time_attribute.rb +0 -40
- data/spec/support/shared_examples/attribute_lookup_key_support.rb +0 -15
@@ -3,89 +3,31 @@ require 'spec_helper'
|
|
3
3
|
module Setsumei
|
4
4
|
module Describable
|
5
5
|
describe BooleanAttribute do
|
6
|
-
its(:name) { should == nil }
|
7
6
|
|
8
|
-
describe "
|
9
|
-
|
7
|
+
describe "#== other" do
|
8
|
+
subject { BooleanAttribute.new }
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
it {
|
14
|
-
its(:name) { should == name }
|
15
|
-
|
16
|
-
it_should_behave_like "it handles options properly"
|
10
|
+
it { should == :boolean }
|
11
|
+
it { should == BooleanAttribute }
|
12
|
+
it { should_not eq double }
|
17
13
|
end
|
18
14
|
|
19
|
-
describe "#
|
15
|
+
describe "#cast value" do
|
20
16
|
let(:boolean_attribute) { BooleanAttribute.new }
|
21
17
|
|
22
18
|
context "where the value is a boolean" do
|
23
|
-
specify { boolean_attribute.
|
24
|
-
specify { boolean_attribute.
|
19
|
+
specify { boolean_attribute.cast(true).should === true }
|
20
|
+
specify { boolean_attribute.cast(false).should === false }
|
25
21
|
end
|
26
22
|
context "where the value isn't a boolean" do
|
27
|
-
specify { boolean_attribute.
|
28
|
-
specify { boolean_attribute.
|
29
|
-
specify { boolean_attribute.
|
30
|
-
specify { boolean_attribute.
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
describe "#is_an_attribute_of_type?" do
|
35
|
-
let(:boolean_attribute) { BooleanAttribute.new }
|
36
|
-
|
37
|
-
subject { boolean_attribute.is_an_attribute_of_type? type }
|
38
|
-
|
39
|
-
context "where type is :boolean" do
|
40
|
-
let(:type) { :boolean }
|
41
|
-
it { should be_true }
|
42
|
-
end
|
43
|
-
|
44
|
-
context "where type is BooleanAttribute" do
|
45
|
-
let(:type) { BooleanAttribute }
|
46
|
-
it { should be_true }
|
47
|
-
end
|
48
|
-
|
49
|
-
context "where type is unknown" do
|
50
|
-
let(:type) { mock "an unknown type" }
|
51
|
-
it { should be_false }
|
23
|
+
specify { boolean_attribute.cast("false").should === false }
|
24
|
+
specify { boolean_attribute.cast("true").should === true }
|
25
|
+
specify { boolean_attribute.cast("True").should === true }
|
26
|
+
specify { boolean_attribute.cast("1").should === true }
|
52
27
|
end
|
53
28
|
end
|
54
29
|
|
55
|
-
describe "set_value_on object, from_value_in: hash" do
|
56
|
-
let(:hash) { Hash.new }
|
57
|
-
let(:key) { "key" }
|
58
|
-
let(:hash_keys) { mock "hash_keys" }
|
59
|
-
let(:value_in_hash) { mock "value_in_hash" }
|
60
|
-
|
61
|
-
let(:object) { mock "object", :my_boolean_attribute= => nil }
|
62
|
-
|
63
|
-
let(:boolean_attribute) { BooleanAttribute.named :my_boolean_attribute }
|
64
|
-
let(:converted_value) { mock "converted_value" }
|
65
|
-
|
66
|
-
before do
|
67
|
-
Build::Key.stub(:for).and_return(key)
|
68
|
-
hash[key] = value_in_hash
|
69
|
-
boolean_attribute.stub(:value_for).and_return(converted_value)
|
70
|
-
end
|
71
|
-
|
72
|
-
subject { boolean_attribute.set_value_on object, from_value_in: hash }
|
73
|
-
|
74
|
-
it "should detect the key it should use to retrieve the value from the hash" do
|
75
|
-
hash.should_receive(:keys).and_return(hash_keys)
|
76
|
-
Build::Key.should_receive(:for).with(:my_boolean_attribute, given: hash_keys ).and_return(key)
|
77
|
-
subject
|
78
|
-
end
|
79
|
-
it "should convert the value" do
|
80
|
-
boolean_attribute.should_receive(:value_for).with(value_in_hash).and_return(converted_value)
|
81
|
-
subject
|
82
|
-
end
|
83
|
-
it "should pass object a value to the attribute described by this class" do
|
84
|
-
object.should_receive(:my_boolean_attribute=).with(converted_value)
|
85
|
-
subject
|
86
|
-
end
|
87
|
-
it_should_behave_like "it handles lookup keys properly"
|
88
|
-
end
|
89
30
|
end
|
90
31
|
end
|
91
32
|
end
|
33
|
+
|
@@ -2,100 +2,39 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module Setsumei
|
4
4
|
module Describable
|
5
|
-
describe
|
6
|
-
its(:name) { should == nil }
|
5
|
+
describe DateTimeAttribute do
|
7
6
|
|
8
|
-
describe "
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
it { should be_a DateAttribute }
|
14
|
-
its(:name) { should == name }
|
15
|
-
its(:format) { should == '%Y-%m-%d' }
|
16
|
-
|
17
|
-
context 'format specified' do
|
18
|
-
let(:format) { mock "format" }
|
19
|
-
|
20
|
-
subject { DateAttribute.named name, format: format }
|
21
|
-
|
22
|
-
its(:format) { should == format }
|
7
|
+
describe "#initialize(format)" do
|
8
|
+
it 'is configurable' do
|
9
|
+
format = double
|
10
|
+
DateTimeAttribute.new(:date, format, Date).format.should == format
|
23
11
|
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "#== other" do
|
15
|
+
subject { DateTimeAttribute.new :date, '%Y-%m-%d', Date }
|
24
16
|
|
25
|
-
|
17
|
+
it { should == :date }
|
18
|
+
it { should == DateTimeAttribute }
|
19
|
+
it { should_not eq double }
|
26
20
|
end
|
27
21
|
|
28
|
-
describe "#value_for(pre_type_cast_value)" do
|
29
|
-
let(:attribute) { DateAttribute.new }
|
30
22
|
|
31
|
-
|
23
|
+
describe "#cast value" do
|
24
|
+
let(:attribute) { DateTimeAttribute.new :date, '%Y-%m-%d', Date }
|
25
|
+
|
26
|
+
subject { attribute.cast value }
|
32
27
|
|
33
28
|
context "where pre_type_cast_value is a string" do
|
34
|
-
let(:
|
29
|
+
let(:value) { "time" }
|
35
30
|
let(:formatted_value) { mock "formatted_value" }
|
36
31
|
|
37
32
|
it "should parse it into a time with format" do
|
38
|
-
Date.should_receive(:strptime).with(
|
33
|
+
Date.should_receive(:strptime).with(value,'%Y-%m-%d').and_return(formatted_value)
|
39
34
|
subject.should == formatted_value
|
40
35
|
end
|
41
36
|
end
|
42
37
|
end
|
43
|
-
|
44
|
-
describe "#is_an_attribute_of_type?" do
|
45
|
-
let(:attribute) { DateAttribute.new }
|
46
|
-
|
47
|
-
subject { attribute.is_an_attribute_of_type? type }
|
48
|
-
|
49
|
-
context "where type is :date" do
|
50
|
-
let(:type) { :date }
|
51
|
-
it { should be_true }
|
52
|
-
end
|
53
|
-
|
54
|
-
context "where type is DateAttribute" do
|
55
|
-
let(:type) { DateAttribute }
|
56
|
-
it { should be_true }
|
57
|
-
end
|
58
|
-
|
59
|
-
context "where type is unknown" do
|
60
|
-
let(:type) { mock "an unknown type" }
|
61
|
-
it { should be_false }
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
describe "set_value_on object, from_value_in: hash" do
|
66
|
-
let(:hash) { Hash.new }
|
67
|
-
let(:key) { "key" }
|
68
|
-
let(:hash_keys) { mock "hash_keys" }
|
69
|
-
let(:value_in_hash) { mock "value_in_hash" }
|
70
|
-
let(:converted_value) { mock "converted_value" }
|
71
|
-
|
72
|
-
let(:object) { mock "object", :my_date_attribute= => nil }
|
73
|
-
|
74
|
-
let(:date_attribute) { DateAttribute.named :my_date_attribute }
|
75
|
-
|
76
|
-
before do
|
77
|
-
Build::Key.stub(:for).and_return(key)
|
78
|
-
hash[key] = value_in_hash
|
79
|
-
date_attribute.stub(:value_for).and_return(converted_value)
|
80
|
-
end
|
81
|
-
|
82
|
-
subject { date_attribute.set_value_on object, from_value_in: hash }
|
83
|
-
|
84
|
-
it "should detect the key it should use to retrieve the value from the hash" do
|
85
|
-
hash.should_receive(:keys).and_return(hash_keys)
|
86
|
-
Build::Key.should_receive(:for).with(:my_date_attribute, given: hash_keys ).and_return(key)
|
87
|
-
subject
|
88
|
-
end
|
89
|
-
it "should convert the value" do
|
90
|
-
date_attribute.should_receive(:value_for).with(value_in_hash).and_return(converted_value)
|
91
|
-
subject
|
92
|
-
end
|
93
|
-
it "should pass object a value to the attribute described by this class" do
|
94
|
-
object.should_receive(:my_date_attribute=).with(converted_value)
|
95
|
-
subject
|
96
|
-
end
|
97
|
-
it_should_behave_like "it handles lookup keys properly"
|
98
|
-
end
|
99
38
|
end
|
100
39
|
end
|
101
40
|
end
|
@@ -3,87 +3,26 @@ require 'spec_helper'
|
|
3
3
|
module Setsumei
|
4
4
|
module Describable
|
5
5
|
describe FloatAttribute do
|
6
|
-
its(:name) { should == nil }
|
7
6
|
|
8
|
-
describe "
|
9
|
-
|
7
|
+
describe "#== other" do
|
8
|
+
subject { FloatAttribute.new }
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
it {
|
14
|
-
its(:name) { should == name }
|
15
|
-
|
16
|
-
it_should_behave_like "it handles options properly"
|
10
|
+
it { should == :float }
|
11
|
+
it { should == FloatAttribute }
|
12
|
+
it { should_not eq double }
|
17
13
|
end
|
18
14
|
|
19
|
-
describe "#
|
15
|
+
describe "#cast value" do
|
20
16
|
let(:float_attribute) { FloatAttribute.new }
|
21
17
|
|
22
|
-
subject { float_attribute.value_for pre_type_cast_value }
|
23
|
-
|
24
18
|
context "where the value is a float" do
|
25
|
-
specify { float_attribute.
|
19
|
+
specify { float_attribute.cast(10.2).should == 10.2 }
|
26
20
|
end
|
27
21
|
context "where the value isn't a float" do
|
28
|
-
specify { float_attribute.
|
22
|
+
specify { float_attribute.cast("10.2").should == 10.2 }
|
29
23
|
end
|
30
24
|
end
|
31
25
|
|
32
|
-
describe "#is_an_attribute_of_type?" do
|
33
|
-
let(:float_attribute) { FloatAttribute.new }
|
34
|
-
|
35
|
-
subject { float_attribute.is_an_attribute_of_type? type }
|
36
|
-
|
37
|
-
context "where type is :float" do
|
38
|
-
let(:type) { :float }
|
39
|
-
it { should be_true }
|
40
|
-
end
|
41
|
-
|
42
|
-
context "where type is FloatAttribute" do
|
43
|
-
let(:type) { FloatAttribute }
|
44
|
-
it { should be_true }
|
45
|
-
end
|
46
|
-
|
47
|
-
context "where type is unknown" do
|
48
|
-
let(:type) { mock "an unknown type" }
|
49
|
-
it { should be_false }
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
describe "set_value_on object, from_value_in: hash" do
|
54
|
-
let(:hash) { Hash.new }
|
55
|
-
let(:key) { "key" }
|
56
|
-
let(:hash_keys) { mock "hash_keys" }
|
57
|
-
let(:value_in_hash) { mock "value_in_hash" }
|
58
|
-
|
59
|
-
let(:object) { mock "object", :my_float_attribute= => nil }
|
60
|
-
|
61
|
-
let(:float_attribute) { FloatAttribute.named :my_float_attribute }
|
62
|
-
let(:converted_value) { mock "converted_value" }
|
63
|
-
|
64
|
-
before do
|
65
|
-
Build::Key.stub(:for).and_return(key)
|
66
|
-
hash[key] = value_in_hash
|
67
|
-
float_attribute.stub(:value_for).and_return(converted_value)
|
68
|
-
end
|
69
|
-
|
70
|
-
subject { float_attribute.set_value_on object, from_value_in: hash }
|
71
|
-
|
72
|
-
it "should detect the key it should use to retrieve the value from the hash" do
|
73
|
-
hash.should_receive(:keys).and_return(hash_keys)
|
74
|
-
Build::Key.should_receive(:for).with(:my_float_attribute, given: hash_keys ).and_return(key)
|
75
|
-
subject
|
76
|
-
end
|
77
|
-
it "should convert the value" do
|
78
|
-
float_attribute.should_receive(:value_for).with(value_in_hash).and_return(converted_value)
|
79
|
-
subject
|
80
|
-
end
|
81
|
-
it "should pass object a value to the attribute described by this class" do
|
82
|
-
object.should_receive(:my_float_attribute=).with(converted_value)
|
83
|
-
subject
|
84
|
-
end
|
85
|
-
it_should_behave_like "it handles lookup keys properly"
|
86
|
-
end
|
87
26
|
end
|
88
27
|
end
|
89
28
|
end
|
@@ -3,88 +3,29 @@ require 'spec_helper'
|
|
3
3
|
module Setsumei
|
4
4
|
module Describable
|
5
5
|
describe IntAttribute do
|
6
|
-
its(:name) { should == nil }
|
7
6
|
|
8
|
-
describe "
|
9
|
-
|
7
|
+
describe "#== other" do
|
8
|
+
subject { IntAttribute.new }
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
it {
|
14
|
-
its(:name) { should == name }
|
15
|
-
|
16
|
-
it_should_behave_like "it handles options properly"
|
10
|
+
it { should == :int }
|
11
|
+
it { should == IntAttribute }
|
12
|
+
it { should_not eq double }
|
17
13
|
end
|
18
14
|
|
19
|
-
describe "#
|
15
|
+
describe "#cast value" do
|
20
16
|
let(:int_attribute) { IntAttribute.new }
|
21
17
|
|
22
|
-
subject { int_attribute.
|
18
|
+
subject { int_attribute.cast pre_type_cast_value }
|
23
19
|
|
24
20
|
context "where the value is a int" do
|
25
|
-
specify { int_attribute.
|
21
|
+
specify { int_attribute.cast(42).should == 42 }
|
26
22
|
end
|
27
23
|
context "where the value isn't a int" do
|
28
|
-
specify { int_attribute.
|
29
|
-
specify { int_attribute.
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
describe "#is_an_attribute_of_type?" do
|
34
|
-
let(:int_attribute) { IntAttribute.new }
|
35
|
-
|
36
|
-
subject { int_attribute.is_an_attribute_of_type? type }
|
37
|
-
|
38
|
-
context "where type is :int" do
|
39
|
-
let(:type) { :int }
|
40
|
-
it { should be_true }
|
41
|
-
end
|
42
|
-
|
43
|
-
context "where type is IntAttribute" do
|
44
|
-
let(:type) { IntAttribute }
|
45
|
-
it { should be_true }
|
46
|
-
end
|
47
|
-
|
48
|
-
context "where type is unknown" do
|
49
|
-
let(:type) { mock "an unknown type" }
|
50
|
-
it { should be_false }
|
24
|
+
specify { int_attribute.cast("10.6").should == 11 }
|
25
|
+
specify { int_attribute.cast("10.4").should == 10 }
|
51
26
|
end
|
52
27
|
end
|
53
28
|
|
54
|
-
describe "set_value_on object, from_value_in: hash" do
|
55
|
-
let(:hash) { Hash.new }
|
56
|
-
let(:key) { "key" }
|
57
|
-
let(:hash_keys) { mock "hash_keys" }
|
58
|
-
let(:value_in_hash) { mock "value_in_hash" }
|
59
|
-
|
60
|
-
let(:object) { mock "object", :my_int_attribute= => nil }
|
61
|
-
|
62
|
-
let(:int_attribute) { IntAttribute.named :my_int_attribute }
|
63
|
-
let(:converted_value) { mock "converted_value" }
|
64
|
-
|
65
|
-
before do
|
66
|
-
Build::Key.stub(:for).and_return(key)
|
67
|
-
hash[key] = value_in_hash
|
68
|
-
int_attribute.stub(:value_for).and_return(converted_value)
|
69
|
-
end
|
70
|
-
|
71
|
-
subject { int_attribute.set_value_on object, from_value_in: hash }
|
72
|
-
|
73
|
-
it "should detect the key it should use to retrieve the value from the hash" do
|
74
|
-
hash.should_receive(:keys).and_return(hash_keys)
|
75
|
-
Build::Key.should_receive(:for).with(:my_int_attribute, given: hash_keys ).and_return(key)
|
76
|
-
subject
|
77
|
-
end
|
78
|
-
it "should convert the value" do
|
79
|
-
int_attribute.should_receive(:value_for).with(value_in_hash).and_return(converted_value)
|
80
|
-
subject
|
81
|
-
end
|
82
|
-
it "should pass object a value to the attribute described by this class" do
|
83
|
-
object.should_receive(:my_int_attribute=).with(converted_value)
|
84
|
-
subject
|
85
|
-
end
|
86
|
-
it_should_behave_like "it handles lookup keys properly"
|
87
|
-
end
|
88
29
|
end
|
89
30
|
end
|
90
31
|
end
|
@@ -3,122 +3,67 @@ require 'spec_helper'
|
|
3
3
|
module Setsumei
|
4
4
|
module Describable
|
5
5
|
describe ObjectAttribute do
|
6
|
-
its(:name) { should == nil }
|
7
|
-
its(:klass) { should == Object }
|
8
6
|
|
9
|
-
describe "
|
10
|
-
let(:name) { :my_object_field }
|
7
|
+
describe "#initialize(klass)" do
|
11
8
|
let(:my_klass) { Class.new }
|
12
9
|
|
13
|
-
subject { ObjectAttribute.
|
10
|
+
subject { ObjectAttribute.new my_klass }
|
14
11
|
|
15
|
-
|
16
|
-
its(:name) { should == name }
|
17
|
-
its(:klass) { should == my_klass }
|
18
|
-
|
19
|
-
context "klass is left off" do
|
20
|
-
subject { ObjectAttribute.named name }
|
21
|
-
specify { expect { subject }.to raise_error ArgumentError }
|
22
|
-
end
|
23
|
-
|
24
|
-
it_should_behave_like "it handles options properly"
|
12
|
+
specify { subject.klass.should == my_klass }
|
25
13
|
end
|
26
14
|
|
27
|
-
describe "#
|
15
|
+
describe "#cast data" do
|
28
16
|
let(:klass) { mock "klass" }
|
29
|
-
let(:
|
30
|
-
let(:object_attribute) { ObjectAttribute.
|
17
|
+
let(:data) { { hash: "with_values" } }
|
18
|
+
let(:object_attribute) { ObjectAttribute.new(klass) }
|
31
19
|
|
32
20
|
before do
|
33
21
|
klass.stub(:create_from).and_raise(NoMethodError)
|
34
22
|
end
|
35
23
|
|
36
|
-
subject { object_attribute.
|
24
|
+
subject { object_attribute.cast data }
|
37
25
|
|
38
26
|
it "should use the Builder to produce a object with klass" do
|
39
|
-
Build.should_receive(:a).with(klass, from:
|
27
|
+
Build.should_receive(:a).with(klass, from: data)
|
40
28
|
subject
|
41
29
|
end
|
42
30
|
|
43
31
|
context "there is no data for this object" do
|
44
32
|
context "empty hash" do
|
45
|
-
let(:
|
33
|
+
let(:data) { {} }
|
46
34
|
it { should be_nil }
|
47
35
|
end
|
48
36
|
context "nil" do
|
49
|
-
let(:
|
37
|
+
let(:data) { nil }
|
50
38
|
it { should be_nil }
|
51
39
|
end
|
52
40
|
end
|
41
|
+
|
53
42
|
context "klass responds to create_from" do
|
54
|
-
let(:pre_fab_object) {
|
43
|
+
let(:pre_fab_object) { double "pre_fab_object" }
|
55
44
|
|
56
45
|
before do
|
57
46
|
klass.unstub(:create_from)
|
58
47
|
end
|
59
48
|
|
60
49
|
it "should build the klass itself" do
|
61
|
-
klass.should_receive(:create_from).with(
|
50
|
+
klass.should_receive(:create_from).with(data).and_return(pre_fab_object)
|
62
51
|
subject.should == pre_fab_object
|
63
52
|
end
|
64
53
|
end
|
65
54
|
end
|
66
55
|
|
67
|
-
describe "
|
68
|
-
let(:
|
69
|
-
|
70
|
-
subject { object_attribute.is_an_attribute_of_type? type }
|
71
|
-
|
72
|
-
context "where type is :object" do
|
73
|
-
let(:type) { :object }
|
74
|
-
it { should be_true }
|
75
|
-
end
|
56
|
+
describe "#== other" do
|
57
|
+
let(:klass) { double }
|
76
58
|
|
77
|
-
|
78
|
-
let(:type) { ObjectAttribute }
|
79
|
-
it { should be_true }
|
80
|
-
end
|
59
|
+
subject { ObjectAttribute.new klass }
|
81
60
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
61
|
+
it { should eq :object }
|
62
|
+
it { should eq klass }
|
63
|
+
it { should eq ObjectAttribute }
|
64
|
+
it { should_not eq double("an unknown type") }
|
86
65
|
end
|
87
66
|
|
88
|
-
describe "set_value_on object, from_value_in: hash" do
|
89
|
-
let(:hash) { Hash.new }
|
90
|
-
let(:key) { "key" }
|
91
|
-
let(:hash_keys) { mock "hash_keys" }
|
92
|
-
let(:value_in_hash) { mock "value_in_hash" }
|
93
|
-
|
94
|
-
let(:object) { mock "object", :my_object_attribute= => nil }
|
95
|
-
|
96
|
-
let(:object_attribute) { ObjectAttribute.named :my_object_attribute, as_a: mock("object_klass") }
|
97
|
-
let(:converted_value) { mock "converted_value" }
|
98
|
-
|
99
|
-
before do
|
100
|
-
Build::Key.stub(:for).and_return(key)
|
101
|
-
hash[key] = value_in_hash
|
102
|
-
object_attribute.stub(:value_for).and_return(converted_value)
|
103
|
-
end
|
104
|
-
|
105
|
-
subject { object_attribute.set_value_on object, from_value_in: hash }
|
106
|
-
|
107
|
-
it "should detect the key it should use to retrieve the value from the hash" do
|
108
|
-
hash.should_receive(:keys).and_return(hash_keys)
|
109
|
-
Build::Key.should_receive(:for).with(:my_object_attribute, given: hash_keys ).and_return(key)
|
110
|
-
subject
|
111
|
-
end
|
112
|
-
it "should convert the value" do
|
113
|
-
object_attribute.should_receive(:value_for).with(value_in_hash).and_return(converted_value)
|
114
|
-
subject
|
115
|
-
end
|
116
|
-
it "should pass object a value to the attribute described by this class" do
|
117
|
-
object.should_receive(:my_object_attribute=).with(converted_value)
|
118
|
-
subject
|
119
|
-
end
|
120
|
-
it_should_behave_like "it handles lookup keys properly"
|
121
|
-
end
|
122
67
|
end
|
123
68
|
end
|
124
69
|
end
|