aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/test/cases/associations
diff options
context:
space:
mode:
authorSean Griffin <sean@seantheprogrammer.com>2015-10-30 09:42:02 -0600
committerSean Griffin <sean@seantheprogrammer.com>2015-10-30 09:42:02 -0600
commite038975c29aa883cb9ac5472cdb0ea9319158121 (patch)
treea07d201488caaa064aa290b3d91d66fcfd703aa3 /activerecord/test/cases/associations
parent67417f18215349cad990b1230ecf591b5509d557 (diff)
parent3f46ef1ddab87482b730a3f53987e04308783d8b (diff)
downloadrails-e038975c29aa883cb9ac5472cdb0ea9319158121.tar.gz
rails-e038975c29aa883cb9ac5472cdb0ea9319158121.tar.bz2
rails-e038975c29aa883cb9ac5472cdb0ea9319158121.zip
Merge pull request #12071 from Crunch09/outer_joins
added ActiveRecord::Relation#outer_joins
Diffstat (limited to 'activerecord/test/cases/associations')
-rw-r--r--activerecord/test/cases/associations/left_outer_join_association_test.rb74
1 files changed, 74 insertions, 0 deletions
diff --git a/activerecord/test/cases/associations/left_outer_join_association_test.rb b/activerecord/test/cases/associations/left_outer_join_association_test.rb
new file mode 100644
index 0000000000..a362b43cc3
--- /dev/null
+++ b/activerecord/test/cases/associations/left_outer_join_association_test.rb
@@ -0,0 +1,74 @@
+require "cases/helper"
+require 'models/post'
+require 'models/comment'
+require 'models/author'
+require 'models/essay'
+require 'models/categorization'
+require 'models/person'
+
+class LeftOuterJoinAssociationTest < ActiveRecord::TestCase
+ fixtures :authors, :essays, :posts, :comments, :categorizations, :people
+
+ def test_construct_finder_sql_applies_aliases_tables_on_association_conditions
+ result = Author.left_outer_joins(:thinking_posts, :welcome_posts).to_a
+ assert_equal authors(:david), result.first
+ end
+
+ def test_construct_finder_sql_does_not_table_name_collide_on_duplicate_associations
+ assert_nothing_raised do
+ sql = capture_sql do
+ Person.left_outer_joins(:agents => {:agents => :agents})
+ .left_outer_joins(:agents => {:agents => {:primary_contact => :agents}}).to_a
+ end.first
+ assert_match(/agents_people_4/i, sql)
+ end
+ end
+
+ def test_construct_finder_sql_executes_a_left_outer_join
+ assert_not_equal Author.count, Author.joins(:posts).count
+ assert_equal Author.count, Author.left_outer_joins(:posts).count
+ end
+
+ def test_construct_finder_sql_ignores_empty_left_outer_joins_hash
+ sql = capture_sql { Author.left_outer_joins({}) }.first
+ assert_no_match(/LEFT OUTER JOIN/i, sql)
+ end
+
+ def test_construct_finder_sql_ignores_empty_left_outer_joins_array
+ sql = capture_sql { Author.left_outer_joins([]) }.first
+ assert_no_match(/LEFT OUTER JOIN/i, sql)
+ end
+
+ def test_left_outer_joins_forbids_to_use_string_as_argument
+ assert_raise(ArgumentError){ Author.left_outer_joins('LEFT OUTER JOIN "posts" ON "posts"."user_id" = "users"."id"').to_a }
+ end
+
+ def test_join_conditions_added_to_join_clause
+ sql = capture_sql { Author.left_outer_joins(:essays).to_a }.first
+ assert_match(/writer_type.*?=.*?(Author|\?|\$1)/i, sql)
+ assert_no_match(/WHERE/i, sql)
+ end
+
+ def test_find_with_sti_join
+ scope = Post.left_outer_joins(:special_comments).where(:id => posts(:sti_comments).id)
+
+ # The join should match SpecialComment and its subclasses only
+ assert scope.where("comments.type" => "Comment").empty?
+ assert !scope.where("comments.type" => "SpecialComment").empty?
+ assert !scope.where("comments.type" => "SubSpecialComment").empty?
+ end
+
+ def test_does_not_override_select
+ authors = Author.select("authors.name, #{%{(authors.author_address_id || ' ' || authors.author_address_extra_id) as addr_id}}").left_outer_joins(:posts)
+ assert authors.any?
+ assert authors.first.respond_to?(:addr_id)
+ end
+
+ test "the default scope of the target is applied when joining associations" do
+ author = Author.create! name: "Jon"
+ author.categorizations.create!
+ author.categorizations.create! special: true
+
+ assert_equal [author], Author.where(id: author).left_outer_joins(:special_categorizations)
+ end
+end