aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/test/cases/associations/eager_singularization_test.rb
blob: c1d89a2484ec777b81edc5f5f8e93aacf65d88ab (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
require 'abstract_unit'

class Virus < ActiveRecord::Base
  belongs_to :octopus
end
class Octopus < ActiveRecord::Base
  has_one :virus
end
class Pass < ActiveRecord::Base
  belongs_to :bus
end
class Bus < ActiveRecord::Base
  has_many :passes
end
class Mess < ActiveRecord::Base
  has_and_belongs_to_many :crises
end
class Crisis < ActiveRecord::Base
  has_and_belongs_to_many :messes
  has_many :analyses, :dependent => :destroy
  has_many :successes, :through => :analyses
  has_many :dresses, :dependent => :destroy
  has_many :compresses, :through => :dresses
end
class Analysis < ActiveRecord::Base
  belongs_to :crisis
  belongs_to :success
end
class Success < ActiveRecord::Base
  has_many :analyses, :dependent => :destroy
  has_many :crises, :through => :analyses
end
class Dress < ActiveRecord::Base
  belongs_to :crisis
  has_many :compresses
end
class Compress < ActiveRecord::Base
  belongs_to :dress
end


class EagerSingularizationTest < ActiveSupport::TestCase

  def setup
    if ActiveRecord::Base.connection.supports_migrations?
      ActiveRecord::Base.connection.create_table :viri do |t|
        t.column :octopus_id, :integer
        t.column :species, :string
      end
      ActiveRecord::Base.connection.create_table :octopi do |t|
        t.column :species, :string
      end
      ActiveRecord::Base.connection.create_table :passes do |t|
        t.column :bus_id, :integer
        t.column :rides, :integer
      end
      ActiveRecord::Base.connection.create_table :buses do |t|
        t.column :name, :string
      end
      ActiveRecord::Base.connection.create_table :crises_messes, :id => false do |t|
        t.column :crisis_id, :integer
        t.column :mess_id, :integer
      end
      ActiveRecord::Base.connection.create_table :messes do |t|
        t.column :name, :string
      end
      ActiveRecord::Base.connection.create_table :crises do |t|
        t.column :name, :string
      end
      ActiveRecord::Base.connection.create_table :successes do |t|
        t.column :name, :string
      end
      ActiveRecord::Base.connection.create_table :analyses do |t|
        t.column :crisis_id, :integer
        t.column :success_id, :integer
      end
      ActiveRecord::Base.connection.create_table :dresses do |t|
        t.column :crisis_id, :integer
      end
      ActiveRecord::Base.connection.create_table :compresses do |t|
        t.column :dress_id, :integer
      end
      @have_tables = true
    else
      @have_tables = false
    end
  end

  def teardown
    ActiveRecord::Base.connection.drop_table :viri
    ActiveRecord::Base.connection.drop_table :octopi
    ActiveRecord::Base.connection.drop_table :passes
    ActiveRecord::Base.connection.drop_table :buses
    ActiveRecord::Base.connection.drop_table :crises_messes
    ActiveRecord::Base.connection.drop_table :messes
    ActiveRecord::Base.connection.drop_table :crises
    ActiveRecord::Base.connection.drop_table :successes
    ActiveRecord::Base.connection.drop_table :analyses
    ActiveRecord::Base.connection.drop_table :dresses
    ActiveRecord::Base.connection.drop_table :compresses
  end

  def test_eager_no_extra_singularization_belongs_to
    return unless @have_tables
    assert_nothing_raised do
      Virus.find(:all, :include => :octopus)
    end
  end

  def test_eager_no_extra_singularization_has_one
    return unless @have_tables
    assert_nothing_raised do
      Octopus.find(:all, :include => :virus)
    end
  end

  def test_eager_no_extra_singularization_has_many
    return unless @have_tables
    assert_nothing_raised do
      Bus.find(:all, :include => :passes)
    end
  end

  def test_eager_no_extra_singularization_has_and_belongs_to_many
    return unless @have_tables
    assert_nothing_raised do
      Crisis.find(:all, :include => :messes)
      Mess.find(:all, :include => :crises)
    end
  end

  def test_eager_no_extra_singularization_has_many_through_belongs_to
    return unless @have_tables
    assert_nothing_raised do
      Crisis.find(:all, :include => :successes)
    end
  end

  def test_eager_no_extra_singularization_has_many_through_has_many
    return unless @have_tables
    assert_nothing_raised do
      Crisis.find(:all, :include => :compresses)
    end
  end
end