PageRenderTime 39ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/activerecord/test/cases/associations/left_outer_join_association_test.rb

https://github.com/cjolly/rails
Ruby | 91 lines | 72 code | 17 blank | 2 comment | 0 complexity | 7c95a6a32adc339deb7abcd32eb45c29 MD5 | raw file
  1. # frozen_string_literal: true
  2. require "cases/helper"
  3. require "models/post"
  4. require "models/comment"
  5. require "models/author"
  6. require "models/essay"
  7. require "models/category"
  8. require "models/categorization"
  9. require "models/person"
  10. class LeftOuterJoinAssociationTest < ActiveRecord::TestCase
  11. fixtures :authors, :author_addresses, :essays, :posts, :comments, :categorizations, :people
  12. def test_construct_finder_sql_applies_aliases_tables_on_association_conditions
  13. result = Author.left_outer_joins(:thinking_posts, :welcome_posts).to_a
  14. assert_equal authors(:david), result.first
  15. end
  16. def test_construct_finder_sql_does_not_table_name_collide_on_duplicate_associations
  17. assert_nothing_raised do
  18. queries = capture_sql do
  19. Person.left_outer_joins(agents: { agents: :agents })
  20. .left_outer_joins(agents: { agents: { primary_contact: :agents } }).to_a
  21. end
  22. assert queries.any? { |sql| /agents_people_4/i.match?(sql) }
  23. end
  24. end
  25. def test_left_outer_joins_count_is_same_as_size_of_loaded_results
  26. assert_equal 17, Post.left_outer_joins(:comments).to_a.size
  27. assert_equal 17, Post.left_outer_joins(:comments).count
  28. end
  29. def test_left_joins_aliases_left_outer_joins
  30. assert_equal Post.left_outer_joins(:comments).to_sql, Post.left_joins(:comments).to_sql
  31. end
  32. def test_left_outer_joins_return_has_value_for_every_comment
  33. all_post_ids = Post.pluck(:id)
  34. assert_equal all_post_ids, all_post_ids & Post.left_outer_joins(:comments).pluck(:id)
  35. end
  36. def test_left_outer_joins_actually_does_a_left_outer_join
  37. queries = capture_sql { Author.left_outer_joins(:posts).to_a }
  38. assert queries.any? { |sql| /LEFT OUTER JOIN/i.match?(sql) }
  39. end
  40. def test_construct_finder_sql_ignores_empty_left_outer_joins_hash
  41. queries = capture_sql { Author.left_outer_joins({}).to_a }
  42. assert queries.none? { |sql| /LEFT OUTER JOIN/i.match?(sql) }
  43. end
  44. def test_construct_finder_sql_ignores_empty_left_outer_joins_array
  45. queries = capture_sql { Author.left_outer_joins([]).to_a }
  46. assert queries.none? { |sql| /LEFT OUTER JOIN/i.match?(sql) }
  47. end
  48. def test_left_outer_joins_forbids_to_use_string_as_argument
  49. assert_raise(ArgumentError) { Author.left_outer_joins('LEFT OUTER JOIN "posts" ON "posts"."user_id" = "users"."id"').to_a }
  50. end
  51. def test_join_conditions_added_to_join_clause
  52. queries = capture_sql { Author.left_outer_joins(:essays).to_a }
  53. assert queries.any? { |sql| /writer_type.*?=.*?(Author|\?|\$1|\:a1)/i.match?(sql) }
  54. assert queries.none? { |sql| /WHERE/i.match?(sql) }
  55. end
  56. def test_find_with_sti_join
  57. scope = Post.left_outer_joins(:special_comments).where(id: posts(:sti_comments).id)
  58. # The join should match SpecialComment and its subclasses only
  59. assert_empty scope.where("comments.type" => "Comment")
  60. assert_not_empty scope.where("comments.type" => "SpecialComment")
  61. assert_not_empty scope.where("comments.type" => "SubSpecialComment")
  62. end
  63. def test_does_not_override_select
  64. authors = Author.select("authors.name, #{%{(authors.author_address_id || ' ' || authors.author_address_extra_id) as addr_id}}").left_outer_joins(:posts)
  65. assert_predicate authors, :any?
  66. assert_respond_to authors.first, :addr_id
  67. end
  68. test "the default scope of the target is applied when joining associations" do
  69. author = Author.create! name: "Jon"
  70. author.categorizations.create!
  71. author.categorizations.create! special: true
  72. assert_equal [author], Author.where(id: author).left_outer_joins(:special_categorizations)
  73. end
  74. end