blob: 3984bec3fd79cc43d7f15d54f3d450ecdb856d2a (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
|
require 'spec_helper'
module Arel
class EngineProxy
attr_reader :executed
def initialize engine
@engine = engine
@executed = []
end
def connection
self
end
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 execute sql
@executed << sql
end
end
describe 'select manager' do
describe 'delete' do
it "copies from" do
engine = EngineProxy.new Table.engine
table = Table.new :users
manager = Arel::SelectManager.new engine
manager.from table
manager.delete
engine.executed.last.should be_like %{ DELETE FROM "users" }
end
it "copies where" do
engine = EngineProxy.new Table.engine
table = Table.new :users
manager = Arel::SelectManager.new engine
manager.from table
manager.where table[:id].eq 10
manager.delete
engine.executed.last.should be_like %{
DELETE FROM "users" WHERE "users"."id" = 10
}
end
end
describe 'update' do
it 'takes a string' do
engine = EngineProxy.new Table.engine
table = Table.new :users
manager = Arel::SelectManager.new engine
manager.from table
manager.update('foo = bar')
engine.executed.last.should be_like %{ UPDATE "users" SET foo = bar }
end
it 'copies where clauses' do
engine = EngineProxy.new Table.engine
table = Table.new :users
manager = Arel::SelectManager.new engine
manager.where table[:id].eq 10
manager.from table
manager.update(table[:id] => 1)
engine.executed.last.should be_like %{
UPDATE "users" SET "id" = 1 WHERE "users"."id" = 10
}
end
it 'executes an update statement' do
engine = EngineProxy.new Table.engine
table = Table.new :users
manager = Arel::SelectManager.new engine
manager.from table
manager.update(table[:id] => 1)
engine.executed.last.should be_like %{
UPDATE "users" SET "id" = 1
}
end
end
describe 'project' do
it 'takes strings' do
table = Table.new :users
manager = Arel::SelectManager.new Table.engine
manager.project '*'
manager.to_sql.should be_like %{
SELECT *
}
end
it "takes sql literals" do
table = Table.new :users
manager = Arel::SelectManager.new Table.engine
manager.project Nodes::SqlLiteral.new '*'
manager.to_sql.should be_like %{
SELECT *
}
end
end
describe 'take' do
it "knows take" do
table = Table.new :users
manager = Arel::SelectManager.new Table.engine
manager.from(table).project(table['id'])
manager.where(table['id'].eq(1))
manager.take 1
manager.to_sql.should be_like %{
SELECT "users"."id"
FROM "users"
WHERE "users"."id" = 1
LIMIT 1
}
end
it "chains" do
table = Table.new :users
manager = Arel::SelectManager.new Table.engine
manager.take(1).should == manager
end
end
describe 'where' do
it "knows where" do
table = Table.new :users
manager = Arel::SelectManager.new Table.engine
manager.from(table).project(table['id'])
manager.where(table['id'].eq(1))
manager.to_sql.should be_like %{
SELECT "users"."id"
FROM "users"
WHERE "users"."id" = 1
}
end
it "chains" do
table = Table.new :users
manager = Arel::SelectManager.new Table.engine
manager.from(table)
manager.project(table['id']).where(table['id'].eq 1).should == manager
end
end
describe 'from' do
it "makes sql" do
table = Table.new :users
manager = Arel::SelectManager.new Table.engine
manager.from table
manager.project table['id']
manager.to_sql.should be_like 'SELECT "users"."id" FROM "users"'
end
it "chains" do
table = Table.new :users
manager = Arel::SelectManager.new Table.engine
check manager.from(table).project(table['id']).should == manager
manager.to_sql.should be_like 'SELECT "users"."id" FROM "users"'
end
end
describe "TreeManager" do
subject do
table = Table.new :users
Arel::SelectManager.new(Table.engine).tap do |manager|
manager.from(table).project(table['id'])
end
end
it_should_behave_like "TreeManager"
end
end
end
|