aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/nodes/test_sql_literal.rb2
-rw-r--r--test/nodes/test_sum.rb9
-rw-r--r--test/test_delete_manager.rb8
-rw-r--r--test/test_select_manager.rb30
-rw-r--r--test/visitors/test_mssql.rb9
-rw-r--r--test/visitors/test_oracle.rb4
-rw-r--r--test/visitors/test_oracle12.rb47
-rw-r--r--test/visitors/test_postgres.rb57
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