relations_test.rb 21.9 KB
Newer Older
1
require "cases/helper"
2
require 'models/tag'
3
require 'models/tagging'
4 5
require 'models/post'
require 'models/topic'
6
require 'models/comment'
7 8
require 'models/reply'
require 'models/author'
9
require 'models/comment'
10 11 12
require 'models/entrant'
require 'models/developer'
require 'models/company'
13
require 'models/bird'
14 15 16 17
require 'models/car'
require 'models/engine'
require 'models/tyre'

18

E
Emilio Tagua 已提交
19
class RelationTest < ActiveRecord::TestCase
20
  fixtures :authors, :topics, :entrants, :developers, :companies, :developers_projects, :accounts, :categories, :categorizations, :posts, :comments,
21
    :tags, :taggings, :cars
22

A
Aaron Patterson 已提交
23 24 25 26 27 28 29 30 31
  def test_bind_values
    relation = Post.scoped
    assert_equal [], relation.bind_values

    relation2 = relation.bind 'foo'
    assert_equal %w{ foo }, relation2.bind_values
    assert_equal [], relation.bind_values
  end

32 33
  def test_two_named_scopes_with_includes_should_not_drop_any_include
    car = Car.incl_engines.incl_tyres.first
34 35
    assert_no_queries { car.tyres.length }
    assert_no_queries { car.engines.length }
36
  end
37

38 39 40 41 42
  def test_dynamic_finder
    x = Post.where('author_id = ?', 1)
    assert x.klass.respond_to?(:find_by_id), '@klass should handle dynamic finders'
  end

43 44 45 46 47
  def test_multivalue_where
    posts = Post.where('author_id = ? AND id = ?', 1, 1)
    assert_equal 1, posts.to_a.size
  end

48 49 50 51 52 53
  def test_scoped
    topics = Topic.scoped
    assert_kind_of ActiveRecord::Relation, topics
    assert_equal 4, topics.size
  end

54 55 56 57 58 59 60 61 62 63
  def test_to_json
    assert_nothing_raised  { Bird.scoped.to_json }
    assert_nothing_raised  { Bird.scoped.all.to_json }
  end

  def test_to_yaml
    assert_nothing_raised  { Bird.scoped.to_yaml }
    assert_nothing_raised  { Bird.scoped.all.to_yaml }
  end

64 65 66 67 68
  def test_to_xml
    assert_nothing_raised  { Bird.scoped.to_xml }
    assert_nothing_raised  { Bird.scoped.all.to_xml }
  end

69 70 71 72 73 74
  def test_scoped_all
    topics = Topic.scoped.all
    assert_kind_of Array, topics
    assert_no_queries { assert_equal 4, topics.size }
  end

P
Pratik Naik 已提交
75 76 77 78 79 80 81 82 83 84 85
  def test_loaded_all
    topics = Topic.scoped

    assert_queries(1) do
      2.times { assert_equal 4, topics.all.size }
    end

    assert topics.loaded?
  end

  def test_scoped_first
P
Pratik Naik 已提交
86
    topics = Topic.scoped.order('id ASC')
P
Pratik Naik 已提交
87 88 89 90 91 92 93 94 95

    assert_queries(1) do
      2.times { assert_equal "The First Topic", topics.first.title }
    end

    assert ! topics.loaded?
  end

  def test_loaded_first
P
Pratik Naik 已提交
96
    topics = Topic.scoped.order('id ASC')
P
Pratik Naik 已提交
97 98 99 100 101 102 103 104 105

    assert_queries(1) do
      topics.all # force load
      2.times { assert_equal "The First Topic", topics.first.title }
    end

    assert topics.loaded?
  end

106 107 108 109 110 111 112 113 114
  def test_reload
    topics = Topic.scoped

    assert_queries(1) do
      2.times { topics.to_a }
    end

    assert topics.loaded?

115 116
    original_size = topics.to_a.size
    Topic.create! :title => 'fake'
117

118 119 120
    assert_queries(1) { topics.reload }
    assert_equal original_size + 1, topics.size
    assert topics.loaded?
121 122
  end

123
  def test_finding_with_conditions
124 125
    assert_equal ["David"], Author.where(:name => 'David').map(&:name)
    assert_equal ['Mary'],  Author.where(["name = ?", 'Mary']).map(&:name)
126
    assert_equal ['Mary'],  Author.where("name = ?", 'Mary').map(&:name)
127 128 129
  end

  def test_finding_with_order
130
    topics = Topic.order('id')
131
    assert_equal 4, topics.to_a.size
132 133 134
    assert_equal topics(:first).title, topics.first.title
  end

135 136 137 138 139 140
  def test_finding_with_order_concatenated
    topics = Topic.order('author_name').order('title')
    assert_equal 4, topics.to_a.size
    assert_equal topics(:fourth).title, topics.first.title
  end

141
  def test_finding_with_order_and_take
142
    entrants = Entrant.order("id ASC").limit(2).to_a
143

P
Pratik Naik 已提交
144 145
    assert_equal 2, entrants.size
    assert_equal entrants(:first).name, entrants.first.name
146 147
  end

148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
  def test_finding_with_complex_order_and_limit
    if current_adapter?(:SQLite3Adapter)
      tags = Tag.includes(:taggings).order("MIN(1,2)").limit(1).to_a
    else
      tags = Tag.includes(:taggings).order("LEAST(1,COS(1)*COS(-1)*COS(RADIANS(taggings.super_tag_id)))").limit(1).to_a
    end

    assert_equal 1, tags.length
  end

  def test_finding_with_complex_order
    if current_adapter?(:SQLite3Adapter)
      tags = Tag.includes(:taggings).order("MIN(1,2)").to_a
    else
      tags = Tag.includes(:taggings).order("LEAST(1,COS(1)*COS(-1)*COS(RADIANS(taggings.super_tag_id)))").to_a
    end

    assert_equal 2, tags.length
  end

168
  def test_finding_with_order_limit_and_offset
169
    entrants = Entrant.order("id ASC").limit(2).offset(1)
170

171
    assert_equal 2, entrants.to_a.size
P
Pratik Naik 已提交
172
    assert_equal entrants(:second).name, entrants.first.name
173

174
    entrants = Entrant.order("id ASC").limit(2).offset(2)
175
    assert_equal 1, entrants.to_a.size
P
Pratik Naik 已提交
176
    assert_equal entrants(:third).name, entrants.first.name
177 178 179
  end

  def test_finding_with_group
180
    developers = Developer.group("salary").select("salary").to_a
181 182 183 184
    assert_equal 4, developers.size
    assert_equal 4, developers.map(&:salary).uniq.size
  end

185 186
  def test_select_with_block
    even_ids = Developer.scoped.select {|d| d.id % 2 == 0 }.map(&:id)
187
    assert_equal [2, 4, 6, 8, 10], even_ids.sort
188 189
  end

190
  def test_finding_with_hash_conditions_on_joined_table
191
    firms = DependentFirm.joins(:account).where({:name => 'RailsCore', :accounts => { :credit_limit => 55..60 }}).to_a
192 193 194 195 196
    assert_equal 1, firms.size
    assert_equal companies(:rails_core), firms.first
  end

  def test_find_all_with_join
197
    developers_on_project_one = Developer.joins('LEFT JOIN developers_projects ON developers.id = developers_projects.developer_id').
198
      where('project_id=1').to_a
199 200 201 202 203 204 205 206

    assert_equal 3, developers_on_project_one.length
    developer_names = developers_on_project_one.map { |d| d.name }
    assert developer_names.include?('David')
    assert developer_names.include?('Jamis')
  end

  def test_find_on_hash_conditions
207
    assert_equal Topic.find(:all, :conditions => {:approved => false}), Topic.where({ :approved => false }).to_a
208 209 210
  end

  def test_joins_with_string_array
211
    person_with_reader_and_post = Post.joins([
212 213 214 215 216 217
        "INNER JOIN categorizations ON categorizations.post_id = posts.id",
        "INNER JOIN categories ON categories.id = categorizations.category_id AND categories.type = 'SpecialCategory'"
      ]
    ).to_a
    assert_equal 1, person_with_reader_and_post.size
  end
218

219 220
  def test_scoped_responds_to_delegated_methods
    relation = Topic.scoped
221 222

    ["map", "uniq", "sort", "insert", "delete", "update"].each do |method|
223
      assert_respond_to relation, method, "Topic.scoped should respond to #{method.inspect}"
224 225 226
    end
  end

227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245
  def test_respond_to_delegates_to_relation
    relation = Topic.scoped
    fake_arel = Struct.new(:responds) {
      def respond_to? method, access = false
        responds << [method, access]
      end
    }.new []

    relation.extend(Module.new { attr_accessor :arel })
    relation.arel = fake_arel

    relation.respond_to?(:matching_attributes)
    assert_equal [:matching_attributes, false], fake_arel.responds.first

    fake_arel.responds = []
    relation.respond_to?(:matching_attributes, true)
    assert_equal [:matching_attributes, true], fake_arel.responds.first
  end

246 247 248 249
  def test_respond_to_dynamic_finders
    relation = Topic.scoped

    ["find_by_title", "find_by_title_and_author_name", "find_or_create_by_title", "find_or_initialize_by_title_and_author_name"].each do |method|
250
      assert_respond_to relation, method, "Topic.scoped should respond to #{method.inspect}"
251 252
    end
  end
253

254 255 256 257 258
  def test_respond_to_class_methods_and_named_scopes
    assert DeveloperOrderedBySalary.scoped.respond_to?(:all_ordered_by_name)
    assert Topic.scoped.respond_to?(:by_lifo)
  end

259
  def test_find_with_readonly_option
260 261
    Developer.scoped.each { |d| assert !d.readonly? }
    Developer.scoped.readonly.each { |d| assert d.readonly? }
262
  end
263 264

  def test_eager_association_loading_of_stis_with_multiple_references
265
    authors = Author.eager_load(:posts => { :special_comments => { :post => [ :special_comments, :very_special_comment ] } }).
266
      order('comments.body, very_special_comments_posts.body').where('posts.id = 4').to_a
267

268 269 270 271 272 273 274
    assert_equal [authors(:david)], authors
    assert_no_queries do
      authors.first.posts.first.special_comments.first.post.special_comments
      authors.first.posts.first.special_comments.first.post.very_special_comment
    end
  end

275
  def test_find_with_preloaded_associations
276
    assert_queries(2) do
277
      posts = Post.preload(:comments)
278
      assert posts.first.comments.first
279
    end
280

281
    assert_queries(2) do
282
      posts = Post.preload(:comments).to_a
283
      assert posts.first.comments.first
284
    end
285

286
    assert_queries(2) do
287
      posts = Post.preload(:author)
288
      assert posts.first.author
289
    end
290

291
    assert_queries(2) do
292
      posts = Post.preload(:author).to_a
293 294 295 296 297 298
      assert posts.first.author
    end

    assert_queries(3) do
      posts = Post.preload(:author, :comments).to_a
      assert posts.first.author
299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321
      assert posts.first.comments.first
    end
  end

  def test_find_with_included_associations
    assert_queries(2) do
      posts = Post.includes(:comments)
      assert posts.first.comments.first
    end

    assert_queries(2) do
      posts = Post.scoped.includes(:comments)
      assert posts.first.comments.first
    end

    assert_queries(2) do
      posts = Post.includes(:author)
      assert posts.first.author
    end

    assert_queries(3) do
      posts = Post.includes(:author, :comments).to_a
      assert posts.first.author
322
      assert posts.first.comments.first
323 324
    end
  end
325

P
Pratik Naik 已提交
326
  def test_default_scope_with_conditions_string
327
    assert_equal Developer.find_all_by_name('David').map(&:id).sort, DeveloperCalledDavid.scoped.map(&:id).sort
328
    assert_nil DeveloperCalledDavid.create!.name
329 330 331
  end

  def test_default_scope_with_conditions_hash
332
    assert_equal Developer.find_all_by_name('Jamis').map(&:id).sort, DeveloperCalledJamis.scoped.map(&:id).sort
333 334 335
    assert_equal 'Jamis', DeveloperCalledJamis.create!.name
  end

336 337 338 339 340
  def test_default_scoping_finder_methods
    developers = DeveloperCalledDavid.order('id').map(&:id).sort
    assert_equal Developer.find_all_by_name('David').map(&:id).sort, developers
  end

341 342
  def test_loading_with_one_association
    posts = Post.preload(:comments)
343 344 345 346
    post = posts.find { |p| p.id == 1 }
    assert_equal 2, post.comments.size
    assert post.comments.include?(comments(:greetings))

347
    post = Post.where("posts.title = 'Welcome to the weblog'").preload(:comments).first
348 349 350
    assert_equal 2, post.comments.size
    assert post.comments.include?(comments(:greetings))

351
    posts = Post.preload(:last_comment)
352 353 354 355 356
    post = posts.find { |p| p.id == 1 }
    assert_equal Post.find(1).last_comment, post.last_comment
  end

  def test_loading_with_one_association_with_non_preload
357
    posts = Post.eager_load(:last_comment).order('comments.id DESC')
358 359 360
    post = posts.find { |p| p.id == 1 }
    assert_equal Post.find(1).last_comment, post.last_comment
  end
361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379

  def test_dynamic_find_by_attributes
    david = authors(:david)
    author = Author.preload(:taggings).find_by_id(david.id)
    expected_taggings = taggings(:welcome_general, :thinking_general)

    assert_no_queries do
      assert_equal expected_taggings, author.taggings.uniq.sort_by { |t| t.id }
    end

    authors = Author.scoped
    assert_equal david, authors.find_by_id_and_name(david.id, david.name)
    assert_equal david, authors.find_by_id_and_name!(david.id, david.name)
  end

  def test_dynamic_find_by_attributes_bang
    author = Author.scoped.find_by_id!(authors(:david).id)
    assert_equal "David", author.name

P
Pratik Naik 已提交
380
    assert_raises(ActiveRecord::RecordNotFound) { Author.scoped.find_by_id_and_name!(20, 'invalid') }
381 382 383 384 385 386 387 388 389
  end

  def test_dynamic_find_all_by_attributes
    authors = Author.scoped

    davids = authors.find_all_by_name('David')
    assert_kind_of Array, davids
    assert_equal [authors(:david)], davids
  end
390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410

  def test_dynamic_find_or_initialize_by_attributes
    authors = Author.scoped

    lifo = authors.find_or_initialize_by_name('Lifo')
    assert_equal "Lifo", lifo.name
    assert lifo.new_record?

    assert_equal authors(:david), authors.find_or_initialize_by_name(:name => 'David')
  end

  def test_dynamic_find_or_create_by_attributes
    authors = Author.scoped

    lifo = authors.find_or_create_by_name('Lifo')
    assert_equal "Lifo", lifo.name
    assert ! lifo.new_record?

    assert_equal authors(:david), authors.find_or_create_by_name(:name => 'David')
  end

P
Pratik Naik 已提交
411 412 413 414 415 416
  def test_find_id
    authors = Author.scoped

    david = authors.find(authors(:david).id)
    assert_equal 'David', david.name

P
Pratik Naik 已提交
417
    assert_raises(ActiveRecord::RecordNotFound) { authors.where(:name => 'lifo').find('42') }
P
Pratik Naik 已提交
418
  end
419

P
Pratik Naik 已提交
420 421 422 423 424 425 426 427 428 429
  def test_find_ids
    authors = Author.order('id ASC')

    results = authors.find(authors(:david).id, authors(:mary).id)
    assert_kind_of Array, results
    assert_equal 2, results.size
    assert_equal 'David', results[0].name
    assert_equal 'Mary', results[1].name
    assert_equal results, authors.find([authors(:david).id, authors(:mary).id])

P
Pratik Naik 已提交
430 431
    assert_raises(ActiveRecord::RecordNotFound) { authors.where(:name => 'lifo').find(authors(:david).id, '42') }
    assert_raises(ActiveRecord::RecordNotFound) { authors.find(['42', 43]) }
P
Pratik Naik 已提交
432 433
  end

434 435
  def test_find_in_empty_array
    authors = Author.scoped.where(:id => [])
436
    assert_blank authors.all
437 438
  end

P
Pratik Naik 已提交
439 440 441 442 443
  def test_exists
    davids = Author.where(:name => 'David')
    assert davids.exists?
    assert davids.exists?(authors(:david).id)
    assert ! davids.exists?(authors(:mary).id)
P
Pratik Naik 已提交
444 445
    assert ! davids.exists?("42")
    assert ! davids.exists?(42)
P
Pratik Naik 已提交
446 447 448 449 450

    fake  = Author.where(:name => 'fake author')
    assert ! fake.exists?
    assert ! fake.exists?(authors(:david).id)
  end
451 452 453 454 455 456

  def test_last
    authors = Author.scoped
    assert_equal authors(:mary), authors.last
  end

P
Pratik Naik 已提交
457 458 459 460 461 462 463 464 465 466 467 468 469
  def test_destroy_all
    davids = Author.where(:name => 'David')

    # Force load
    assert_equal [authors(:david)], davids.to_a
    assert davids.loaded?

    assert_difference('Author.count', -1) { davids.destroy_all }

    assert_equal [], davids.to_a
    assert davids.loaded?
  end

P
Pratik Naik 已提交
470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489
  def test_delete_all
    davids = Author.where(:name => 'David')

    assert_difference('Author.count', -1) { davids.delete_all }
    assert ! davids.loaded?
  end

  def test_delete_all_loaded
    davids = Author.where(:name => 'David')

    # Force load
    assert_equal [authors(:david)], davids.to_a
    assert davids.loaded?

    assert_difference('Author.count', -1) { davids.delete_all }

    assert_equal [], davids.to_a
    assert davids.loaded?
  end

490 491 492 493
  def test_select_argument_error
    assert_raises(ArgumentError) { Developer.select }
  end

494 495 496 497
  def test_relation_merging
    devs = Developer.where("salary >= 80000") & Developer.limit(2) & Developer.order('id ASC').where("id < 3")
    assert_equal [developers(:david), developers(:jamis)], devs.to_a

P
Pratik Naik 已提交
498
    dev_with_count = Developer.limit(1) & Developer.order('id DESC') & Developer.select('developers.*')
499
    assert_equal [developers(:poor_jamis)], dev_with_count.to_a
500 501 502 503 504 505
  end

  def test_relation_merging_with_eager_load
    relations = []
    relations << (Post.order('comments.id DESC') & Post.eager_load(:last_comment) & Post.scoped)
    relations << (Post.eager_load(:last_comment) & Post.order('comments.id DESC') & Post.scoped)
506

507 508 509 510 511 512
    relations.each do |posts|
      post = posts.find { |p| p.id == 1 }
      assert_equal Post.find(1).last_comment, post.last_comment
    end
  end

513 514
  def test_relation_merging_with_locks
    devs = Developer.lock.where("salary >= 80000").order("id DESC") & Developer.limit(2)
515
    assert_present devs.locked
516 517
  end

518 519 520 521
  def test_relation_merging_with_preload
    [Post.scoped & Post.preload(:author), Post.preload(:author) & Post.scoped].each do |posts|
      assert_queries(2) { assert posts.first.author }
    end
522
  end
523

524 525 526 527 528
  def test_relation_merging_with_joins
    comments = Comment.joins(:post).where(:body => 'Thank you for the welcome') & Post.where(:body => 'Such a lovely day')
    assert_equal 1, comments.count
  end

P
Pratik Naik 已提交
529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553
  def test_count
    posts = Post.scoped

    assert_equal 7, posts.count
    assert_equal 7, posts.count(:all)
    assert_equal 7, posts.count(:id)

    assert_equal 1, posts.where('comments_count > 1').count
    assert_equal 5, posts.where(:comments_count => 0).count
  end

  def test_count_with_distinct
    posts = Post.scoped

    assert_equal 3, posts.count(:comments_count, :distinct => true)
    assert_equal 7, posts.count(:comments_count, :distinct => false)

    assert_equal 3, posts.select(:comments_count).count(:distinct => true)
    assert_equal 7, posts.select(:comments_count).count(:distinct => false)
  end

  def test_count_explicit_columns
    Post.update_all(:comments_count => nil)
    posts = Post.scoped

P
Pratik Naik 已提交
554
    assert_equal [0], posts.select('comments_count').where('id is not null').group('id').order('id').count.values.uniq
555
    assert_equal 0, posts.where('id is not null').select('comments_count').count
556

P
Pratik Naik 已提交
557 558 559 560 561
    assert_equal 7, posts.select('comments_count').count('id')
    assert_equal 0, posts.select('comments_count').count
    assert_equal 0, posts.count(:comments_count)
    assert_equal 0, posts.count('comments_count')
  end
562

563 564 565 566 567 568
  def test_multiple_selects
    post = Post.scoped.select('comments_count').select('title').order("id ASC").first
    assert_equal "Welcome to the weblog", post.title
    assert_equal 2, post.comments_count
  end

569 570 571 572 573 574 575 576 577 578 579
  def test_size
    posts = Post.scoped

    assert_queries(1) { assert_equal 7, posts.size }
    assert ! posts.loaded?

    best_posts = posts.where(:comments_count => 0)
    best_posts.to_a # force load
    assert_no_queries { assert_equal 5, best_posts.size }
  end

580 581 582 583 584 585 586
  def test_count_complex_chained_relations
    posts = Post.select('comments_count').where('id is not null').group("author_id").where("comments_count > 0")

    expected = { 1 => 2 }
    assert_equal expected, posts.count
  end

P
Pratik Naik 已提交
587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602
  def test_any
    posts = Post.scoped

    assert_queries(3) do
      assert posts.any? # Uses COUNT()
      assert ! posts.where(:id => nil).any?

      assert posts.any? {|p| p.id > 0 }
      assert ! posts.any? {|p| p.id <= 0 }
    end

    assert posts.loaded?
  end

  def test_many
    posts = Post.scoped
603

P
Pratik Naik 已提交
604 605 606 607 608
    assert_queries(2) do
      assert posts.many? # Uses COUNT()
      assert posts.many? {|p| p.id > 0 }
      assert ! posts.many? {|p| p.id < 2 }
    end
609

P
Pratik Naik 已提交
610 611 612
    assert posts.loaded?
  end

613 614 615 616 617 618
  def test_many_with_limits
    posts = Post.scoped

    assert posts.many?
    assert ! posts.limit(1).many?
  end
P
Pratik Naik 已提交
619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634

  def test_build
    posts = Post.scoped

    post = posts.new
    assert_kind_of Post, post
  end

  def test_scoped_build
    posts = Post.where(:title => 'You told a lie')

    post = posts.new
    assert_kind_of Post, post
    assert_equal 'You told a lie', post.title
  end

635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656
  def test_create
    birds = Bird.scoped

    sparrow = birds.create
    assert_kind_of Bird, sparrow
    assert sparrow.new_record?

    hen = birds.where(:name => 'hen').create
    assert ! hen.new_record?
    assert_equal 'hen', hen.name
  end

  def test_create_bang
    birds = Bird.scoped

    assert_raises(ActiveRecord::RecordInvalid) { birds.create! }

    hen = birds.where(:name => 'hen').create!
    assert_kind_of Bird, hen
    assert ! hen.new_record?
    assert_equal 'hen', hen.name
  end
P
Pratik Naik 已提交
657

658 659 660 661 662 663 664 665
  def test_explicit_create_scope
    hens = Bird.where(:name => 'hen')
    assert_equal 'hen', hens.new.name

    hens = hens.create_with(:name => 'cock')
    assert_equal 'cock', hens.new.name
  end

P
Pratik Naik 已提交
666 667 668 669 670 671 672 673 674 675 676
  def test_except
    relation = Post.where(:author_id => 1).order('id ASC').limit(1)
    assert_equal [posts(:welcome)], relation.all

    author_posts = relation.except(:order, :limit)
    assert_equal Post.where(:author_id => 1).all, author_posts.all

    all_posts = relation.except(:where, :order, :limit)
    assert_equal Post.all, all_posts.all
  end

E
Emilio Tagua 已提交
677 678 679 680 681 682 683 684 685 686 687
  def test_only
    relation = Post.where(:author_id => 1).order('id ASC').limit(1)
    assert_equal [posts(:welcome)], relation.all

    author_posts = relation.only(:where)
    assert_equal Post.where(:author_id => 1).all, author_posts.all

    all_posts = relation.only(:limit)
    assert_equal Post.limit(1).all.first, all_posts.first
  end

P
Pratik Naik 已提交
688
  def test_anonymous_extension
689
    relation = Post.where(:author_id => 1).order('id ASC').extending do
P
Pratik Naik 已提交
690 691 692 693 694 695 696 697 698 699 700 701 702 703
      def author
        'lifo'
      end
    end

    assert_equal "lifo", relation.author
    assert_equal "lifo", relation.limit(1).author
  end

  def test_named_extension
    relation = Post.where(:author_id => 1).order('id ASC').extending(Post::NamedExtension)
    assert_equal "lifo", relation.author
    assert_equal "lifo", relation.limit(1).author
  end
704 705 706 707

  def test_order_by_relation_attribute
    assert_equal Post.order(Post.arel_table[:title]).all, Post.order("title").all
  end
708

709
  def test_order_with_find_with_order
710 711
    assert_equal 'zyke', CoolCar.order('name desc').find(:first, :order => 'id').name
    assert_equal 'zyke', FastCar.order('name desc').find(:first, :order => 'id').name
712 713 714
  end

  def test_default_scope_order_with_named_scope_order
715 716 717 718
    assert_equal 'zyke', CoolCar.order_using_new_style.limit(1).first.name
    assert_equal 'zyke', CoolCar.order_using_old_style.limit(1).first.name
    assert_equal 'zyke', FastCar.order_using_new_style.limit(1).first.name
    assert_equal 'zyke', FastCar.order_using_old_style.limit(1).first.name
719 720 721
  end

  def test_order_using_scoping
722 723
    car1 = CoolCar.order('id DESC').scoping do
      CoolCar.find(:first, :order => 'id asc')
724
    end
725 726 727 728 729 730 731 732 733 734 735 736 737 738
    assert_equal 'zyke', car1.name

    car2 = FastCar.order('id DESC').scoping do
      FastCar.find(:first, :order => 'id asc')
    end
    assert_equal 'zyke', car2.name
  end

  def test_unscoped_block_style
    assert_equal 'honda', CoolCar.unscoped { CoolCar.order_using_new_style.limit(1).first.name}
    assert_equal 'honda', CoolCar.unscoped { CoolCar.order_using_old_style.limit(1).first.name}

    assert_equal 'honda', FastCar.unscoped { FastCar.order_using_new_style.limit(1).first.name}
    assert_equal 'honda', FastCar.unscoped { FastCar.order_using_old_style.limit(1).first.name}
739 740
  end

741 742 743
  def test_intersection_with_array
    relation = Author.where(:name => "David")
    rails_author = relation.first
744

745 746 747
    assert_equal [rails_author], [rails_author] & relation
    assert_equal [rails_author], relation & [rails_author]
  end
P
Pratik Naik 已提交
748
end