Froze rails gems
[depot.git] / vendor / rails / activerecord / test / cases / aggregations_test.rb
1 require "cases/helper"
2 require 'models/customer'
3
4 class AggregationsTest < ActiveRecord::TestCase
5 fixtures :customers
6
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
11 end
12
13 def test_find_multiple_value_object
14 assert_equal customers(:david).address_street, customers(:david).address.street
15 assert(
16 customers(:david).address.close_to?(Address.new("Different Street", customers(:david).address_city, customers(:david).address_country))
17 )
18 end
19
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
24 end
25
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 } }
29 end
30
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
34
35 customers(:david).gps_location = GpsLocation.new("39x-110")
36
37 assert_equal "39", customers(:david).gps_location.latitude
38 assert_equal "-110", customers(:david).gps_location.longitude
39
40 customers(:david).save
41
42 customers(:david).reload
43
44 assert_equal "39", customers(:david).gps_location.latitude
45 assert_equal "-110", customers(:david).gps_location.longitude
46 end
47
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
51
52 Customer.update_all("gps_location = '24x113'")
53 customers(:david).reload
54 assert_equal '24x113', customers(:david)['gps_location']
55
56 assert_equal GpsLocation.new('24x113'), customers(:david).gps_location
57 end
58
59 def test_gps_equality
60 assert GpsLocation.new('39x110') == GpsLocation.new('39x110')
61 end
62
63 def test_gps_inequality
64 assert GpsLocation.new('39x110') != GpsLocation.new('39x111')
65 end
66
67 def test_allow_nil_gps_is_nil
68 assert_equal nil, customers(:zaphod).gps_location
69 end
70
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
76 end
77
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]
83 end
84
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
90 end
91
92 def test_nil_raises_error_when_allow_nil_is_false
93 assert_raise(NoMethodError) { customers(:david).balance = nil }
94 end
95
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?
102 end
103
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
109 end
110
111 def test_custom_constructor
112 assert_equal 'Barney GUMBLE', customers(:barney).fullname.to_s
113 assert_kind_of Fullname, customers(:barney).fullname
114 end
115
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
120 end
121 end
122
123 class DeprecatedAggregationsTest < ActiveRecord::TestCase
124 class Person < ActiveRecord::Base; end
125
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 }
129 end
130 end
131
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 }
135 end
136 assert_raise(NoMethodError) { Person.new.balance = 5 }
137 end
138
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 }
142 end
143
144 person = Person.new
145 assert_nothing_raised { person.balance = 5 }
146 assert_equal 5, person.balance.amount
147 assert_kind_of Money, person.balance
148 end
149 end
150
151 class OverridingAggregationsTest < ActiveRecord::TestCase
152 class Name; end
153 class DifferentName; end
154
155 class Person < ActiveRecord::Base
156 composed_of :composed_of, :mapping => %w(person_first_name first_name)
157 end
158
159 class DifferentPerson < Person
160 composed_of :composed_of, :class_name => 'DifferentName', :mapping => %w(different_person_first_name first_name)
161 end
162
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)
166 end
167 end