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
|
# frozen_string_literal: true
require_relative "helper"
module Arel
class UpdateManagerTest < Arel::Spec
describe "new" do
it "takes an engine" do
Arel::UpdateManager.new
end
end
it "should not quote sql literals" do
table = Table.new(:users)
um = Arel::UpdateManager.new
um.table table
um.set [[table[:name], Arel::Nodes::BindParam.new(1)]]
um.to_sql.must_be_like %{ UPDATE "users" SET "name" = ? }
end
it "handles limit properly" do
table = Table.new(:users)
um = Arel::UpdateManager.new
um.key = "id"
um.take 10
um.table table
um.set [[table[:name], nil]]
assert_match(/LIMIT 10/, um.to_sql)
end
describe "set" do
it "updates with null" do
table = Table.new(:users)
um = Arel::UpdateManager.new
um.table table
um.set [[table[:name], nil]]
um.to_sql.must_be_like %{ UPDATE "users" SET "name" = NULL }
end
it "takes a string" do
table = Table.new(:users)
um = Arel::UpdateManager.new
um.table table
um.set Nodes::SqlLiteral.new "foo = bar"
um.to_sql.must_be_like %{ UPDATE "users" SET foo = bar }
end
it "takes a list of lists" do
table = Table.new(:users)
um = Arel::UpdateManager.new
um.table table
um.set [[table[:id], 1], [table[:name], "hello"]]
um.to_sql.must_be_like %{
UPDATE "users" SET "id" = 1, "name" = 'hello'
}
end
it "chains" do
table = Table.new(:users)
um = Arel::UpdateManager.new
um.set([[table[:id], 1], [table[:name], "hello"]]).must_equal um
end
end
describe "table" do
it "generates an update statement" do
um = Arel::UpdateManager.new
um.table Table.new(:users)
um.to_sql.must_be_like %{ UPDATE "users" }
end
it "chains" do
um = Arel::UpdateManager.new
um.table(Table.new(:users)).must_equal um
end
it "generates an update statement with joins" do
um = Arel::UpdateManager.new
table = Table.new(:users)
join_source = Arel::Nodes::JoinSource.new(
table,
[table.create_join(Table.new(:posts))]
)
um.table join_source
um.to_sql.must_be_like %{ UPDATE "users" INNER JOIN "posts" }
end
end
describe "where" do
it "generates a where clause" do
table = Table.new :users
um = Arel::UpdateManager.new
um.table table
um.where table[:id].eq(1)
um.to_sql.must_be_like %{
UPDATE "users" WHERE "users"."id" = 1
}
end
it "chains" do
table = Table.new :users
um = Arel::UpdateManager.new
um.table table
um.where(table[:id].eq(1)).must_equal um
end
end
describe "key" do
before do
@table = Table.new :users
@um = Arel::UpdateManager.new
@um.key = @table[:foo]
end
it "can be set" do
@um.ast.key.must_equal @table[:foo]
end
it "can be accessed" do
@um.key.must_equal @table[:foo]
end
end
describe "comment" do
it "chains" do
manager = Arel::UpdateManager.new
manager.comment("updating").must_equal manager
end
it "appends a comment to the generated query" do
table = Table.new :users
manager = Arel::UpdateManager.new
manager.table table
manager.comment("updating")
manager.to_sql.must_be_like %{
UPDATE "users" /* updating */
}
manager.comment("updating", "with", "comment")
manager.to_sql.must_be_like %{
UPDATE "users" /* updating */ /* with */ /* comment */
}
end
end
end
end
|