epugh-sequel 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +652 -0
- data/VERSION.yml +4 -0
- data/bin/sequel +104 -0
- data/lib/sequel.rb +1 -0
- data/lib/sequel/adapters/ado.rb +85 -0
- data/lib/sequel/adapters/db2.rb +132 -0
- data/lib/sequel/adapters/dbi.rb +101 -0
- data/lib/sequel/adapters/do.rb +197 -0
- data/lib/sequel/adapters/do/mysql.rb +38 -0
- data/lib/sequel/adapters/do/postgres.rb +92 -0
- data/lib/sequel/adapters/do/sqlite.rb +31 -0
- data/lib/sequel/adapters/firebird.rb +307 -0
- data/lib/sequel/adapters/informix.rb +75 -0
- data/lib/sequel/adapters/jdbc.rb +485 -0
- data/lib/sequel/adapters/jdbc/h2.rb +62 -0
- data/lib/sequel/adapters/jdbc/mysql.rb +56 -0
- data/lib/sequel/adapters/jdbc/oracle.rb +23 -0
- data/lib/sequel/adapters/jdbc/postgresql.rb +101 -0
- data/lib/sequel/adapters/jdbc/sqlite.rb +43 -0
- data/lib/sequel/adapters/mysql.rb +370 -0
- data/lib/sequel/adapters/odbc.rb +184 -0
- data/lib/sequel/adapters/openbase.rb +57 -0
- data/lib/sequel/adapters/oracle.rb +140 -0
- data/lib/sequel/adapters/postgres.rb +453 -0
- data/lib/sequel/adapters/shared/mssql.rb +93 -0
- data/lib/sequel/adapters/shared/mysql.rb +341 -0
- data/lib/sequel/adapters/shared/oracle.rb +62 -0
- data/lib/sequel/adapters/shared/postgres.rb +743 -0
- data/lib/sequel/adapters/shared/progress.rb +34 -0
- data/lib/sequel/adapters/shared/sqlite.rb +263 -0
- data/lib/sequel/adapters/sqlite.rb +243 -0
- data/lib/sequel/adapters/utils/date_format.rb +21 -0
- data/lib/sequel/adapters/utils/stored_procedures.rb +75 -0
- data/lib/sequel/adapters/utils/unsupported.rb +62 -0
- data/lib/sequel/connection_pool.rb +258 -0
- data/lib/sequel/core.rb +204 -0
- data/lib/sequel/core_sql.rb +185 -0
- data/lib/sequel/database.rb +687 -0
- data/lib/sequel/database/schema_generator.rb +324 -0
- data/lib/sequel/database/schema_methods.rb +164 -0
- data/lib/sequel/database/schema_sql.rb +324 -0
- data/lib/sequel/dataset.rb +422 -0
- data/lib/sequel/dataset/convenience.rb +237 -0
- data/lib/sequel/dataset/prepared_statements.rb +220 -0
- data/lib/sequel/dataset/sql.rb +1105 -0
- data/lib/sequel/deprecated.rb +529 -0
- data/lib/sequel/exceptions.rb +44 -0
- data/lib/sequel/extensions/blank.rb +42 -0
- data/lib/sequel/extensions/inflector.rb +288 -0
- data/lib/sequel/extensions/pagination.rb +96 -0
- data/lib/sequel/extensions/pretty_table.rb +78 -0
- data/lib/sequel/extensions/query.rb +48 -0
- data/lib/sequel/extensions/string_date_time.rb +47 -0
- data/lib/sequel/metaprogramming.rb +44 -0
- data/lib/sequel/migration.rb +212 -0
- data/lib/sequel/model.rb +142 -0
- data/lib/sequel/model/association_reflection.rb +263 -0
- data/lib/sequel/model/associations.rb +1024 -0
- data/lib/sequel/model/base.rb +911 -0
- data/lib/sequel/model/deprecated.rb +188 -0
- data/lib/sequel/model/deprecated_hooks.rb +103 -0
- data/lib/sequel/model/deprecated_inflector.rb +335 -0
- data/lib/sequel/model/deprecated_validations.rb +384 -0
- data/lib/sequel/model/errors.rb +37 -0
- data/lib/sequel/model/exceptions.rb +7 -0
- data/lib/sequel/model/inflections.rb +230 -0
- data/lib/sequel/model/plugins.rb +74 -0
- data/lib/sequel/object_graph.rb +230 -0
- data/lib/sequel/plugins/caching.rb +122 -0
- data/lib/sequel/plugins/hook_class_methods.rb +122 -0
- data/lib/sequel/plugins/schema.rb +53 -0
- data/lib/sequel/plugins/single_table_inheritance.rb +63 -0
- data/lib/sequel/plugins/validation_class_methods.rb +373 -0
- data/lib/sequel/sql.rb +854 -0
- data/lib/sequel/version.rb +11 -0
- data/lib/sequel_core.rb +1 -0
- data/lib/sequel_model.rb +1 -0
- data/spec/adapters/ado_spec.rb +46 -0
- data/spec/adapters/firebird_spec.rb +376 -0
- data/spec/adapters/informix_spec.rb +96 -0
- data/spec/adapters/mysql_spec.rb +875 -0
- data/spec/adapters/oracle_spec.rb +272 -0
- data/spec/adapters/postgres_spec.rb +692 -0
- data/spec/adapters/spec_helper.rb +10 -0
- data/spec/adapters/sqlite_spec.rb +550 -0
- data/spec/core/connection_pool_spec.rb +526 -0
- data/spec/core/core_ext_spec.rb +156 -0
- data/spec/core/core_sql_spec.rb +528 -0
- data/spec/core/database_spec.rb +1214 -0
- data/spec/core/dataset_spec.rb +3513 -0
- data/spec/core/expression_filters_spec.rb +363 -0
- data/spec/core/migration_spec.rb +261 -0
- data/spec/core/object_graph_spec.rb +280 -0
- data/spec/core/pretty_table_spec.rb +58 -0
- data/spec/core/schema_generator_spec.rb +167 -0
- data/spec/core/schema_spec.rb +778 -0
- data/spec/core/spec_helper.rb +82 -0
- data/spec/core/version_spec.rb +7 -0
- data/spec/extensions/blank_spec.rb +67 -0
- data/spec/extensions/caching_spec.rb +201 -0
- data/spec/extensions/hook_class_methods_spec.rb +470 -0
- data/spec/extensions/inflector_spec.rb +122 -0
- data/spec/extensions/pagination_spec.rb +99 -0
- data/spec/extensions/pretty_table_spec.rb +91 -0
- data/spec/extensions/query_spec.rb +85 -0
- data/spec/extensions/schema_spec.rb +111 -0
- data/spec/extensions/single_table_inheritance_spec.rb +53 -0
- data/spec/extensions/spec_helper.rb +90 -0
- data/spec/extensions/string_date_time_spec.rb +93 -0
- data/spec/extensions/validation_class_methods_spec.rb +1054 -0
- data/spec/integration/dataset_test.rb +160 -0
- data/spec/integration/eager_loader_test.rb +683 -0
- data/spec/integration/prepared_statement_test.rb +130 -0
- data/spec/integration/schema_test.rb +183 -0
- data/spec/integration/spec_helper.rb +75 -0
- data/spec/integration/type_test.rb +96 -0
- data/spec/model/association_reflection_spec.rb +93 -0
- data/spec/model/associations_spec.rb +1780 -0
- data/spec/model/base_spec.rb +494 -0
- data/spec/model/caching_spec.rb +217 -0
- data/spec/model/dataset_methods_spec.rb +78 -0
- data/spec/model/eager_loading_spec.rb +1165 -0
- data/spec/model/hooks_spec.rb +472 -0
- data/spec/model/inflector_spec.rb +126 -0
- data/spec/model/model_spec.rb +588 -0
- data/spec/model/plugins_spec.rb +142 -0
- data/spec/model/record_spec.rb +1243 -0
- data/spec/model/schema_spec.rb +92 -0
- data/spec/model/spec_helper.rb +124 -0
- data/spec/model/validations_spec.rb +1080 -0
- data/spec/rcov.opts +6 -0
- data/spec/spec.opts +0 -0
- data/spec/spec_config.rb.example +10 -0
- metadata +202 -0
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), "spec_helper")
|
|
2
|
+
|
|
3
|
+
describe "Model hooks" do
|
|
4
|
+
before do
|
|
5
|
+
MODEL_DB.reset
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
deprec_specify "should be definable using a block" do
|
|
9
|
+
$adds = []
|
|
10
|
+
c = Class.new(Sequel::Model)
|
|
11
|
+
c.class_eval do
|
|
12
|
+
before_save {$adds << 'hi'}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
c.new.before_save
|
|
16
|
+
$adds.should == ['hi']
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
deprec_specify "should be definable using a method name" do
|
|
20
|
+
$adds = []
|
|
21
|
+
c = Class.new(Sequel::Model)
|
|
22
|
+
c.class_eval do
|
|
23
|
+
def bye; $adds << 'bye'; end
|
|
24
|
+
before_save :bye
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
c.new.before_save
|
|
28
|
+
$adds.should == ['bye']
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
deprec_specify "should be additive" do
|
|
32
|
+
$adds = []
|
|
33
|
+
c = Class.new(Sequel::Model)
|
|
34
|
+
c.class_eval do
|
|
35
|
+
after_save {$adds << 'hyiyie'}
|
|
36
|
+
after_save {$adds << 'byiyie'}
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
c.new.after_save
|
|
40
|
+
$adds.should == ['hyiyie', 'byiyie']
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
deprec_specify "before hooks should run in reverse order" do
|
|
44
|
+
$adds = []
|
|
45
|
+
c = Class.new(Sequel::Model)
|
|
46
|
+
c.class_eval do
|
|
47
|
+
before_save {$adds << 'hyiyie'}
|
|
48
|
+
before_save {$adds << 'byiyie'}
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
c.new.before_save
|
|
52
|
+
$adds.should == ['byiyie', 'hyiyie']
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
deprec_specify "should not be additive if the method or tag already exists" do
|
|
56
|
+
$adds = []
|
|
57
|
+
c = Class.new(Sequel::Model)
|
|
58
|
+
c.class_eval do
|
|
59
|
+
def bye; $adds << 'bye'; end
|
|
60
|
+
before_save :bye
|
|
61
|
+
before_save :bye
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
c.new.before_save
|
|
65
|
+
$adds.should == ['bye']
|
|
66
|
+
|
|
67
|
+
$adds = []
|
|
68
|
+
d = Class.new(Sequel::Model)
|
|
69
|
+
d.class_eval do
|
|
70
|
+
before_save(:bye){$adds << 'hyiyie'}
|
|
71
|
+
before_save(:bye){$adds << 'byiyie'}
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
d.new.before_save
|
|
75
|
+
$adds.should == ['byiyie']
|
|
76
|
+
|
|
77
|
+
$adds = []
|
|
78
|
+
e = Class.new(Sequel::Model)
|
|
79
|
+
e.class_eval do
|
|
80
|
+
def bye; $adds << 'bye'; end
|
|
81
|
+
before_save :bye
|
|
82
|
+
before_save(:bye){$adds << 'byiyie'}
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
e.new.before_save
|
|
86
|
+
$adds.should == ['byiyie']
|
|
87
|
+
|
|
88
|
+
$adds = []
|
|
89
|
+
e = Class.new(Sequel::Model)
|
|
90
|
+
e.class_eval do
|
|
91
|
+
def bye; $adds << 'bye'; end
|
|
92
|
+
before_save(:bye){$adds << 'byiyie'}
|
|
93
|
+
before_save :bye
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
e.new.before_save
|
|
97
|
+
$adds.should == ['bye']
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
deprec_specify "should be inheritable" do
|
|
101
|
+
$adds = []
|
|
102
|
+
a = Class.new(Sequel::Model)
|
|
103
|
+
a.class_eval do
|
|
104
|
+
after_save {$adds << '123'}
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
b = Class.new(a)
|
|
108
|
+
b.class_eval do
|
|
109
|
+
after_save {$adds << '456'}
|
|
110
|
+
after_save {$adds << '789'}
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
b.new.after_save
|
|
114
|
+
$adds.should == ['123', '456', '789']
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
deprec_specify "should be overridable in descendant classes" do
|
|
118
|
+
$adds = []
|
|
119
|
+
a = Class.new(Sequel::Model)
|
|
120
|
+
a.class_eval do
|
|
121
|
+
before_save {$adds << '123'}
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
b = Class.new(a)
|
|
125
|
+
b.class_eval do
|
|
126
|
+
def before_save; $adds << '456'; end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
a.new.before_save
|
|
130
|
+
$adds.should == ['123']
|
|
131
|
+
$adds = []
|
|
132
|
+
b.new.before_save
|
|
133
|
+
$adds.should == ['456']
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
deprec_specify "should stop processing if a hook returns false" do
|
|
137
|
+
$flag = true
|
|
138
|
+
$adds = []
|
|
139
|
+
|
|
140
|
+
a = Class.new(Sequel::Model)
|
|
141
|
+
a.class_eval do
|
|
142
|
+
after_save {$adds << 'blah'; $flag}
|
|
143
|
+
after_save {$adds << 'cruel'}
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
a.new.after_save
|
|
147
|
+
$adds.should == ['blah', 'cruel']
|
|
148
|
+
|
|
149
|
+
# chain should not break on nil
|
|
150
|
+
$adds = []
|
|
151
|
+
$flag = nil
|
|
152
|
+
a.new.after_save
|
|
153
|
+
$adds.should == ['blah', 'cruel']
|
|
154
|
+
|
|
155
|
+
$adds = []
|
|
156
|
+
$flag = false
|
|
157
|
+
a.new.after_save
|
|
158
|
+
$adds.should == ['blah']
|
|
159
|
+
|
|
160
|
+
b = Class.new(a)
|
|
161
|
+
b.class_eval do
|
|
162
|
+
after_save {$adds << 'mau'}
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
$adds = []
|
|
166
|
+
b.new.after_save
|
|
167
|
+
$adds.should == ['blah']
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
describe "Model#after_initialize" do
|
|
172
|
+
specify "should be called after initialization" do
|
|
173
|
+
$values1 = nil
|
|
174
|
+
$reached_after_initialized = false
|
|
175
|
+
|
|
176
|
+
a = Class.new(Sequel::Model)
|
|
177
|
+
a.class_eval do
|
|
178
|
+
columns :x, :y
|
|
179
|
+
def after_initialize
|
|
180
|
+
$values1 = @values.clone
|
|
181
|
+
$reached_after_initialized = true
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
a.new(:x => 1, :y => 2)
|
|
186
|
+
$values1.should == {:x => 1, :y => 2}
|
|
187
|
+
$reached_after_initialized.should == true
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
describe "Model#before_create && Model#after_create" do
|
|
192
|
+
setup do
|
|
193
|
+
MODEL_DB.reset
|
|
194
|
+
|
|
195
|
+
@c = Class.new(Sequel::Model(:items))
|
|
196
|
+
@c.class_eval do
|
|
197
|
+
columns :x
|
|
198
|
+
no_primary_key
|
|
199
|
+
|
|
200
|
+
def after_create
|
|
201
|
+
MODEL_DB << "BLAH after"
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
specify "should be called around new record creation" do
|
|
207
|
+
@c.send(:define_method, :before_create){MODEL_DB << "BLAH before"}
|
|
208
|
+
@c.create(:x => 2)
|
|
209
|
+
MODEL_DB.sqls.should == [
|
|
210
|
+
'BLAH before',
|
|
211
|
+
'INSERT INTO items (x) VALUES (2)',
|
|
212
|
+
'BLAH after'
|
|
213
|
+
]
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
specify ".create should cancel the save and raise an error if before_create returns false and raise_on_save_failure is true" do
|
|
217
|
+
@c.send(:define_method, :before_create){false}
|
|
218
|
+
proc{@c.load(:id => 2233).save}.should_not raise_error(Sequel::ValidationFailed)
|
|
219
|
+
proc{@c.create(:x => 2)}.should raise_error(Sequel::BeforeHookFailed)
|
|
220
|
+
MODEL_DB.sqls.should == []
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
specify ".create should cancel the save and return nil if before_create returns false and raise_on_save_failure is false" do
|
|
224
|
+
@c.send(:define_method, :before_create){false}
|
|
225
|
+
@c.raise_on_save_failure = false
|
|
226
|
+
@c.create(:x => 2).should == nil
|
|
227
|
+
MODEL_DB.sqls.should == []
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
describe "Model#before_update && Model#after_update" do
|
|
232
|
+
setup do
|
|
233
|
+
MODEL_DB.reset
|
|
234
|
+
|
|
235
|
+
@c = Class.new(Sequel::Model(:items))
|
|
236
|
+
@c.class_eval do
|
|
237
|
+
def after_update; MODEL_DB << "BLAH after" end
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
specify "should be called around record update" do
|
|
242
|
+
@c.send(:define_method, :before_update){MODEL_DB << "BLAH before"}
|
|
243
|
+
m = @c.load(:id => 2233)
|
|
244
|
+
m.save
|
|
245
|
+
MODEL_DB.sqls.should == [
|
|
246
|
+
'BLAH before',
|
|
247
|
+
'UPDATE items SET id = 2233 WHERE (id = 2233)',
|
|
248
|
+
'BLAH after'
|
|
249
|
+
]
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
specify "#save should cancel the save and raise an error if before_update returns false and raise_on_save_failure is true" do
|
|
253
|
+
@c.send(:define_method, :before_update){false}
|
|
254
|
+
proc{@c.load(:id => 2233).save}.should_not raise_error(Sequel::ValidationFailed)
|
|
255
|
+
proc{@c.load(:id => 2233).save}.should raise_error(Sequel::BeforeHookFailed)
|
|
256
|
+
MODEL_DB.sqls.should == []
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
specify "#save should cancel the save and return nil if before_update returns false and raise_on_save_failure is false" do
|
|
260
|
+
@c.send(:define_method, :before_update){false}
|
|
261
|
+
@c.raise_on_save_failure = false
|
|
262
|
+
@c.load(:id => 2233).save.should == nil
|
|
263
|
+
MODEL_DB.sqls.should == []
|
|
264
|
+
end
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
describe "Model#before_save && Model#after_save" do
|
|
268
|
+
setup do
|
|
269
|
+
MODEL_DB.reset
|
|
270
|
+
|
|
271
|
+
@c = Class.new(Sequel::Model(:items))
|
|
272
|
+
@c.class_eval do
|
|
273
|
+
columns :x
|
|
274
|
+
def after_save; MODEL_DB << "BLAH after" end
|
|
275
|
+
end
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
specify "should be called around record update" do
|
|
279
|
+
@c.send(:define_method, :before_save){MODEL_DB << "BLAH before"}
|
|
280
|
+
m = @c.load(:id => 2233)
|
|
281
|
+
m.save
|
|
282
|
+
MODEL_DB.sqls.should == [
|
|
283
|
+
'BLAH before',
|
|
284
|
+
'UPDATE items SET id = 2233 WHERE (id = 2233)',
|
|
285
|
+
'BLAH after'
|
|
286
|
+
]
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
specify "should be called around record creation" do
|
|
290
|
+
@c.send(:define_method, :before_save){MODEL_DB << "BLAH before"}
|
|
291
|
+
@c.no_primary_key
|
|
292
|
+
@c.create(:x => 2)
|
|
293
|
+
MODEL_DB.sqls.should == [
|
|
294
|
+
'BLAH before',
|
|
295
|
+
'INSERT INTO items (x) VALUES (2)',
|
|
296
|
+
'BLAH after'
|
|
297
|
+
]
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
specify "#save should cancel the save and raise an error if before_save returns false and raise_on_save_failure is true" do
|
|
301
|
+
@c.send(:define_method, :before_save){false}
|
|
302
|
+
proc{@c.load(:id => 2233).save}.should_not raise_error(Sequel::ValidationFailed)
|
|
303
|
+
proc{@c.load(:id => 2233).save}.should raise_error(Sequel::BeforeHookFailed)
|
|
304
|
+
MODEL_DB.sqls.should == []
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
specify "#save should cancel the save and return nil if before_save returns false and raise_on_save_failure is false" do
|
|
308
|
+
@c.send(:define_method, :before_save){false}
|
|
309
|
+
@c.raise_on_save_failure = false
|
|
310
|
+
@c.load(:id => 2233).save.should == nil
|
|
311
|
+
MODEL_DB.sqls.should == []
|
|
312
|
+
end
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
describe "Model#before_destroy && Model#after_destroy" do
|
|
316
|
+
setup do
|
|
317
|
+
MODEL_DB.reset
|
|
318
|
+
|
|
319
|
+
@c = Class.new(Sequel::Model(:items))
|
|
320
|
+
@c.class_eval do
|
|
321
|
+
def after_destroy; MODEL_DB << "BLAH after"; end
|
|
322
|
+
|
|
323
|
+
def delete
|
|
324
|
+
MODEL_DB << "DELETE BLAH"
|
|
325
|
+
end
|
|
326
|
+
end
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
specify "should be called around record destruction" do
|
|
330
|
+
@c.send(:define_method, :before_destroy){MODEL_DB << "BLAH before"}
|
|
331
|
+
m = @c.load(:id => 2233)
|
|
332
|
+
m.destroy
|
|
333
|
+
MODEL_DB.sqls.should == [
|
|
334
|
+
'BLAH before',
|
|
335
|
+
'DELETE BLAH',
|
|
336
|
+
'BLAH after'
|
|
337
|
+
]
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
specify "#destroy should cancel the destroy and raise an error if before_destroy returns false and raise_on_save_failure is true" do
|
|
341
|
+
@c.send(:define_method, :before_destroy){false}
|
|
342
|
+
proc{@c.load(:id => 2233).destroy}.should raise_error(Sequel::BeforeHookFailed)
|
|
343
|
+
MODEL_DB.sqls.should == []
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
specify "#destroy should cancel the destroy and return nil if before_destroy returns false and raise_on_save_failure is false" do
|
|
347
|
+
@c.send(:define_method, :before_destroy){false}
|
|
348
|
+
@c.raise_on_save_failure = false
|
|
349
|
+
@c.load(:id => 2233).destroy.should == nil
|
|
350
|
+
MODEL_DB.sqls.should == []
|
|
351
|
+
end
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
describe "Model#before_validation && Model#after_validation" do
|
|
355
|
+
setup do
|
|
356
|
+
MODEL_DB.reset
|
|
357
|
+
|
|
358
|
+
@c = Class.new(Sequel::Model(:items))
|
|
359
|
+
@c.class_eval do
|
|
360
|
+
def after_validation; MODEL_DB << "BLAH after" end
|
|
361
|
+
|
|
362
|
+
def self.validate(o)
|
|
363
|
+
o.errors[:id] << 'not valid' unless o[:id] == 2233
|
|
364
|
+
end
|
|
365
|
+
columns :id
|
|
366
|
+
end
|
|
367
|
+
end
|
|
368
|
+
|
|
369
|
+
specify "should be called around validation" do
|
|
370
|
+
@c.send(:define_method, :before_validation){MODEL_DB << "BLAH before"}
|
|
371
|
+
m = @c.load(:id => 2233)
|
|
372
|
+
m.should be_valid
|
|
373
|
+
MODEL_DB.sqls.should == ['BLAH before', 'BLAH after']
|
|
374
|
+
|
|
375
|
+
MODEL_DB.sqls.clear
|
|
376
|
+
m = @c.load(:id => 22)
|
|
377
|
+
m.should_not be_valid
|
|
378
|
+
MODEL_DB.sqls.should == ['BLAH before', 'BLAH after']
|
|
379
|
+
end
|
|
380
|
+
|
|
381
|
+
specify "should be called when calling save" do
|
|
382
|
+
@c.send(:define_method, :before_validation){MODEL_DB << "BLAH before"}
|
|
383
|
+
m = @c.load(:id => 2233)
|
|
384
|
+
m.save.should == m
|
|
385
|
+
MODEL_DB.sqls.should == ['BLAH before', 'BLAH after', 'UPDATE items SET id = 2233 WHERE (id = 2233)']
|
|
386
|
+
|
|
387
|
+
MODEL_DB.sqls.clear
|
|
388
|
+
m = @c.load(:id => 22)
|
|
389
|
+
m.raise_on_save_failure = false
|
|
390
|
+
m.save.should == nil
|
|
391
|
+
MODEL_DB.sqls.should == ['BLAH before', 'BLAH after']
|
|
392
|
+
end
|
|
393
|
+
|
|
394
|
+
specify "#save should cancel the save and raise an error if before_validation returns false and raise_on_save_failure is true" do
|
|
395
|
+
@c.send(:define_method, :before_validation){false}
|
|
396
|
+
proc{@c.load(:id => 2233).save}.should_not raise_error(Sequel::ValidationFailed)
|
|
397
|
+
proc{@c.load(:id => 2233).save}.should raise_error(Sequel::BeforeHookFailed)
|
|
398
|
+
MODEL_DB.sqls.should == []
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
specify "#save should cancel the save and return nil if before_validation returns false and raise_on_save_failure is false" do
|
|
402
|
+
@c.send(:define_method, :before_validation){false}
|
|
403
|
+
@c.raise_on_save_failure = false
|
|
404
|
+
@c.load(:id => 2233).save.should == nil
|
|
405
|
+
MODEL_DB.sqls.should == []
|
|
406
|
+
end
|
|
407
|
+
end
|
|
408
|
+
|
|
409
|
+
describe "Model.has_hooks?" do
|
|
410
|
+
setup do
|
|
411
|
+
@c = Class.new(Sequel::Model(:items))
|
|
412
|
+
end
|
|
413
|
+
|
|
414
|
+
deprec_specify "should return false if no hooks are defined" do
|
|
415
|
+
@c.has_hooks?(:before_save).should be_false
|
|
416
|
+
end
|
|
417
|
+
|
|
418
|
+
deprec_specify "should return true if hooks are defined" do
|
|
419
|
+
@c.before_save {'blah'}
|
|
420
|
+
@c.has_hooks?(:before_save).should be_true
|
|
421
|
+
end
|
|
422
|
+
|
|
423
|
+
deprec_specify "should return true if hooks are inherited" do
|
|
424
|
+
@d = Class.new(@c)
|
|
425
|
+
@d.has_hooks?(:before_save).should be_false
|
|
426
|
+
end
|
|
427
|
+
end
|
|
428
|
+
|
|
429
|
+
describe "Model#add_hook_type" do
|
|
430
|
+
setup do
|
|
431
|
+
deprec do
|
|
432
|
+
class Foo < Sequel::Model(:items)
|
|
433
|
+
add_hook_type :before_bar, :after_bar
|
|
434
|
+
|
|
435
|
+
def bar
|
|
436
|
+
return :b if before_bar == false
|
|
437
|
+
return :a if after_bar == false
|
|
438
|
+
true
|
|
439
|
+
end
|
|
440
|
+
end
|
|
441
|
+
end
|
|
442
|
+
@f = Class.new(Foo)
|
|
443
|
+
end
|
|
444
|
+
|
|
445
|
+
deprec_specify "should have before_bar and after_bar class methods" do
|
|
446
|
+
@f.should respond_to(:before_bar)
|
|
447
|
+
@f.should respond_to(:before_bar)
|
|
448
|
+
end
|
|
449
|
+
|
|
450
|
+
deprec_specify "should have before_bar and after_bar instance methods" do
|
|
451
|
+
@f.new.should respond_to(:before_bar)
|
|
452
|
+
@f.new.should respond_to(:before_bar)
|
|
453
|
+
end
|
|
454
|
+
|
|
455
|
+
deprec_specify "it should return true for bar when before_bar and after_bar hooks are returing true" do
|
|
456
|
+
a = 1
|
|
457
|
+
@f.before_bar { a += 1}
|
|
458
|
+
@f.new.bar.should be_true
|
|
459
|
+
a.should == 2
|
|
460
|
+
@f.after_bar { a *= 2}
|
|
461
|
+
@f.new.bar.should be_true
|
|
462
|
+
a.should == 6
|
|
463
|
+
end
|
|
464
|
+
|
|
465
|
+
deprec_specify "it should return nil for bar when before_bar and after_bar hooks are returing false" do
|
|
466
|
+
@f.new.bar.should be_true
|
|
467
|
+
@f.after_bar { false }
|
|
468
|
+
@f.new.bar.should == :a
|
|
469
|
+
@f.before_bar { false }
|
|
470
|
+
@f.new.bar.should == :b
|
|
471
|
+
end
|
|
472
|
+
end
|