“7329990d868d10e4fbf541097cd5be8f1254e2ce”上不存在“git@gitcode.net:pulltheflower/rails.git”
associations_test.rb 9.2 KB
Newer Older
1
require "cases/helper"
J
Jeremy Kemper 已提交
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
require 'models/developer'
require 'models/project'
require 'models/company'
require 'models/topic'
require 'models/reply'
require 'models/computer'
require 'models/customer'
require 'models/order'
require 'models/categorization'
require 'models/category'
require 'models/post'
require 'models/author'
require 'models/comment'
require 'models/tag'
require 'models/tagging'
require 'models/person'
require 'models/reader'
19 20 21 22
require 'models/parrot'
require 'models/pirate'
require 'models/treasure'
require 'models/price_estimate'
23 24 25 26
require 'models/club'
require 'models/member'
require 'models/membership'
require 'models/sponsor'
D
Initial  
David Heinemeier Hansson 已提交
27

28
class AssociationsTest < ActiveRecord::TestCase
29
  fixtures :accounts, :companies, :developers, :projects, :developers_projects,
30
           :computers, :people, :readers
31

32 33 34 35 36
  def test_include_with_order_works
    assert_nothing_raised {Account.find(:first, :order => 'id', :include => :firm)}
    assert_nothing_raised {Account.find(:first, :order => :id, :include => :firm)}
  end

J
Jeremy Kemper 已提交
37 38 39 40 41
  def test_bad_collection_keys
    assert_raise(ArgumentError, 'ActiveRecord should have barked on bad collection keys') do
      Class.new(ActiveRecord::Base).has_many(:wheels, :name => 'wheels')
    end
  end
J
Jeremy Kemper 已提交
42

43
  def test_should_construct_new_finder_sql_after_create
44
    person = Person.new :first_name => 'clark'
45 46 47
    assert_equal [], person.readers.find(:all)
    person.save!
    reader = Reader.create! :person => person, :post => Post.new(:title => "foo", :body => "bar")
48
    assert person.readers.find(reader.id)
49
  end
J
Jeremy Kemper 已提交
50

D
Initial  
David Heinemeier Hansson 已提交
51
  def test_force_reload
52
    firm = Firm.new("name" => "A New Firm, Inc")
D
Initial  
David Heinemeier Hansson 已提交
53 54 55 56 57
    firm.save
    firm.clients.each {|c|} # forcing to load all clients
    assert firm.clients.empty?, "New firm shouldn't have client objects"
    assert_equal 0, firm.clients.size, "New firm should have 0 clients"

58
    client = Client.new("name" => "TheClient.com", "firm_id" => firm.id)
D
Initial  
David Heinemeier Hansson 已提交
59 60 61 62 63 64 65 66
    client.save

    assert firm.clients.empty?, "New firm should have cached no client objects"
    assert_equal 0, firm.clients.size, "New firm should have cached 0 clients count"

    assert !firm.clients(true).empty?, "New firm should have reloaded client objects"
    assert_equal 1, firm.clients(true).size, "New firm should have reloaded clients count"
  end
67 68 69 70 71 72 73 74 75 76
  
  def test_force_reload_is_uncached
    firm = Firm.create!("name" => "A New Firm, Inc")
    client = Client.create!("name" => "TheClient.com", :firm => firm)
    ActiveRecord::Base.cache do
      firm.clients.each {}
      assert_queries(0) { assert_not_nil firm.clients.each {} }
      assert_queries(1) { assert_not_nil firm.clients(true).each {} }
    end
  end
D
Initial  
David Heinemeier Hansson 已提交
77 78

end
J
Jeremy Kemper 已提交
79

80
class AssociationProxyTest < ActiveRecord::TestCase
81
  fixtures :authors, :posts, :categorizations, :categories, :developers, :projects, :developers_projects
J
Jeremy Kemper 已提交
82

83 84 85 86 87 88
  def test_proxy_accessors
    welcome = posts(:welcome)
    assert_equal  welcome, welcome.author.proxy_owner
    assert_equal  welcome.class.reflect_on_association(:author), welcome.author.proxy_reflection
    welcome.author.class  # force load target
    assert_equal  welcome.author, welcome.author.proxy_target
J
Jeremy Kemper 已提交
89

90 91 92
    david = authors(:david)
    assert_equal  david, david.posts.proxy_owner
    assert_equal  david.class.reflect_on_association(:posts), david.posts.proxy_reflection
93
    david.posts.class   # force load target
94
    assert_equal  david.posts, david.posts.proxy_target
J
Jeremy Kemper 已提交
95

96 97
    assert_equal  david, david.posts_with_extension.testing_proxy_owner
    assert_equal  david.class.reflect_on_association(:posts_with_extension), david.posts_with_extension.testing_proxy_reflection
98
    david.posts_with_extension.class   # force load target
99 100
    assert_equal  david.posts_with_extension, david.posts_with_extension.testing_proxy_target
  end
101

102 103
  def test_push_does_not_load_target
    david = authors(:david)
104

105 106 107 108 109 110 111 112
    david.posts << (post = Post.new(:title => "New on Edge", :body => "More cool stuff!"))
    assert !david.posts.loaded?
    assert david.posts.include?(post)
  end

  def test_push_has_many_through_does_not_load_target
    david = authors(:david)

113
    david.categories << categories(:technology)
114
    assert !david.categories.loaded?
115 116
    assert david.categories.include?(categories(:technology))
  end
J
Jeremy Kemper 已提交
117

118 119 120 121 122 123 124 125 126
  def test_push_followed_by_save_does_not_load_target
    david = authors(:david)

    david.posts << (post = Post.new(:title => "New on Edge", :body => "More cool stuff!"))
    assert !david.posts.loaded?
    david.save
    assert !david.posts.loaded?
    assert david.posts.include?(post)
  end
127

128 129 130 131 132 133 134
  def test_push_does_not_lose_additions_to_new_record
    josh = Author.new(:name => "Josh")
    josh.posts << Post.new(:title => "New on Edge", :body => "More cool stuff!")
    assert josh.posts.loaded?
    assert_equal 1, josh.posts.size
  end

135 136 137 138 139 140 141 142
  def test_save_on_parent_does_not_load_target
    david = developers(:david)

    assert !david.projects.loaded?
    david.update_attribute(:created_at, Time.now)
    assert !david.projects.loaded?
  end

143 144 145 146 147 148
  def test_inspect_does_not_reload_a_not_yet_loaded_target
    andreas = Developer.new :name => 'Andreas', :log => 'new developer added'
    assert !andreas.audit_logs.loaded?
    assert_match(/message: "new developer added"/, andreas.audit_logs.inspect)
  end

149 150 151 152
  def test_save_on_parent_saves_children
    developer = Developer.create :name => "Bryan", :salary => 50_000
    assert_equal 1, developer.reload.audit_logs.size
  end
153

154
  def test_create_via_association_with_block
155 156 157 158 159 160 161 162 163
    post = authors(:david).posts.create(:title => "New on Edge") {|p| p.body = "More cool stuff!"}
    assert_equal post.title, "New on Edge"
    assert_equal post.body, "More cool stuff!"
  end

  def test_create_with_bang_via_association_with_block
    post = authors(:david).posts.create!(:title => "New on Edge") {|p| p.body = "More cool stuff!"}
    assert_equal post.title, "New on Edge"
    assert_equal post.body, "More cool stuff!"
164 165
  end

166 167 168 169 170 171 172 173 174 175
  def test_failed_reload_returns_nil
    p = setup_dangling_association
    assert_nil p.author.reload
  end

  def test_failed_reset_returns_nil
    p = setup_dangling_association
    assert_nil p.author.reset
  end

176 177 178 179 180 181 182
  def test_reload_returns_assocition
    david = developers(:david)
    assert_nothing_raised do
      assert_equal david.projects, david.projects.reload.reload
    end
  end

183 184 185 186 187 188 189 190 191 192 193 194 195 196
  def test_splat_does_not_invoke_to_a_on_singular_targets
    Kernel.module_eval do
      alias original_to_a to_a
      def to_a
        [:_]
      end
    end
    assert_not_equal [:_], [*posts(:welcome).author]
  ensure
    Kernel.module_eval do
      alias to_a original_to_a
    end
  end

197 198 199 200 201 202
  def setup_dangling_association
    josh = Author.create(:name => "Josh")
    p = Post.create(:title => "New on Edge", :body => "More cool stuff!", :author => josh)
    josh.destroy
    p
  end
203 204
end

205
class OverridingAssociationsTest < ActiveRecord::TestCase
206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267
  class Person < ActiveRecord::Base; end
  class DifferentPerson < ActiveRecord::Base; end

  class PeopleList < ActiveRecord::Base
    has_and_belongs_to_many :has_and_belongs_to_many, :before_add => :enlist
    has_many :has_many, :before_add => :enlist
    belongs_to :belongs_to
    has_one :has_one
  end

  class DifferentPeopleList < PeopleList
    # Different association with the same name, callbacks should be omitted here.
    has_and_belongs_to_many :has_and_belongs_to_many, :class_name => 'DifferentPerson'
    has_many :has_many, :class_name => 'DifferentPerson'
    belongs_to :belongs_to, :class_name => 'DifferentPerson'
    has_one :has_one, :class_name => 'DifferentPerson'
  end

  def test_habtm_association_redefinition_callbacks_should_differ_and_not_inherited
    # redeclared association on AR descendant should not inherit callbacks from superclass
    callbacks = PeopleList.read_inheritable_attribute(:before_add_for_has_and_belongs_to_many)
    assert_equal([:enlist], callbacks)
    callbacks = DifferentPeopleList.read_inheritable_attribute(:before_add_for_has_and_belongs_to_many)
    assert_equal([], callbacks)
  end

  def test_has_many_association_redefinition_callbacks_should_differ_and_not_inherited
    # redeclared association on AR descendant should not inherit callbacks from superclass
    callbacks = PeopleList.read_inheritable_attribute(:before_add_for_has_many)
    assert_equal([:enlist], callbacks)
    callbacks = DifferentPeopleList.read_inheritable_attribute(:before_add_for_has_many)
    assert_equal([], callbacks)
  end

  def test_habtm_association_redefinition_reflections_should_differ_and_not_inherited
    assert_not_equal(
      PeopleList.reflect_on_association(:has_and_belongs_to_many),
      DifferentPeopleList.reflect_on_association(:has_and_belongs_to_many)
    )
  end

  def test_has_many_association_redefinition_reflections_should_differ_and_not_inherited
    assert_not_equal(
      PeopleList.reflect_on_association(:has_many),
      DifferentPeopleList.reflect_on_association(:has_many)
    )
  end

  def test_belongs_to_association_redefinition_reflections_should_differ_and_not_inherited
    assert_not_equal(
      PeopleList.reflect_on_association(:belongs_to),
      DifferentPeopleList.reflect_on_association(:belongs_to)
    )
  end

  def test_has_one_association_redefinition_reflections_should_differ_and_not_inherited
    assert_not_equal(
      PeopleList.reflect_on_association(:has_one),
      DifferentPeopleList.reflect_on_association(:has_one)
    )
  end
end