123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- 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
- 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
- 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 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 SqlLiteral.new '*'
- manager.to_sql.must_be_like %{ SELECT * FROM "users" }
- end
- it 'takes multiple parameters' do
- manager = @relation.project SqlLiteral.new('*'), 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
- end
- end
|