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