diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/nodes/test_sql_literal.rb | 2 | ||||
-rw-r--r-- | test/nodes/test_sum.rb | 9 | ||||
-rw-r--r-- | test/test_delete_manager.rb | 8 | ||||
-rw-r--r-- | test/test_select_manager.rb | 30 | ||||
-rw-r--r-- | test/visitors/test_mssql.rb | 9 | ||||
-rw-r--r-- | test/visitors/test_oracle.rb | 4 | ||||
-rw-r--r-- | test/visitors/test_oracle12.rb | 47 | ||||
-rw-r--r-- | test/visitors/test_postgres.rb | 57 |
8 files changed, 155 insertions, 11 deletions
diff --git a/test/nodes/test_sql_literal.rb b/test/nodes/test_sql_literal.rb index ed602cc47d..c09e5882d5 100644 --- a/test/nodes/test_sql_literal.rb +++ b/test/nodes/test_sql_literal.rb @@ -56,7 +56,7 @@ module Arel end describe 'grouped "and" equality' do - it 'makes a grouping node with an or node' do + it 'makes a grouping node with an and node' do node = SqlLiteral.new('foo').eq_all([1,2]) compile(node).must_be_like %{ (foo = 1 AND foo = 2) } end diff --git a/test/nodes/test_sum.rb b/test/nodes/test_sum.rb index d65cd31d4b..d387e7f9ef 100644 --- a/test/nodes/test_sum.rb +++ b/test/nodes/test_sum.rb @@ -21,4 +21,13 @@ describe Arel::Nodes::Sum do assert_equal 2, array.uniq.size end end + + describe 'order' do + it 'should order the sum' do + table = Arel::Table.new :users + table[:id].sum.desc.to_sql.must_be_like %{ + SUM("users"."id") DESC + } + end + end end diff --git a/test/test_delete_manager.rb b/test/test_delete_manager.rb index b16b52cb9e..ece2389d88 100644 --- a/test/test_delete_manager.rb +++ b/test/test_delete_manager.rb @@ -8,6 +8,14 @@ module Arel end end + it 'handles limit properly' do + table = Table.new(:users) + dm = Arel::DeleteManager.new + dm.take 10 + dm.from table + assert_match(/LIMIT 10/, dm.to_sql) + end + describe 'from' do it 'uses from' do table = Table.new(:users) diff --git a/test/test_select_manager.rb b/test/test_select_manager.rb index 7192027df4..8425cee031 100644 --- a/test/test_select_manager.rb +++ b/test/test_select_manager.rb @@ -584,6 +584,36 @@ module Arel } end + it 'takes the full outer join class' do + left = Table.new :users + right = left.alias + predicate = left[:id].eq(right[:id]) + manager = Arel::SelectManager.new + + manager.from left + manager.join(right, Nodes::FullOuterJoin).on(predicate) + manager.to_sql.must_be_like %{ + SELECT FROM "users" + FULL OUTER JOIN "users" "users_2" + ON "users"."id" = "users_2"."id" + } + end + + it 'takes the right outer join class' do + left = Table.new :users + right = left.alias + predicate = left[:id].eq(right[:id]) + manager = Arel::SelectManager.new + + manager.from left + manager.join(right, Nodes::RightOuterJoin).on(predicate) + manager.to_sql.must_be_like %{ + SELECT FROM "users" + RIGHT OUTER JOIN "users" "users_2" + ON "users"."id" = "users_2"."id" + } + end + it 'noops on nil' do manager = Arel::SelectManager.new manager.join(nil).must_equal manager diff --git a/test/visitors/test_mssql.rb b/test/visitors/test_mssql.rb index 7574aeb0a2..fe228bce4b 100644 --- a/test/visitors/test_mssql.rb +++ b/test/visitors/test_mssql.rb @@ -45,6 +45,15 @@ module Arel connection.verify end + it 'should use TOP for limited deletes' do + stmt = Nodes::DeleteStatement.new + stmt.relation = @table + stmt.limit = Nodes::Limit.new(10) + sql = compile(stmt) + + sql.must_be_like "DELETE TOP (10) FROM \"users\"" + end + it 'should go over query ORDER BY if .order()' do stmt = Nodes::SelectStatement.new stmt.limit = Nodes::Limit.new(10) diff --git a/test/visitors/test_oracle.rb b/test/visitors/test_oracle.rb index 41e77d93c0..e9ed9d76b3 100644 --- a/test/visitors/test_oracle.rb +++ b/test/visitors/test_oracle.rb @@ -111,7 +111,7 @@ module Arel it 'creates a different subquery when there is an offset' do stmt = Nodes::SelectStatement.new - stmt.limit = Nodes::Limit.new(Nodes.build_quoted(10)) + stmt.limit = Nodes::Limit.new(10) stmt.offset = Nodes::Offset.new(10) sql = compile stmt sql.must_be_like %{ @@ -126,7 +126,7 @@ module Arel it 'is idempotent with different subquery' do stmt = Nodes::SelectStatement.new - stmt.limit = Nodes::Limit.new(Nodes.build_quoted(10)) + stmt.limit = Nodes::Limit.new(10) stmt.offset = Nodes::Offset.new(10) sql = compile stmt sql2 = compile stmt diff --git a/test/visitors/test_oracle12.rb b/test/visitors/test_oracle12.rb new file mode 100644 index 0000000000..df0f01b30b --- /dev/null +++ b/test/visitors/test_oracle12.rb @@ -0,0 +1,47 @@ +require 'helper' + +module Arel + module Visitors + describe 'the oracle visitor' do + before do + @visitor = Oracle12.new Table.engine.connection_pool + end + + def compile node + @visitor.accept(node, Collectors::SQLString.new).value + end + + it 'modified except to be minus' do + left = Nodes::SqlLiteral.new("SELECT * FROM users WHERE age > 10") + right = Nodes::SqlLiteral.new("SELECT * FROM users WHERE age > 20") + sql = compile Nodes::Except.new(left, right) + sql.must_be_like %{ + ( SELECT * FROM users WHERE age > 10 MINUS SELECT * FROM users WHERE age > 20 ) + } + end + + it 'generates select options offset then limit' do + stmt = Nodes::SelectStatement.new + stmt.offset = Nodes::Offset.new(1) + stmt.limit = Nodes::Limit.new(10) + sql = compile(stmt) + sql.must_be_like "SELECT OFFSET 1 ROWS FETCH FIRST 10 ROWS ONLY" + end + + describe 'locking' do + it 'removes limit when locking' do + stmt = Nodes::SelectStatement.new + stmt.limit = Nodes::Limit.new(10) + stmt.lock = Nodes::Lock.new(Arel.sql('FOR UPDATE')) + sql = compile(stmt) + sql.must_be_like "SELECT FOR UPDATE" + end + + it 'defaults to FOR UPDATE when locking' do + node = Nodes::Lock.new(Arel.sql('FOR UPDATE')) + compile(node).must_be_like "FOR UPDATE" + end + end + end + end +end diff --git a/test/visitors/test_postgres.rb b/test/visitors/test_postgres.rb index d6de216d91..4b7dbe367f 100644 --- a/test/visitors/test_postgres.rb +++ b/test/visitors/test_postgres.rb @@ -53,11 +53,21 @@ module Arel describe "Nodes::Matches" do it "should know how to visit" do node = @table[:name].matches('foo%') + node.must_be_kind_of Nodes::Matches + node.case_sensitive.must_equal(false) compile(node).must_be_like %{ "users"."name" ILIKE 'foo%' } end + it "should know how to visit case sensitive" do + node = @table[:name].matches('foo%', nil, true) + node.case_sensitive.must_equal(true) + compile(node).must_be_like %{ + "users"."name" LIKE 'foo%' + } + end + it "can handle ESCAPE" do node = @table[:name].matches('foo!%', '!') compile(node).must_be_like %{ @@ -77,11 +87,21 @@ module Arel describe "Nodes::DoesNotMatch" do it "should know how to visit" do node = @table[:name].does_not_match('foo%') + node.must_be_kind_of Nodes::DoesNotMatch + node.case_sensitive.must_equal(false) compile(node).must_be_like %{ "users"."name" NOT ILIKE 'foo%' } end + it "should know how to visit case sensitive" do + node = @table[:name].does_not_match('foo%', nil, true) + node.case_sensitive.must_equal(true) + compile(node).must_be_like %{ + "users"."name" NOT LIKE 'foo%' + } + end + it "can handle ESCAPE" do node = @table[:name].does_not_match('foo!%', '!') compile(node).must_be_like %{ @@ -100,34 +120,55 @@ module Arel describe "Nodes::Regexp" do it "should know how to visit" do - node = Arel::Nodes::Regexp.new(@table[:name], Nodes.build_quoted('foo%')) + node = @table[:name].matches_regexp('foo.*') + node.must_be_kind_of Nodes::Regexp + node.case_sensitive.must_equal(true) compile(node).must_be_like %{ - "users"."name" ~ 'foo%' + "users"."name" ~ 'foo.*' + } + end + + it "can handle case insensitive" do + node = @table[:name].matches_regexp('foo.*', false) + node.must_be_kind_of Nodes::Regexp + node.case_sensitive.must_equal(false) + compile(node).must_be_like %{ + "users"."name" ~* 'foo.*' } end it 'can handle subqueries' do - subquery = @table.project(:id).where(Arel::Nodes::Regexp.new(@table[:name], Nodes.build_quoted('foo%'))) + subquery = @table.project(:id).where(@table[:name].matches_regexp('foo.*')) node = @attr.in subquery compile(node).must_be_like %{ - "users"."id" IN (SELECT id FROM "users" WHERE "users"."name" ~ 'foo%') + "users"."id" IN (SELECT id FROM "users" WHERE "users"."name" ~ 'foo.*') } end end describe "Nodes::NotRegexp" do it "should know how to visit" do - node = Arel::Nodes::NotRegexp.new(@table[:name], Nodes.build_quoted('foo%')) + node = @table[:name].does_not_match_regexp('foo.*') + node.must_be_kind_of Nodes::NotRegexp + node.case_sensitive.must_equal(true) + compile(node).must_be_like %{ + "users"."name" !~ 'foo.*' + } + end + + it "can handle case insensitive" do + node = @table[:name].does_not_match_regexp('foo.*', false) + node.case_sensitive.must_equal(false) compile(node).must_be_like %{ - "users"."name" !~ 'foo%' + "users"."name" !~* 'foo.*' } end it 'can handle subqueries' do - subquery = @table.project(:id).where(Arel::Nodes::NotRegexp.new(@table[:name], Nodes.build_quoted('foo%'))) + subquery = @table.project(:id).where(@table[:name].does_not_match_regexp('foo.*')) node = @attr.in subquery compile(node).must_be_like %{ - "users"."id" IN (SELECT id FROM "users" WHERE "users"."name" !~ 'foo%') + "users"."id" IN (SELECT id FROM "users" WHERE "users"."name" !~ 'foo.*') } end end |