2 require 'models/customer'
4 class AggregationsTest
< ActiveRecord
::TestCase
7 def test_find_single_value_object
8 assert_equal
50, customers(:david).balance
.amount
9 assert_kind_of Money
, customers(:david).balance
10 assert_equal
300, customers(:david).balance
.exchange_to("DKK").amount
13 def test_find_multiple_value_object
14 assert_equal
customers(:david).address_street
, customers(:david).address
.street
16 customers(:david).address
.close_to
?(Address
.new("Different Street", customers(:david).address_city
, customers(:david).address_country
))
20 def test_change_single_value_object
21 customers(:david).balance
= Money
.new(100)
22 customers(:david).save
23 assert_equal
100, customers(:david).reload
.balance
.amount
26 def test_immutable_value_objects
27 customers(:david).balance
= Money
.new(100)
28 assert_raise(ActiveSupport
::FrozenObjectError) { customers(:david).balance
.instance_eval
{ @amount = 20 } }
31 def test_inferred_mapping
32 assert_equal
"35.544623640962634", customers(:david).gps_location
.latitude
33 assert_equal
"-105.9309951055148", customers(:david).gps_location
.longitude
35 customers(:david).gps_location
= GpsLocation
.new("39x-110")
37 assert_equal
"39", customers(:david).gps_location
.latitude
38 assert_equal
"-110", customers(:david).gps_location
.longitude
40 customers(:david).save
42 customers(:david).reload
44 assert_equal
"39", customers(:david).gps_location
.latitude
45 assert_equal
"-110", customers(:david).gps_location
.longitude
48 def test_reloaded_instance_refreshes_aggregations
49 assert_equal
"35.544623640962634", customers(:david).gps_location
.latitude
50 assert_equal
"-105.9309951055148", customers(:david).gps_location
.longitude
52 Customer
.update_all("gps_location = '24x113'")
53 customers(:david).reload
54 assert_equal
'24x113', customers(:david)['gps_location']
56 assert_equal GpsLocation
.new('24x113'), customers(:david).gps_location
60 assert GpsLocation
.new('39x110') == GpsLocation
.new('39x110')
63 def test_gps_inequality
64 assert GpsLocation
.new('39x110') != GpsLocation
.new('39x111')
67 def test_allow_nil_gps_is_nil
68 assert_equal
nil, customers(:zaphod).gps_location
71 def test_allow_nil_gps_set_to_nil
72 customers(:david).gps_location
= nil
73 customers(:david).save
74 customers(:david).reload
75 assert_equal
nil, customers(:david).gps_location
78 def test_allow_nil_set_address_attributes_to_nil
79 customers(:zaphod).address
= nil
80 assert_equal
nil, customers(:zaphod).attributes
[:address_street]
81 assert_equal
nil, customers(:zaphod).attributes
[:address_city]
82 assert_equal
nil, customers(:zaphod).attributes
[:address_country]
85 def test_allow_nil_address_set_to_nil
86 customers(:zaphod).address
= nil
87 customers(:zaphod).save
88 customers(:zaphod).reload
89 assert_equal
nil, customers(:zaphod).address
92 def test_nil_raises_error_when_allow_nil_is_false
93 assert_raise(NoMethodError
) { customers(:david).balance
= nil }
96 def test_allow_nil_address_loaded_when_only_some_attributes_are_nil
97 customers(:zaphod).address_street
= nil
98 customers(:zaphod).save
99 customers(:zaphod).reload
100 assert_kind_of Address
, customers(:zaphod).address
101 assert
customers(:zaphod).address
.street
.nil?
104 def test_nil_assignment_results_in_nil
105 customers(:david).gps_location
= GpsLocation
.new('39x111')
106 assert_not_equal
nil, customers(:david).gps_location
107 customers(:david).gps_location
= nil
108 assert_equal
nil, customers(:david).gps_location
111 def test_custom_constructor
112 assert_equal
'Barney GUMBLE', customers(:barney).fullname
.to_s
113 assert_kind_of Fullname
, customers(:barney).fullname
116 def test_custom_converter
117 customers(:barney).fullname
= 'Barnoit Gumbleau'
118 assert_equal
'Barnoit GUMBLEAU', customers(:barney).fullname
.to_s
119 assert_kind_of Fullname
, customers(:barney).fullname
123 class DeprecatedAggregationsTest
< ActiveRecord
::TestCase
124 class Person
< ActiveRecord
::Base; end
126 def test_conversion_block_is_deprecated
127 assert_deprecated
'conversion block has been deprecated' do
128 Person
.composed_of(:balance, :class_name => "Money", :mapping => %w(balance amount
)) { |balance
| balance
.to_money
}
132 def test_conversion_block_used_when_converter_option_is_nil
133 assert_deprecated
'conversion block has been deprecated' do
134 Person
.composed_of(:balance, :class_name => "Money", :mapping => %w(balance amount
)) { |balance
| balance
.to_money
}
136 assert_raise(NoMethodError
) { Person
.new
.balance
= 5 }
139 def test_converter_option_overrides_conversion_block
140 assert_deprecated
'conversion block has been deprecated' do
141 Person
.composed_of(:balance, :class_name => "Money", :mapping => %w(balance amount
), :converter => Proc
.new
{ |balance
| Money
.new(balance
) }) { |balance
| balance
.to_money
}
145 assert_nothing_raised
{ person
.balance
= 5 }
146 assert_equal
5, person
.balance
.amount
147 assert_kind_of Money
, person
.balance
151 class OverridingAggregationsTest
< ActiveRecord
::TestCase
153 class DifferentName
; end
155 class Person
< ActiveRecord
::Base
156 composed_of
:composed_of, :mapping => %w(person_first_name first_name
)
159 class DifferentPerson
< Person
160 composed_of
:composed_of, :class_name => 'DifferentName', :mapping => %w(different_person_first_name first_name
)
163 def test_composed_of_aggregation_redefinition_reflections_should_differ_and_not_inherited
164 assert_not_equal Person
.reflect_on_aggregation(:composed_of),
165 DifferentPerson
.reflect_on_aggregation(:composed_of)