aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/test
diff options
context:
space:
mode:
Diffstat (limited to 'activerecord/test')
-rw-r--r--activerecord/test/cases/associations/join_model_test.rb2
-rwxr-xr-xactiverecord/test/cases/associations_test.rb63
-rw-r--r--activerecord/test/fixtures/clubs.yml6
-rw-r--r--activerecord/test/fixtures/members.yml4
-rw-r--r--activerecord/test/fixtures/memberships.yml20
-rw-r--r--activerecord/test/fixtures/sponsors.yml3
-rw-r--r--activerecord/test/models/club.rb6
-rw-r--r--activerecord/test/models/member.rb9
-rw-r--r--activerecord/test/models/membership.rb9
-rw-r--r--activerecord/test/models/sponsor.rb4
-rw-r--r--activerecord/test/schema/schema.rb21
11 files changed, 145 insertions, 2 deletions
diff --git a/activerecord/test/cases/associations/join_model_test.rb b/activerecord/test/cases/associations/join_model_test.rb
index 1034cb67e9..3d59b97f70 100644
--- a/activerecord/test/cases/associations/join_model_test.rb
+++ b/activerecord/test/cases/associations/join_model_test.rb
@@ -631,7 +631,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
assert_equal comments.first.post, comments[1].post
end
end
-
+
private
# create dynamic Post models to allow different dependency options
def find_post_with_dependency(post_id, association, association_name, dependency)
diff --git a/activerecord/test/cases/associations_test.rb b/activerecord/test/cases/associations_test.rb
index 50643066b9..768d2b2600 100755
--- a/activerecord/test/cases/associations_test.rb
+++ b/activerecord/test/cases/associations_test.rb
@@ -20,6 +20,10 @@ require 'models/parrot'
require 'models/pirate'
require 'models/treasure'
require 'models/price_estimate'
+require 'models/club'
+require 'models/member'
+require 'models/membership'
+require 'models/sponsor'
class AssociationsTest < ActiveRecord::TestCase
fixtures :accounts, :companies, :developers, :projects, :developers_projects,
@@ -186,7 +190,7 @@ class HasOneAssociationsTest < ActiveRecord::TestCase
assert_equal companies(:first_firm).account, Account.find(1)
assert_equal Account.find(1).credit_limit, companies(:first_firm).account.credit_limit
end
-
+
def test_has_one_cache_nils
firm = companies(:another_firm)
assert_queries(1) { assert_nil firm.account }
@@ -476,6 +480,63 @@ class HasOneAssociationsTest < ActiveRecord::TestCase
end
+class HasOneThroughAssociationsTest < ActiveRecord::TestCase
+ fixtures :members, :clubs, :memberships, :sponsors
+
+ def setup
+ @member = members(:groucho)
+ end
+
+ def test_has_one_through_with_has_one
+ assert_equal clubs(:boring_club), @member.club
+ end
+
+ def test_has_one_through_with_has_many
+ assert_equal clubs(:moustache_club), @member.favourite_club
+ end
+
+ def test_creating_association_creates_through_record
+ new_member = Member.create(:name => "Chris")
+ new_member.club = Club.create(:name => "LRUG")
+ assert_not_nil new_member.current_membership
+ assert_not_nil new_member.club
+ end
+
+ def test_replace_target_record
+ new_club = Club.create(:name => "Marx Bros")
+ @member.club = new_club
+ @member.reload
+ assert_equal new_club, @member.club
+ end
+
+ def test_replacing_target_record_deletes_old_association
+ assert_no_difference "Membership.count" do
+ new_club = Club.create(:name => "Bananarama")
+ @member.club = new_club
+ @member.reload
+ end
+ end
+
+ def test_has_one_through_polymorphic
+ assert_equal clubs(:moustache_club), @member.sponsor_club
+ end
+
+ def has_one_through_to_has_many
+ assert_equal 2, @member.fellow_members.size
+ end
+
+ def test_has_one_through_eager_loading
+ members = Member.find(:all, :include => :club)
+ assert_equal 2, members.size
+ assert_not_nil assert_no_queries {members[0].club}
+ end
+
+ def test_has_one_through_eager_loading_through_polymorphic
+ members = Member.find(:all, :include => :sponsor_club)
+ assert_equal 2, members.size
+ assert_not_nil assert_no_queries {members[0].sponsor_club}
+ end
+end
class HasManyAssociationsTest < ActiveRecord::TestCase
fixtures :accounts, :companies, :developers, :projects,
diff --git a/activerecord/test/fixtures/clubs.yml b/activerecord/test/fixtures/clubs.yml
new file mode 100644
index 0000000000..1986d28229
--- /dev/null
+++ b/activerecord/test/fixtures/clubs.yml
@@ -0,0 +1,6 @@
+boring_club:
+ name: Banana appreciation society
+moustache_club:
+ name: Moustache and Eyebrow Fancier Club
+crazy_club:
+ name: Skull and bones \ No newline at end of file
diff --git a/activerecord/test/fixtures/members.yml b/activerecord/test/fixtures/members.yml
new file mode 100644
index 0000000000..67a6cc459a
--- /dev/null
+++ b/activerecord/test/fixtures/members.yml
@@ -0,0 +1,4 @@
+groucho:
+ name: Groucho Marx
+some_other_guy:
+ name: Englebert Humperdink \ No newline at end of file
diff --git a/activerecord/test/fixtures/memberships.yml b/activerecord/test/fixtures/memberships.yml
new file mode 100644
index 0000000000..99fbe46d9b
--- /dev/null
+++ b/activerecord/test/fixtures/memberships.yml
@@ -0,0 +1,20 @@
+membership_of_boring_club:
+ joined_on: <%= 3.weeks.ago.to_s(:db) %>
+ club: boring_club
+ member: groucho
+ favourite: false
+ type: CurrentMembership
+
+membership_of_favourite_club:
+ joined_on: <%= 3.weeks.ago.to_s(:db) %>
+ club: moustache_club
+ member: groucho
+ favourite: true
+ type: Membership
+
+other_guys_membership:
+ joined_on: <%= 4.weeks.ago.to_s(:db) %>
+ club: boring_club
+ member: some_other_guy
+ favourite: false
+ type: CurrentMembership
diff --git a/activerecord/test/fixtures/sponsors.yml b/activerecord/test/fixtures/sponsors.yml
new file mode 100644
index 0000000000..c116df0534
--- /dev/null
+++ b/activerecord/test/fixtures/sponsors.yml
@@ -0,0 +1,3 @@
+moustache_club_sponsor_for_groucho:
+ sponsor_club: moustache_club
+ sponsorable: groucho (Member) \ No newline at end of file
diff --git a/activerecord/test/models/club.rb b/activerecord/test/models/club.rb
new file mode 100644
index 0000000000..171445df3e
--- /dev/null
+++ b/activerecord/test/models/club.rb
@@ -0,0 +1,6 @@
+class Club < ActiveRecord::Base
+ has_many :memberships
+ has_many :members, :through => :memberships
+ has_many :current_memberships
+ has_many :sponsors
+end \ No newline at end of file
diff --git a/activerecord/test/models/member.rb b/activerecord/test/models/member.rb
new file mode 100644
index 0000000000..688725f200
--- /dev/null
+++ b/activerecord/test/models/member.rb
@@ -0,0 +1,9 @@
+class Member < ActiveRecord::Base
+ has_one :current_membership
+ has_many :memberships
+ has_many :fellow_members, :through => :club, :source => :members
+ has_one :club, :through => :current_membership
+ has_one :favourite_club, :through => :memberships, :conditions => ["memberships.favourite = ?", true], :source => :club
+ has_one :sponsor, :as => :sponsorable
+ has_one :sponsor_club, :through => :sponsor
+end \ No newline at end of file
diff --git a/activerecord/test/models/membership.rb b/activerecord/test/models/membership.rb
new file mode 100644
index 0000000000..905f948c37
--- /dev/null
+++ b/activerecord/test/models/membership.rb
@@ -0,0 +1,9 @@
+class Membership < ActiveRecord::Base
+ belongs_to :member
+ belongs_to :club
+end
+
+class CurrentMembership < Membership
+ belongs_to :member
+ belongs_to :club
+end
diff --git a/activerecord/test/models/sponsor.rb b/activerecord/test/models/sponsor.rb
new file mode 100644
index 0000000000..50c2c2d76c
--- /dev/null
+++ b/activerecord/test/models/sponsor.rb
@@ -0,0 +1,4 @@
+class Sponsor < ActiveRecord::Base
+ belongs_to :sponsor_club, :class_name => "Club", :foreign_key => "club_id"
+ belongs_to :sponsorable, :polymorphic => true
+end \ No newline at end of file
diff --git a/activerecord/test/schema/schema.rb b/activerecord/test/schema/schema.rb
index 33aa6e2ea4..724226c359 100644
--- a/activerecord/test/schema/schema.rb
+++ b/activerecord/test/schema/schema.rb
@@ -49,6 +49,10 @@ ActiveRecord::Schema.define do
t.integer :category_id, :null => false
t.integer :post_id, :null => false
end
+
+ create_table :clubs, :force => true do |t|
+ t.string :name
+ end
create_table :colnametests, :force => true do |t|
t.integer :references, :null => false
@@ -117,6 +121,17 @@ ActiveRecord::Schema.define do
t.integer :version, :null => false, :default => 0
end
+ create_table :members, :force => true do |t|
+ t.string :name
+ end
+
+ create_table :memberships, :force => true do |t|
+ t.datetime :joined_on
+ t.integer :club_id, :member_id
+ t.boolean :favourite, :default => false
+ t.string :type
+ end
+
create_table :minimalistics, :force => true do |t|
end
@@ -177,6 +192,12 @@ ActiveRecord::Schema.define do
t.integer :post_id, :null => false
t.integer :person_id, :null => false
end
+
+ create_table :sponsors, :force => true do |t|
+ t.integer :club_id
+ t.integer :sponsorable_id
+ t.integer :sponsorable_type
+ end
create_table :subscribers, :force => true, :id => false do |t|
t.string :nick, :null => false