3 require 'models/member'
4 require 'models/membership'
5 require 'models/sponsor'
6 require 'models/organization'
7 require 'models/member_detail'
9 class HasOneThroughAssociationsTest
< ActiveRecord
::TestCase
10 fixtures
:members, :clubs, :memberships, :sponsors, :organizations
13 @member = members(:groucho)
16 def test_has_one_through_with_has_one
17 assert_equal
clubs(:boring_club), @member.club
20 def test_has_one_through_with_has_many
21 assert_equal
clubs(:moustache_club), @member.favourite_club
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
31 def test_replace_target_record
32 new_club
= Club
.create(:name => "Marx Bros")
33 @member.club
= new_club
35 assert_equal new_club
, @member.club
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
46 def test_has_one_through_polymorphic
47 assert_equal
clubs(:moustache_club), @member.sponsor_club
50 def has_one_through_to_has_many
51 assert_equal
2, @member.fellow_members
.size
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"])
58 assert_equal
1, members
.size
59 assert_not_nil assert_no_queries
{members
[0].club
}
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"])
66 assert_equal
1, members
.size
67 assert_not_nil assert_no_queries
{members
[0].sponsor_club
}
70 def test_has_one_through_polymorphic_with_source_type
71 assert_equal
members(:groucho), clubs(:moustache_club).sponsored_member
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
}
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
84 assert_equal
1, members
.size
85 assert_not_nil assert_no_queries
{members
[0].club
}
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
92 assert_equal
1, members
.size
93 assert_not_nil assert_no_queries
{members
[0].sponsor_club
}
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
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
106 def test_uninitialized_has_one_through_should_return_nil_for_unsaved_record
107 assert_nil Member
.new
.club
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
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
}
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)
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
133 assert_equal
@organization, @member.organization
134 assert
@organization.members
.include?(@member)
135 assert_equal
'Extra', @member.member_detail
.extra_data
138 def test_reassigning_has_one_through
139 @organization = organizations(:nsa)
140 @new_organization = organizations(:discordians)
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
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)
152 assert_no_difference
'MemberDetail.count' do
153 @member.organization
= @new_organization
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)