Updated README.rdoc again
[feedcatcher.git] / vendor / rails / activerecord / test / cases / associations / has_one_through_associations_test.rb
1 require "cases/helper"
2 require 'models/club'
3 require 'models/member_type'
4 require 'models/member'
5 require 'models/membership'
6 require 'models/sponsor'
7 require 'models/organization'
8 require 'models/member_detail'
9
10 class HasOneThroughAssociationsTest < ActiveRecord::TestCase
11 fixtures :member_types, :members, :clubs, :memberships, :sponsors, :organizations
12
13 def setup
14 @member = members(:groucho)
15 end
16
17 def test_has_one_through_with_has_one
18 assert_equal clubs(:boring_club), @member.club
19 end
20
21 def test_has_one_through_with_has_many
22 assert_equal clubs(:moustache_club), @member.favourite_club
23 end
24
25 def test_creating_association_creates_through_record
26 new_member = Member.create(:name => "Chris")
27 new_member.club = Club.create(:name => "LRUG")
28 assert_not_nil new_member.current_membership
29 assert_not_nil new_member.club
30 end
31
32 def test_replace_target_record
33 new_club = Club.create(:name => "Marx Bros")
34 @member.club = new_club
35 @member.reload
36 assert_equal new_club, @member.club
37 end
38
39 def test_replacing_target_record_deletes_old_association
40 assert_no_difference "Membership.count" do
41 new_club = Club.create(:name => "Bananarama")
42 @member.club = new_club
43 @member.reload
44 end
45 end
46
47 def test_has_one_through_polymorphic
48 assert_equal clubs(:moustache_club), @member.sponsor_club
49 end
50
51 def has_one_through_to_has_many
52 assert_equal 2, @member.fellow_members.size
53 end
54
55 def test_has_one_through_eager_loading
56 members = assert_queries(3) do #base table, through table, clubs table
57 Member.find(:all, :include => :club, :conditions => ["name = ?", "Groucho Marx"])
58 end
59 assert_equal 1, members.size
60 assert_not_nil assert_no_queries {members[0].club}
61 end
62
63 def test_has_one_through_eager_loading_through_polymorphic
64 members = assert_queries(3) do #base table, through table, clubs table
65 Member.find(:all, :include => :sponsor_club, :conditions => ["name = ?", "Groucho Marx"])
66 end
67 assert_equal 1, members.size
68 assert_not_nil assert_no_queries {members[0].sponsor_club}
69 end
70
71 def test_has_one_through_polymorphic_with_source_type
72 assert_equal members(:groucho), clubs(:moustache_club).sponsored_member
73 end
74
75 def test_eager_has_one_through_polymorphic_with_source_type
76 clubs = Club.find(:all, :include => :sponsored_member, :conditions => ["name = ?","Moustache and Eyebrow Fancier Club"])
77 # Only the eyebrow fanciers club has a sponsored_member
78 assert_not_nil assert_no_queries {clubs[0].sponsored_member}
79 end
80
81 def test_has_one_through_nonpreload_eagerloading
82 members = assert_queries(1) do
83 Member.find(:all, :include => :club, :conditions => ["members.name = ?", "Groucho Marx"], :order => 'clubs.name') #force fallback
84 end
85 assert_equal 1, members.size
86 assert_not_nil assert_no_queries {members[0].club}
87 end
88
89 def test_has_one_through_nonpreload_eager_loading_through_polymorphic
90 members = assert_queries(1) do
91 Member.find(:all, :include => :sponsor_club, :conditions => ["members.name = ?", "Groucho Marx"], :order => 'clubs.name') #force fallback
92 end
93 assert_equal 1, members.size
94 assert_not_nil assert_no_queries {members[0].sponsor_club}
95 end
96
97 def test_has_one_through_nonpreload_eager_loading_through_polymorphic_with_more_than_one_through_record
98 Sponsor.new(:sponsor_club => clubs(:crazy_club), :sponsorable => members(:groucho)).save!
99 members = assert_queries(1) do
100 Member.find(:all, :include => :sponsor_club, :conditions => ["members.name = ?", "Groucho Marx"], :order => 'clubs.name DESC') #force fallback
101 end
102 assert_equal 1, members.size
103 assert_not_nil assert_no_queries { members[0].sponsor_club }
104 assert_equal clubs(:crazy_club), members[0].sponsor_club
105 end
106
107 def test_uninitialized_has_one_through_should_return_nil_for_unsaved_record
108 assert_nil Member.new.club
109 end
110
111 def test_assigning_association_correctly_assigns_target
112 new_member = Member.create(:name => "Chris")
113 new_member.club = new_club = Club.create(:name => "LRUG")
114 assert_equal new_club, new_member.club.target
115 end
116
117 def test_has_one_through_proxy_should_not_respond_to_private_methods
118 assert_raise(NoMethodError) { clubs(:moustache_club).private_method }
119 assert_raise(NoMethodError) { @member.club.private_method }
120 end
121
122 def test_has_one_through_proxy_should_respond_to_private_methods_via_send
123 clubs(:moustache_club).send(:private_method)
124 @member.club.send(:private_method)
125 end
126
127 def test_assigning_to_has_one_through_preserves_decorated_join_record
128 @organization = organizations(:nsa)
129 assert_difference 'MemberDetail.count', 1 do
130 @member_detail = MemberDetail.new(:extra_data => 'Extra')
131 @member.member_detail = @member_detail
132 @member.organization = @organization
133 end
134 assert_equal @organization, @member.organization
135 assert @organization.members.include?(@member)
136 assert_equal 'Extra', @member.member_detail.extra_data
137 end
138
139 def test_reassigning_has_one_through
140 @organization = organizations(:nsa)
141 @new_organization = organizations(:discordians)
142
143 assert_difference 'MemberDetail.count', 1 do
144 @member_detail = MemberDetail.new(:extra_data => 'Extra')
145 @member.member_detail = @member_detail
146 @member.organization = @organization
147 end
148 assert_equal @organization, @member.organization
149 assert_equal 'Extra', @member.member_detail.extra_data
150 assert @organization.members.include?(@member)
151 assert !@new_organization.members.include?(@member)
152
153 assert_no_difference 'MemberDetail.count' do
154 @member.organization = @new_organization
155 end
156 assert_equal @new_organization, @member.organization
157 assert_equal 'Extra', @member.member_detail.extra_data
158 assert !@organization.members.include?(@member)
159 assert @new_organization.members.include?(@member)
160 end
161
162 def test_preloading_has_one_through_on_belongs_to
163 assert_not_nil @member.member_type
164 @organization = organizations(:nsa)
165 @member_detail = MemberDetail.new
166 @member.member_detail = @member_detail
167 @member.organization = @organization
168 @member_details = assert_queries(3) do
169 MemberDetail.find(:all, :include => :member_type)
170 end
171 @new_detail = @member_details[0]
172 assert @new_detail.loaded_member_type?
173 assert_not_nil assert_no_queries { @new_detail.member_type }
174 end
175
176 def test_save_of_record_with_loaded_has_one_through
177 @club = @member.club
178 assert_not_nil @club.sponsored_member
179
180 assert_nothing_raised do
181 Club.find(@club.id).save!
182 Club.find(@club.id, :include => :sponsored_member).save!
183 end
184
185 @club.sponsor.destroy
186
187 assert_nothing_raised do
188 Club.find(@club.id).save!
189 Club.find(@club.id, :include => :sponsored_member).save!
190 end
191 end
192 end