1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/test/test_table.rb
Aaron Patterson 93d72131bc add the casting node to the AST at build time
If we add the casting node to the ast at build time, then we can avoid
doing the lookup at visit time.
2014-03-24 16:26:09 -07:00

209 lines
5.7 KiB
Ruby

require 'helper'
module Arel
describe Table do
before do
@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
im.into Table.new(:users)
assert_equal "INSERT INTO \"users\" 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
sm.to_sql.must_be_like "SELECT FROM \"users\" OFFSET 2"
end
end
describe 'select_manager' do
it 'should return an empty select manager' do
sm = @relation.select_manager
sm.to_sql.must_be_like 'SELECT'
end
end
describe 'having' do
it 'adds a having clause' do
mgr = @relation.having @relation[:id].eq(10)
mgr.to_sql.must_be_like %{
SELECT FROM "users" HAVING "users"."id" = 10
}
end
end
describe 'backwards compat' do
describe 'join' do
it 'noops on nil' do
mgr = @relation.join nil
mgr.to_sql.must_be_like %{ SELECT FROM "users" }
end
it 'takes a second argument for join type' do
right = @relation.alias
predicate = @relation[:id].eq(right[:id])
mgr = @relation.join(right, Nodes::OuterJoin).on(predicate)
mgr.to_sql.must_be_like %{
SELECT FROM "users"
LEFT OUTER JOIN "users" "users_2"
ON "users"."id" = "users_2"."id"
}
end
end
end
describe 'group' do
it 'should create a group' do
manager = @relation.group @relation[:id]
manager.to_sql.must_be_like %{
SELECT FROM "users" GROUP BY "users"."id"
}
end
end
describe 'alias' do
it 'should create a node that proxies to a table' do
@relation.aliases.must_equal []
node = @relation.alias
@relation.aliases.must_equal [node]
node.name.must_equal 'users_2'
node[:id].relation.must_equal node
end
end
describe 'new' do
it 'should accept an engine' do
rel = Table.new :users, 'foo'
rel.engine.must_equal 'foo'
end
it 'should accept a hash' do
rel = Table.new :users, :engine => 'foo'
rel.engine.must_equal 'foo'
end
it 'ignores as if it equals name' do
rel = Table.new :users, :as => 'users'
rel.table_alias.must_be_nil
end
end
describe 'order' do
it "should take an order" do
manager = @relation.order "foo"
manager.to_sql.must_be_like %{ SELECT FROM "users" ORDER BY foo }
end
end
describe 'take' do
it "should add a limit" do
manager = @relation.take 1
manager.project Nodes::SqlLiteral.new '*'
manager.to_sql.must_be_like %{ SELECT * FROM "users" LIMIT 1 }
end
end
describe 'project' do
it 'can project' do
manager = @relation.project Nodes::SqlLiteral.new '*'
manager.to_sql.must_be_like %{ SELECT * FROM "users" }
end
it 'takes multiple parameters' do
manager = @relation.project Nodes::SqlLiteral.new('*'), Nodes::SqlLiteral.new('*')
manager.to_sql.must_be_like %{ SELECT *, * FROM "users" }
end
end
describe 'where' do
it "returns a tree manager" do
manager = @relation.where @relation[:id].eq 1
manager.project @relation[:id]
manager.must_be_kind_of TreeManager
manager.to_sql.must_be_like %{
SELECT "users"."id"
FROM "users"
WHERE "users"."id" = 1
}
end
end
it "should have a name" do
@relation.name.must_equal 'users'
end
it "should have a table name" do
@relation.table_name.must_equal 'users'
end
it "should have an engine" do
@relation.engine.must_equal Table.engine
end
describe '[]' do
describe 'when given a Symbol' do
it "manufactures an attribute if the symbol names an attribute within the relation" do
column = @relation[:id]
column.name.must_equal :id
end
end
end
describe 'equality' do
it 'is equal with equal ivars' do
relation1 = Table.new(:users, 'vroom')
relation1.aliases = %w[a b c]
relation1.table_alias = 'zomg'
relation2 = Table.new(:users, 'vroom')
relation2.aliases = %w[a b c]
relation2.table_alias = 'zomg'
array = [relation1, relation2]
assert_equal 1, array.uniq.size
end
it 'is not equal with different ivars' do
relation1 = Table.new(:users, 'vroom')
relation1.aliases = %w[a b c]
relation1.table_alias = 'zomg'
relation2 = Table.new(:users, 'vroom')
relation2.aliases = %w[x y z]
relation2.table_alias = 'zomg'
array = [relation1, relation2]
assert_equal 2, array.uniq.size
end
end
end
end