aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/attributes/test_attribute.rb6
-rw-r--r--test/helper.rb2
-rw-r--r--test/nodes/test_node.rb4
-rw-r--r--test/test_crud.rb18
-rw-r--r--test/test_factory_methods.rb27
-rw-r--r--test/test_select_manager.rb85
-rw-r--r--test/test_table.rb77
-rw-r--r--test/visitors/test_depth_first.rb26
-rw-r--r--test/visitors/test_dot.rb28
-rw-r--r--test/visitors/test_join_sql.rb21
-rw-r--r--test/visitors/test_to_sql.rb23
11 files changed, 216 insertions, 101 deletions
diff --git a/test/attributes/test_attribute.rb b/test/attributes/test_attribute.rb
index 06954c242b..df7dc69621 100644
--- a/test/attributes/test_attribute.rb
+++ b/test/attributes/test_attribute.rb
@@ -326,7 +326,7 @@ module Arel
describe '#eq' do
it 'should return an equality node' do
- attribute = Attribute.new nil, nil, nil
+ attribute = Attribute.new nil, nil
equality = attribute.eq 1
equality.left.must_equal attribute
equality.right.must_equal 1
@@ -485,7 +485,7 @@ module Arel
end
it 'should return an in node' do
- attribute = Attribute.new nil, nil, nil
+ attribute = Attribute.new nil, nil
node = Nodes::In.new attribute, [1,2,3]
node.left.must_equal attribute
node.right.must_equal [1, 2, 3]
@@ -538,7 +538,7 @@ module Arel
end
it 'should return a NotIn node' do
- attribute = Attribute.new nil, nil, nil
+ attribute = Attribute.new nil, nil
node = Nodes::NotIn.new attribute, [1,2,3]
node.left.must_equal attribute
node.right.must_equal [1, 2, 3]
diff --git a/test/helper.rb b/test/helper.rb
index 3f9ac22447..f13596f9ec 100644
--- a/test/helper.rb
+++ b/test/helper.rb
@@ -8,6 +8,6 @@ Arel::Table.engine = Arel::Sql::Engine.new(FakeRecord::Base.new)
class Object
def must_be_like other
- self.gsub(/\s+/, ' ').strip.must_equal other.gsub(/\s+/, ' ').strip
+ gsub(/\s+/, ' ').strip.must_equal other.gsub(/\s+/, ' ').strip
end
end
diff --git a/test/nodes/test_node.rb b/test/nodes/test_node.rb
index 71d2098a60..ffa3f273ea 100644
--- a/test/nodes/test_node.rb
+++ b/test/nodes/test_node.rb
@@ -2,6 +2,10 @@ require 'helper'
module Arel
class TestNode < MiniTest::Unit::TestCase
+ def test_includes_factory_methods
+ assert Node.new.respond_to?(:create_join)
+ end
+
def test_all_nodes_are_nodes
Nodes.constants.map { |k|
Nodes.const_get(k)
diff --git a/test/test_crud.rb b/test/test_crud.rb
index 582f0ec072..fe3e4f2e02 100644
--- a/test/test_crud.rb
+++ b/test/test_crud.rb
@@ -35,10 +35,8 @@ module Arel
table = Table.new :users
fc = FakeCrudder.new
fc.from table
- fc.insert [[table[:id], 'foo']]
- fc.engine.calls.find { |method, _|
- method == :insert
- }.wont_be_nil
+ im = fc.compile_insert [[table[:id], 'foo']]
+ assert_instance_of Arel::InsertManager, im
end
end
@@ -47,10 +45,8 @@ module Arel
table = Table.new :users
fc = FakeCrudder.new
fc.from table
- fc.update [[table[:id], 'foo']]
- fc.engine.calls.find { |method, _|
- method == :update
- }.wont_be_nil
+ stmt = fc.compile_update [[table[:id], 'foo']]
+ assert_instance_of Arel::UpdateManager, stmt
end
end
@@ -59,10 +55,8 @@ module Arel
table = Table.new :users
fc = FakeCrudder.new
fc.from table
- fc.delete
- fc.engine.calls.find { |method, _|
- method == :delete
- }.wont_be_nil
+ stmt = fc.compile_delete
+ assert_instance_of Arel::DeleteManager, stmt
end
end
end
diff --git a/test/test_factory_methods.rb b/test/test_factory_methods.rb
new file mode 100644
index 0000000000..6506d3c472
--- /dev/null
+++ b/test/test_factory_methods.rb
@@ -0,0 +1,27 @@
+require 'helper'
+
+module Arel
+ module FactoryMethods
+ class TestFactoryMethods < MiniTest::Unit::TestCase
+ class Factory
+ include Arel::FactoryMethods
+ end
+
+ def setup
+ @factory = Factory.new
+ end
+
+ def test_create_join
+ join = @factory.create_join :one, :two
+ assert_kind_of Nodes::Join, join
+ assert_equal :two, join.right
+ end
+
+ def test_create_on
+ on = @factory.create_on :one
+ assert_instance_of Nodes::On, on
+ assert_equal :one, on.expr
+ end
+ end
+ end
+end
diff --git a/test/test_select_manager.rb b/test/test_select_manager.rb
index d63bec0093..7c8da972e1 100644
--- a/test/test_select_manager.rb
+++ b/test/test_select_manager.rb
@@ -26,6 +26,17 @@ module Arel
def quote_table_name thing; @engine.connection.quote_table_name thing end
def quote_column_name thing; @engine.connection.quote_column_name thing end
def quote thing, column; @engine.connection.quote thing, column end
+ def columns table, message = nil
+ @engine.connection.columns table, message
+ end
+
+ def table_exists? name
+ @engine.connection.table_exists? name
+ end
+
+ def tables
+ @engine.connection.tables
+ end
def execute sql, name = nil, *args
@executed << sql
@@ -36,6 +47,12 @@ module Arel
end
describe 'select manager' do
+ def test_join_sources
+ manager = Arel::SelectManager.new Table.engine
+ manager.join_sources << Arel::Nodes::StringJoin.new('foo')
+ assert_equal "SELECT FROM 'foo'", manager.to_sql
+ end
+
describe 'backwards compatibility' do
describe 'project' do
it 'accepts symbols as sql literals' do
@@ -266,6 +283,35 @@ module Arel
end
end
+ it 'should hand back froms' do
+ relation = Arel::SelectManager.new Table.engine
+ assert_equal [], relation.froms
+ end
+
+ it 'should create and nodes' do
+ relation = Arel::SelectManager.new Table.engine
+ children = ['foo', 'bar', 'baz']
+ clause = relation.create_and children
+ assert_kind_of Arel::Nodes::And, clause
+ assert_equal children, clause.children
+ end
+
+ it 'should create join nodes' do
+ relation = Arel::SelectManager.new Table.engine
+ join = relation.create_join 'foo', 'bar'
+ assert_kind_of Arel::Nodes::InnerJoin, join
+ assert_equal 'foo', join.left
+ assert_equal 'bar', join.right
+ end
+
+ it 'should create join nodes with a klass' do
+ relation = Arel::SelectManager.new Table.engine
+ join = relation.create_join 'foo', 'bar', Arel::Nodes::OuterJoin
+ assert_kind_of Arel::Nodes::OuterJoin, join
+ assert_equal 'foo', join.left
+ assert_equal 'bar', join.right
+ end
+
describe 'join' do
it 'responds to join' do
left = Table.new :users
@@ -308,30 +354,27 @@ module Arel
table = Table.new :users
aliaz = table.alias
manager = Arel::SelectManager.new Table.engine
- manager.from Nodes::InnerJoin.new(table, aliaz, table[:id].eq(aliaz[:id]))
+ manager.from Nodes::InnerJoin.new(aliaz, table[:id].eq(aliaz[:id]))
manager.join_sql.must_be_like %{
INNER JOIN "users" "users_2" "users"."id" = "users_2"."id"
}
- manager.joins(manager).must_equal manager.join_sql
end
it 'returns outer join sql' do
table = Table.new :users
aliaz = table.alias
manager = Arel::SelectManager.new Table.engine
- manager.from Nodes::OuterJoin.new(table, aliaz, table[:id].eq(aliaz[:id]))
+ manager.from Nodes::OuterJoin.new(aliaz, table[:id].eq(aliaz[:id]))
manager.join_sql.must_be_like %{
LEFT OUTER JOIN "users" "users_2" "users"."id" = "users_2"."id"
}
- manager.joins(manager).must_equal manager.join_sql
end
it 'returns string join sql' do
table = Table.new :users
manager = Arel::SelectManager.new Table.engine
- manager.from Nodes::StringJoin.new(table, 'hello')
+ manager.from Nodes::StringJoin.new('hello')
manager.join_sql.must_be_like %{ 'hello' }
- manager.joins(manager).must_equal manager.join_sql
end
it 'returns nil join sql' do
@@ -393,9 +436,9 @@ module Arel
table = Table.new :users
manager = Arel::SelectManager.new engine
manager.from table
- manager.delete
+ stmt = manager.compile_delete
- engine.executed.last.must_be_like %{ DELETE FROM "users" }
+ stmt.to_sql.must_be_like %{ DELETE FROM "users" }
end
it "copies where" do
@@ -404,9 +447,9 @@ module Arel
manager = Arel::SelectManager.new engine
manager.from table
manager.where table[:id].eq 10
- manager.delete
+ stmt = manager.compile_delete
- engine.executed.last.must_be_like %{
+ stmt.to_sql.must_be_like %{
DELETE FROM "users" WHERE "users"."id" = 10
}
end
@@ -436,9 +479,10 @@ module Arel
manager = Arel::SelectManager.new engine
manager.from table
manager.take 1
- manager.update(SqlLiteral.new('foo = bar'))
+ stmt = manager.compile_update(SqlLiteral.new('foo = bar'))
+ stmt.key = table['id']
- engine.executed.last.must_be_like %{
+ stmt.to_sql.must_be_like %{
UPDATE "users" SET foo = bar
WHERE "users"."id" IN (SELECT "users"."id" FROM "users" LIMIT 1)
}
@@ -450,9 +494,10 @@ module Arel
manager = Arel::SelectManager.new engine
manager.from table
manager.order :foo
- manager.update(SqlLiteral.new('foo = bar'))
+ stmt = manager.compile_update(SqlLiteral.new('foo = bar'))
+ stmt.key = table['id']
- engine.executed.last.must_be_like %{
+ stmt.to_sql.must_be_like %{
UPDATE "users" SET foo = bar
WHERE "users"."id" IN (SELECT "users"."id" FROM "users" ORDER BY foo)
}
@@ -463,9 +508,9 @@ module Arel
table = Table.new :users
manager = Arel::SelectManager.new engine
manager.from table
- manager.update(SqlLiteral.new('foo = bar'))
+ stmt = manager.compile_update(SqlLiteral.new('foo = bar'))
- engine.executed.last.must_be_like %{ UPDATE "users" SET foo = bar }
+ stmt.to_sql.must_be_like %{ UPDATE "users" SET foo = bar }
end
it 'copies where clauses' do
@@ -474,9 +519,9 @@ module Arel
manager = Arel::SelectManager.new engine
manager.where table[:id].eq 10
manager.from table
- manager.update(table[:id] => 1)
+ stmt = manager.compile_update(table[:id] => 1)
- engine.executed.last.must_be_like %{
+ stmt.to_sql.must_be_like %{
UPDATE "users" SET "id" = 1 WHERE "users"."id" = 10
}
end
@@ -486,9 +531,9 @@ module Arel
table = Table.new :users
manager = Arel::SelectManager.new engine
manager.from table
- manager.update(table[:id] => 1)
+ stmt = manager.compile_update(table[:id] => 1)
- engine.executed.last.must_be_like %{
+ stmt.to_sql.must_be_like %{
UPDATE "users" SET "id" = 1
}
end
diff --git a/test/test_table.rb b/test/test_table.rb
index 8d37a8eaff..129d7ba736 100644
--- a/test/test_table.rb
+++ b/test/test_table.rb
@@ -6,6 +6,38 @@ module Arel
@relation = Table.new(:users)
end
+ it 'should create join nodes' do
+ join = @relation.create_string_join 'foo'
+ assert_kind_of Arel::Nodes::StringJoin, join
+ assert_equal 'foo', join.left
+ end
+
+ it 'should create join nodes' do
+ join = @relation.create_join 'foo', 'bar'
+ assert_kind_of Arel::Nodes::InnerJoin, join
+ assert_equal 'foo', join.left
+ assert_equal 'bar', join.right
+ end
+
+ it 'should create join nodes with a klass' do
+ join = @relation.create_join 'foo', 'bar', Arel::Nodes::OuterJoin
+ assert_kind_of Arel::Nodes::OuterJoin, join
+ assert_equal 'foo', join.left
+ assert_equal 'bar', join.right
+ end
+
+ it 'should return an insert manager' do
+ im = @relation.compile_insert 'VALUES(NULL)'
+ assert_kind_of Arel::InsertManager, im
+ assert_equal 'INSERT INTO NULL VALUES(NULL)', im.to_sql
+ end
+
+ it 'should return IM from insert_manager' do
+ im = @relation.insert_manager
+ assert_kind_of Arel::InsertManager, im
+ assert_equal im.engine, @relation.engine
+ end
+
describe 'skip' do
it 'should add an offset' do
sm = @relation.skip 2
@@ -13,12 +45,6 @@ module Arel
end
end
- describe 'primary_key' do
- it 'should return an attribute' do
- @relation.primary_key.name.must_equal :id
- end
- end
-
describe 'select_manager' do
it 'should return an empty select manager' do
sm = @relation.select_manager
@@ -36,12 +62,6 @@ module Arel
end
describe 'backwards compat' do
- describe 'joins' do
- it 'returns nil' do
- @relation.joins(nil).must_equal nil
- end
- end
-
describe 'join' do
it 'noops on nil' do
mgr = @relation.join nil
@@ -84,13 +104,6 @@ module Arel
end
describe 'new' do
- it 'takes :columns' do
- columns = Table.engine.connection.columns("users")
- @relation = Table.new(:users, :columns => columns)
- @relation.columns.first.name.must_equal :id
- @relation.engine.must_equal Table.engine
- end
-
it 'should accept an engine' do
rel = Table.new :users, 'foo'
rel.engine.must_equal 'foo'
@@ -147,14 +160,6 @@ module Arel
end
end
- describe 'columns' do
- it 'returns a list of columns' do
- columns = @relation.columns
- columns.length.must_equal 4
- columns.map { |x| x.name.to_s }.sort.must_equal %w{ created_at bool name id }.sort
- end
- end
-
it "should have a name" do
@relation.name.must_equal 'users'
end
@@ -168,24 +173,6 @@ module Arel
it "manufactures an attribute if the symbol names an attribute within the relation" do
column = @relation[:id]
column.name.must_equal :id
- column.must_be_kind_of Attributes::Integer
- end
- end
-
- describe 'when table does not exist' do
- it 'returns nil' do
- @relation[:foooo].must_be_nil
- end
- end
- end
- end
-
- describe Table do
- describe 'when checking the existence of a table' do
- it 'should be present in the table cache despite the class of its name' do
- [ 'users', :users ].each do |name|
- relation = Table.new name
- Table.table_cache(relation.engine).key?(relation.name).must_equal true
end
end
end
diff --git a/test/visitors/test_depth_first.rb b/test/visitors/test_depth_first.rb
index 1bee0328cf..4bce468183 100644
--- a/test/visitors/test_depth_first.rb
+++ b/test/visitors/test_depth_first.rb
@@ -29,6 +29,7 @@ module Arel
Arel::Nodes::Grouping,
Arel::Nodes::Offset,
Arel::Nodes::Having,
+ Arel::Nodes::StringJoin,
Arel::Nodes::UnqualifiedColumn,
].each do |klass|
define_method("test_#{klass.name.gsub('::', '_')}") do
@@ -66,19 +67,18 @@ module Arel
end
def test_inner_join
- join = Nodes::InnerJoin.new :a, :b, :c
+ join = Nodes::InnerJoin.new :a, :b
@visitor.accept join
- assert_equal [:a, :b, :c, join], @collector.calls
+ assert_equal [:a, :b, join], @collector.calls
end
def test_outer_join
- join = Nodes::OuterJoin.new :a, :b, :c
+ join = Nodes::OuterJoin.new :a, :b
@visitor.accept join
- assert_equal [:a, :b, :c, join], @collector.calls
+ assert_equal [:a, :b, join], @collector.calls
end
[
- Arel::Nodes::And,
Arel::Nodes::Assignment,
Arel::Nodes::Between,
Arel::Nodes::DoesNotMatch,
@@ -92,12 +92,12 @@ module Arel
Arel::Nodes::NotEqual,
Arel::Nodes::NotIn,
Arel::Nodes::Or,
- Arel::Nodes::StringJoin,
Arel::Nodes::TableAlias,
Arel::Nodes::Values,
Arel::Nodes::As,
Arel::Nodes::DeleteStatement,
Arel::Nodes::Ordering,
+ Arel::Nodes::JoinSource,
].each do |klass|
define_method("test_#{klass.name.gsub('::', '_')}") do
binary = klass.new(:a, :b)
@@ -106,6 +106,17 @@ module Arel
end
end
+ # N-ary
+ [
+ Arel::Nodes::And,
+ ].each do |klass|
+ define_method("test_#{klass.name.gsub('::', '_')}") do
+ binary = klass.new([:a, :b, :c])
+ @visitor.accept binary
+ assert_equal [:a, :b, :c, binary], @collector.calls
+ end
+ end
+
[
Arel::Attributes::Integer,
Arel::Attributes::Float,
@@ -165,7 +176,8 @@ module Arel
@visitor.accept core
assert_equal [
:a, core.projections,
- :b,
+ :b, [],
+ core.source,
:c, core.wheres,
:d, core.groups,
:e,
diff --git a/test/visitors/test_dot.rb b/test/visitors/test_dot.rb
index 19a554ce42..de6dd87c4c 100644
--- a/test/visitors/test_dot.rb
+++ b/test/visitors/test_dot.rb
@@ -22,6 +22,34 @@ module Arel
@visitor.accept op
end
end
+
+ # binary ops
+ [
+ Arel::Nodes::Assignment,
+ Arel::Nodes::Between,
+ Arel::Nodes::DoesNotMatch,
+ Arel::Nodes::Equality,
+ Arel::Nodes::GreaterThan,
+ Arel::Nodes::GreaterThanOrEqual,
+ Arel::Nodes::In,
+ Arel::Nodes::LessThan,
+ Arel::Nodes::LessThanOrEqual,
+ Arel::Nodes::Matches,
+ Arel::Nodes::NotEqual,
+ Arel::Nodes::NotIn,
+ Arel::Nodes::Or,
+ Arel::Nodes::TableAlias,
+ Arel::Nodes::Values,
+ Arel::Nodes::As,
+ Arel::Nodes::DeleteStatement,
+ Arel::Nodes::Ordering,
+ Arel::Nodes::JoinSource,
+ ].each do |klass|
+ define_method("test_#{klass.name.gsub('::', '_')}") do
+ binary = klass.new(:a, :b)
+ @visitor.accept binary
+ end
+ end
end
end
end
diff --git a/test/visitors/test_join_sql.rb b/test/visitors/test_join_sql.rb
index 8253fe5ab4..b672f88ecf 100644
--- a/test/visitors/test_join_sql.rb
+++ b/test/visitors/test_join_sql.rb
@@ -4,15 +4,21 @@ module Arel
module Visitors
describe 'the join_sql visitor' do
before do
- @visitor = JoinSql.new Table.engine
+ @visitor = ToSql.new Table.engine
+ @visitor.extend(JoinSql)
+ end
+
+ it 'should visit string join' do
+ sql = @visitor.accept Nodes::StringJoin.new('omg')
+ sql.must_be_like "'omg'"
end
describe 'inner join' do
it 'should visit left if left is a join' do
t = Table.new :users
- join = Nodes::InnerJoin.new t, t, Nodes::On.new(t[:id])
- j2 = Nodes::InnerJoin.new join, t, Nodes::On.new(t[:id])
- @visitor.accept(j2).must_be_like %{
+ sm = t.select_manager
+ sm.join(t).on(t[:id]).join(t).on(t[:id])
+ sm.join_sql.must_be_like %{
INNER JOIN "users" ON "users"."id"
INNER JOIN "users" ON "users"."id"
}
@@ -22,9 +28,10 @@ module Arel
describe 'outer join' do
it 'should visit left if left is a join' do
t = Table.new :users
- join = Nodes::OuterJoin.new t, t, Nodes::On.new(t[:id])
- j2 = Nodes::OuterJoin.new join, t, Nodes::On.new(t[:id])
- @visitor.accept(j2).must_be_like %{
+ sm = t.select_manager
+ sm.join(t, Nodes::OuterJoin).on(t[:id]).join(
+ t, Nodes::OuterJoin).on(t[:id])
+ sm.join_sql.must_be_like %{
LEFT OUTER JOIN "users" ON "users"."id"
LEFT OUTER JOIN "users" ON "users"."id"
}
diff --git a/test/visitors/test_to_sql.rb b/test/visitors/test_to_sql.rb
index 33783f7d23..34ebb2b278 100644
--- a/test/visitors/test_to_sql.rb
+++ b/test/visitors/test_to_sql.rb
@@ -5,7 +5,14 @@ module Arel
describe 'the to_sql visitor' do
before do
@visitor = ToSql.new Table.engine
- @attr = Table.new(:users)[:id]
+ @table = Table.new(:users)
+ @attr = @table[:id]
+ end
+
+ it 'should not quote sql literals' do
+ node = @table[Arel.star]
+ sql = @visitor.accept node
+ sql.must_be_like '"users".*'
end
describe 'equality' do
@@ -50,7 +57,7 @@ module Arel
end
it "should apply Not to the whole expression" do
- node = Nodes::And.new @attr.eq(10), @attr.eq(11)
+ node = Nodes::And.new [@attr.eq(10), @attr.eq(11)]
sql = @visitor.accept Nodes::Not.new(node)
sql.must_be_like %{NOT ("users"."id" = 10 AND "users"."id" = 11)}
end
@@ -82,7 +89,7 @@ module Arel
end
it "should visit_Arel_Nodes_And" do
- node = Nodes::And.new @attr.eq(10), @attr.eq(11)
+ node = Nodes::And.new [@attr.eq(10), @attr.eq(11)]
@visitor.accept(node).must_be_like %{
"users"."id" = 10 AND "users"."id" = 11
}
@@ -96,7 +103,7 @@ module Arel
end
it "should visit visit_Arel_Attributes_Time" do
- attr = Attributes::Time.new(@attr.relation, @attr.name, @attr.column)
+ attr = Attributes::Time.new(@attr.relation, @attr.name)
@visitor.accept attr
end
@@ -164,7 +171,9 @@ module Arel
end
in_node = Nodes::In.new @attr, %w{ a b c }
visitor = visitor.new(Table.engine)
- visitor.expected = @attr.column
+ visitor.expected = Table.engine.connection.columns(:users).find { |x|
+ x.name == 'name'
+ }
visitor.accept(in_node).must_equal %("users"."name" IN ('a', 'b', 'c'))
end
end
@@ -219,7 +228,9 @@ module Arel
end
in_node = Nodes::NotIn.new @attr, %w{ a b c }
visitor = visitor.new(Table.engine)
- visitor.expected = @attr.column
+ visitor.expected = Table.engine.connection.columns(:users).find { |x|
+ x.name == 'name'
+ }
visitor.accept(in_node).must_equal %("users"."name" NOT IN ('a', 'b', 'c'))
end
end