sequel_model 0.4.2 → 0.5

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.
@@ -2,15 +2,15 @@ module Sequel
2
2
  class Model
3
3
  attr_reader :values
4
4
  attr_reader :changed_columns
5
-
5
+
6
6
  # Returns value of attribute.
7
7
  def [](column)
8
8
  @values[column]
9
9
  end
10
10
  # Sets value of attribute and marks the column as changed.
11
11
  def []=(column, value)
12
- @values[column] = value
13
12
  @changed_columns << column unless @changed_columns.include?(column)
13
+ @values[column] = value
14
14
  end
15
15
 
16
16
  # Enumerates through all attributes.
@@ -0,0 +1,616 @@
1
+ require File.join(File.dirname(__FILE__), "spec_helper")
2
+
3
+ describe Sequel::Model, "many_to_one" do
4
+
5
+ before(:each) do
6
+ MODEL_DB.reset
7
+
8
+ @c2 = Class.new(Sequel::Model(:nodes)) do
9
+ def columns; [:id, :parent_id]; end
10
+ end
11
+
12
+ @dataset = @c2.dataset
13
+ end
14
+
15
+ it "should use implicit key if omitted" do
16
+ @c2.many_to_one :parent, :class => @c2
17
+
18
+ d = @c2.new(:id => 1, :parent_id => 234)
19
+ p = d.parent
20
+ p.class.should == @c2
21
+ p.values.should == {:x => 1, :id => 1}
22
+
23
+ MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE (id = 234) LIMIT 1"]
24
+ end
25
+
26
+ it "should use implicit class if omitted" do
27
+ class ParParent < Sequel::Model
28
+ end
29
+
30
+ @c2.many_to_one :par_parent
31
+
32
+ d = @c2.new(:id => 1, :par_parent_id => 234)
33
+ p = d.par_parent
34
+ p.class.should == ParParent
35
+
36
+ MODEL_DB.sqls.should == ["SELECT * FROM par_parents WHERE (id = 234) LIMIT 1"]
37
+ end
38
+
39
+ it "should use explicit key if given" do
40
+ @c2.many_to_one :parent, :class => @c2, :key => :blah
41
+
42
+ d = @c2.new(:id => 1, :blah => 567)
43
+ p = d.parent
44
+ p.class.should == @c2
45
+ p.values.should == {:x => 1, :id => 1}
46
+
47
+ MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE (id = 567) LIMIT 1"]
48
+ end
49
+
50
+ it "should return nil if key value is nil" do
51
+ @c2.many_to_one :parent, :class => @c2
52
+
53
+ d = @c2.new(:id => 1)
54
+ d.parent.should == nil
55
+ end
56
+
57
+ it "should define a setter method" do
58
+ @c2.many_to_one :parent, :class => @c2
59
+
60
+ d = @c2.new(:id => 1)
61
+ d.parent = @c2.new(:id => 4321)
62
+ d.values.should == {:id => 1, :parent_id => 4321}
63
+
64
+ d.parent = nil
65
+ d.values.should == {:id => 1, :parent_id => nil}
66
+
67
+ e = @c2.new(:id => 6677)
68
+ d.parent = e
69
+ d.values.should == {:id => 1, :parent_id => 6677}
70
+ end
71
+
72
+ it "should not persist changes until saved" do
73
+ @c2.many_to_one :parent, :class => @c2
74
+
75
+ d = @c2.create(:id => 1)
76
+ MODEL_DB.reset
77
+ d.parent = @c2.new(:id => 345)
78
+ MODEL_DB.sqls.should == []
79
+ d.save_changes
80
+ MODEL_DB.sqls.should == ['UPDATE nodes SET parent_id = 345 WHERE (id = 1)']
81
+ end
82
+
83
+ it "should set cached instance variable when accessed" do
84
+ @c2.many_to_one :parent, :class => @c2
85
+
86
+ d = @c2.create(:id => 1)
87
+ MODEL_DB.reset
88
+ d.parent_id = 234
89
+ d.instance_variables.include?("@parent").should == false
90
+ e = d.parent
91
+ MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE (id = 234) LIMIT 1"]
92
+ d.instance_variable_get("@parent").should == e
93
+ end
94
+
95
+ it "should set cached instance variable when assigned" do
96
+ @c2.many_to_one :parent, :class => @c2
97
+
98
+ d = @c2.create(:id => 1)
99
+ MODEL_DB.reset
100
+ d.instance_variables.include?("@parent").should == false
101
+ d.parent = @c2.new(:id => 234)
102
+ e = d.parent
103
+ d.instance_variable_get("@parent").should == e
104
+ MODEL_DB.sqls.should == []
105
+ end
106
+
107
+ it "should use cached instance variable if available" do
108
+ @c2.many_to_one :parent, :class => @c2
109
+
110
+ d = @c2.create(:id => 1, :parent_id => 234)
111
+ MODEL_DB.reset
112
+ d.instance_variable_set(:@parent, 42)
113
+ d.parent.should == 42
114
+ MODEL_DB.sqls.should == []
115
+ end
116
+
117
+ it "should not use cached instance variable if asked to reload" do
118
+ @c2.many_to_one :parent, :class => @c2
119
+
120
+ d = @c2.create(:id => 1)
121
+ MODEL_DB.reset
122
+ d.parent_id = 234
123
+ d.instance_variable_set(:@parent, 42)
124
+ d.parent(true).should_not == 42
125
+ MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE (id = 234) LIMIT 1"]
126
+ end
127
+
128
+ it "should have belongs_to alias" do
129
+ @c2.belongs_to :parent, :class => @c2
130
+
131
+ d = @c2.create(:id => 1)
132
+ MODEL_DB.reset
133
+ d.parent_id = 234
134
+ d.instance_variables.include?("@parent").should == false
135
+ e = d.parent
136
+ MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE (id = 234) LIMIT 1"]
137
+ d.instance_variable_get("@parent").should == e
138
+ end
139
+ end
140
+
141
+ describe Sequel::Model, "one_to_many" do
142
+
143
+ before(:each) do
144
+ MODEL_DB.reset
145
+
146
+ @c1 = Class.new(Sequel::Model(:attributes)) do
147
+ def columns; [:id, :node_id]; end
148
+ end
149
+
150
+ @c2 = Class.new(Sequel::Model(:nodes)) do
151
+ attr_accessor :xxx
152
+
153
+ def self.name
154
+ 'Node'
155
+ end
156
+ end
157
+ @dataset = @c2.dataset
158
+
159
+ @c2.dataset.extend(Module.new {
160
+ def fetch_rows(sql)
161
+ @db << sql
162
+ yield Hash.new
163
+ end
164
+ })
165
+
166
+ @c1.dataset.extend(Module.new {
167
+ def fetch_rows(sql)
168
+ @db << sql
169
+ yield Hash.new
170
+ end
171
+ })
172
+ end
173
+
174
+ it "should use implicit key if omitted" do
175
+ @c2.one_to_many :attributes, :class => @c1
176
+
177
+ n = @c2.new(:id => 1234)
178
+ a = n.attributes
179
+ a.should be_a_kind_of(Sequel::Dataset)
180
+ a.sql.should == 'SELECT * FROM attributes WHERE (node_id = 1234)'
181
+ end
182
+
183
+ it "should use implicit class if omitted" do
184
+ class HistoricalValue < Sequel::Model
185
+ end
186
+
187
+ @c2.one_to_many :historical_values
188
+
189
+ n = @c2.new(:id => 1234)
190
+ v = n.historical_values
191
+ v.should be_a_kind_of(Sequel::Dataset)
192
+ v.sql.should == 'SELECT * FROM historical_values WHERE (node_id = 1234)'
193
+ v.model_classes.should == {nil => HistoricalValue}
194
+ end
195
+
196
+ it "should use explicit key if given" do
197
+ @c2.one_to_many :attributes, :class => @c1, :key => :nodeid
198
+
199
+ n = @c2.new(:id => 1234)
200
+ a = n.attributes
201
+ a.should be_a_kind_of(Sequel::Dataset)
202
+ a.sql.should == 'SELECT * FROM attributes WHERE (nodeid = 1234)'
203
+ end
204
+
205
+ it "should define an add_ method" do
206
+ @c2.one_to_many :attributes, :class => @c1
207
+
208
+ n = @c2.new(:id => 1234)
209
+ a = @c1.new(:id => 2345)
210
+ a.save!
211
+ MODEL_DB.reset
212
+ a.should == n.add_attribute(a)
213
+ MODEL_DB.sqls.should == ['UPDATE attributes SET node_id = 1234 WHERE (id = 2345)']
214
+ end
215
+
216
+ it "should define a remove_ method" do
217
+ @c2.one_to_many :attributes, :class => @c1
218
+
219
+ n = @c2.new(:id => 1234)
220
+ a = @c1.new(:id => 2345)
221
+ a.save!
222
+ MODEL_DB.reset
223
+ a.should == n.remove_attribute(a)
224
+ MODEL_DB.sqls.should == ['UPDATE attributes SET node_id = NULL WHERE (id = 2345)']
225
+ end
226
+
227
+ it "should accept a block" do
228
+ @c2.one_to_many :attributes, :class => @c1 do |ds|
229
+ ds.filter(:xxx => @xxx)
230
+ end
231
+
232
+ n = @c2.new(:id => 1234)
233
+ n.xxx = 'blah'
234
+ n.attributes.sql.should == "SELECT * FROM attributes WHERE (node_id = 1234) AND (xxx = 'blah')"
235
+ end
236
+
237
+ it "should support an order option" do
238
+ @c2.one_to_many :attributes, :class => @c1, :order => :kind
239
+
240
+ n = @c2.new(:id => 1234)
241
+ n.attributes.sql.should == "SELECT * FROM attributes WHERE (node_id = 1234) ORDER BY kind"
242
+ end
243
+
244
+ it "should support order option with block" do
245
+ @c2.one_to_many :attributes, :class => @c1, :order => :kind do |ds|
246
+ ds.filter(:xxx => @xxx)
247
+ end
248
+
249
+ n = @c2.new(:id => 1234)
250
+ n.attributes.sql.should == "SELECT * FROM attributes WHERE (node_id = 1234) AND (xxx IS NULL) ORDER BY kind"
251
+ end
252
+
253
+ it "should support :cache option for returning array with all members of the association" do
254
+ @c2.one_to_many :attributes, :class => @c1, :cache => true
255
+
256
+ n = @c2.new(:id => 1234)
257
+ atts = n.attributes
258
+ atts.should be_a_kind_of(Array)
259
+ atts.size.should == 1
260
+ atts.first.should be_a_kind_of(@c1)
261
+ atts.first.values.should == {}
262
+
263
+ MODEL_DB.sqls.should == ['SELECT * FROM attributes WHERE (node_id = 1234)']
264
+ end
265
+
266
+ it "should support :cache option with a block" do
267
+ @c2.one_to_many :attributes, :class => @c1, :cache => true do |ds|
268
+ ds.filter(:xxx => @xxx)
269
+ end
270
+
271
+ n = @c2.new(:id => 1234)
272
+ atts = n.attributes
273
+ atts.should be_a_kind_of(Array)
274
+ atts.size.should == 1
275
+ atts.first.should be_a_kind_of(@c1)
276
+ atts.first.values.should == {}
277
+
278
+ MODEL_DB.sqls.should == ['SELECT * FROM attributes WHERE (node_id = 1234) AND (xxx IS NULL)']
279
+ end
280
+
281
+ it "should set cached instance variable when accessed" do
282
+ @c2.one_to_many :attributes, :class => @c1, :cache => true
283
+
284
+ n = @c2.new(:id => 1234)
285
+ MODEL_DB.reset
286
+ n.instance_variables.include?("@attributes").should == false
287
+ atts = n.attributes
288
+ atts.should == n.instance_variable_get("@attributes")
289
+ MODEL_DB.sqls.should == ['SELECT * FROM attributes WHERE (node_id = 1234)']
290
+ end
291
+
292
+ it "should use cached instance variable if available" do
293
+ @c2.one_to_many :attributes, :class => @c1, :cache => true
294
+
295
+ n = @c2.new(:id => 1234)
296
+ MODEL_DB.reset
297
+ n.instance_variable_set(:@attributes, 42)
298
+ n.attributes.should == 42
299
+ MODEL_DB.sqls.should == []
300
+ end
301
+
302
+ it "should not use cached instance variable if asked to reload" do
303
+ @c2.one_to_many :attributes, :class => @c1, :cache => true
304
+
305
+ n = @c2.new(:id => 1234)
306
+ MODEL_DB.reset
307
+ n.instance_variable_set(:@attributes, 42)
308
+ n.attributes(true).should_not == 42
309
+ MODEL_DB.sqls.should == ['SELECT * FROM attributes WHERE (node_id = 1234)']
310
+ end
311
+
312
+ it "should add item to cached instance variable if it exists when calling add_" do
313
+ @c2.one_to_many :attributes, :class => @c1, :cache => true
314
+
315
+ n = @c2.new(:id => 1234)
316
+ att = @c1.new(:id => 345)
317
+ MODEL_DB.reset
318
+ a = []
319
+ n.instance_variable_set(:@attributes, a)
320
+ n.add_attribute(att)
321
+ a.should == [att]
322
+ end
323
+
324
+ it "should remove item from cached instance variable if it exists when calling remove_" do
325
+ @c2.one_to_many :attributes, :class => @c1, :cache => true
326
+
327
+ n = @c2.new(:id => 1234)
328
+ att = @c1.new(:id => 345)
329
+ MODEL_DB.reset
330
+ a = [att]
331
+ n.instance_variable_set(:@attributes, a)
332
+ n.remove_attribute(att)
333
+ a.should == []
334
+ end
335
+
336
+ it "should have has_many alias" do
337
+ @c2.has_many :attributes, :class => @c1, :cache => true
338
+
339
+ n = @c2.new(:id => 1234)
340
+ atts = n.attributes
341
+ atts.should be_a_kind_of(Array)
342
+ atts.size.should == 1
343
+ atts.first.should be_a_kind_of(@c1)
344
+ atts.first.values.should == {}
345
+
346
+ MODEL_DB.sqls.should == ['SELECT * FROM attributes WHERE (node_id = 1234)']
347
+ end
348
+ end
349
+
350
+ describe Sequel::Model, "many_to_many" do
351
+
352
+ before(:each) do
353
+ MODEL_DB.reset
354
+
355
+ @c1 = Class.new(Sequel::Model(:attributes)) do
356
+ def self.name
357
+ 'Attribute'
358
+ end
359
+ end
360
+
361
+ @c2 = Class.new(Sequel::Model(:nodes)) do
362
+ attr_accessor :xxx
363
+
364
+ def self.name
365
+ 'Node'
366
+ end
367
+ end
368
+ @dataset = @c2.dataset
369
+
370
+ [@c1, @c2].each do |c|
371
+ c.dataset.extend(Module.new {
372
+ def fetch_rows(sql)
373
+ @db << sql
374
+ yield Hash.new
375
+ end
376
+ })
377
+ end
378
+ end
379
+
380
+ it "should use implicit key values and join table if omitted" do
381
+ @c2.many_to_many :attributes, :class => @c1
382
+
383
+ n = @c2.new(:id => 1234)
384
+ a = n.attributes
385
+ a.should be_a_kind_of(Sequel::Dataset)
386
+ ['SELECT * FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234)',
387
+ 'SELECT * FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.node_id = 1234) AND (attributes_nodes.attribute_id = attributes.id)'
388
+ ].should(include(a.sql))
389
+ end
390
+
391
+ it "should use implicit class if omitted" do
392
+ class Tag < Sequel::Model
393
+ end
394
+
395
+ @c2.many_to_many :tags
396
+
397
+ n = @c2.new(:id => 1234)
398
+ a = n.tags
399
+ a.should be_a_kind_of(Sequel::Dataset)
400
+ ['SELECT * FROM tags INNER JOIN nodes_tags ON (nodes_tags.tag_id = tags.id) AND (nodes_tags.node_id = 1234)',
401
+ 'SELECT * FROM tags INNER JOIN nodes_tags ON (nodes_tags.node_id = 1234) AND (nodes_tags.tag_id = tags.id)'
402
+ ].should(include(a.sql))
403
+ end
404
+
405
+ it "should use explicit key values and join table if given" do
406
+ @c2.many_to_many :attributes, :class => @c1, :left_key => :nodeid, :right_key => :attributeid, :join_table => :attribute2node
407
+
408
+ n = @c2.new(:id => 1234)
409
+ a = n.attributes
410
+ a.should be_a_kind_of(Sequel::Dataset)
411
+ ['SELECT * FROM attributes INNER JOIN attribute2node ON (attribute2node.nodeid = 1234) AND (attribute2node.attributeid = attributes.id)',
412
+ 'SELECT * FROM attributes INNER JOIN attribute2node ON (attribute2node.attributeid = attributes.id) AND (attribute2node.nodeid = 1234)'
413
+ ].should(include(a.sql))
414
+ end
415
+
416
+ it "should support order option" do
417
+ @c2.many_to_many :attributes, :class => @c1, :order => :blah
418
+
419
+ n = @c2.new(:id => 1234)
420
+ a = n.attributes
421
+ a.should be_a_kind_of(Sequel::Dataset)
422
+ ['SELECT * FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234) ORDER BY blah',
423
+ 'SELECT * FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.node_id = 1234) AND (attributes_nodes.attribute_id = attributes.id) ORDER BY blah'
424
+ ].should(include(a.sql))
425
+ end
426
+
427
+ it "should support optional dataset block" do
428
+ @c2.many_to_many :attributes, :class => @c1 do |ds|
429
+ ds.filter(:xxx => @xxx)
430
+ end
431
+
432
+ n = @c2.new(:id => 1234)
433
+ n.xxx = 555
434
+ a = n.attributes
435
+ a.should be_a_kind_of(Sequel::Dataset)
436
+ ['SELECT * FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234) WHERE (xxx = 555)',
437
+ 'SELECT * FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.node_id = 1234) AND (attributes_nodes.attribute_id = attributes.id) WHERE (xxx = 555)'
438
+ ].should(include(a.sql))
439
+ end
440
+
441
+ it "should define an add_ method" do
442
+ @c2.many_to_many :attributes, :class => @c1
443
+
444
+ n = @c2.new(:id => 1234)
445
+ a = @c1.new(:id => 2345)
446
+ a.should == n.add_attribute(a)
447
+ ['INSERT INTO attributes_nodes (node_id, attribute_id) VALUES (1234, 2345)',
448
+ 'INSERT INTO attributes_nodes (attribute_id, node_id) VALUES (2345, 1234)'
449
+ ].should(include(MODEL_DB.sqls.first))
450
+ end
451
+
452
+ it "should define a remove_ method" do
453
+ @c2.many_to_many :attributes, :class => @c1
454
+
455
+ n = @c2.new(:id => 1234)
456
+ a = @c1.new(:id => 2345)
457
+ a.should == n.remove_attribute(a)
458
+ ['DELETE FROM attributes_nodes WHERE (node_id = 1234) AND (attribute_id = 2345)',
459
+ 'DELETE FROM attributes_nodes WHERE (attribute_id = 2345) AND (node_id = 1234)'
460
+ ].should(include(MODEL_DB.sqls.first))
461
+ end
462
+
463
+ it "should provide an array with all members of the association (if cache option is specified)" do
464
+ @c2.many_to_many :attributes, :class => @c1, :cache => true
465
+
466
+ n = @c2.new(:id => 1234)
467
+ atts = n.attributes
468
+ atts.should be_a_kind_of(Array)
469
+ atts.size.should == 1
470
+ atts.first.should be_a_kind_of(@c1)
471
+
472
+ ['SELECT * FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234)',
473
+ 'SELECT * FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.node_id = 1234) AND (attributes_nodes.attribute_id = attributes.id)'
474
+ ].should(include(MODEL_DB.sqls.first))
475
+ end
476
+
477
+ it "should set cached instance variable when accessed" do
478
+ @c2.many_to_many :attributes, :class => @c1, :cache => true
479
+
480
+ n = @c2.new(:id => 1234)
481
+ MODEL_DB.reset
482
+ n.instance_variables.include?("@attributes").should == false
483
+ atts = n.attributes
484
+ atts.should == n.instance_variable_get("@attributes")
485
+ MODEL_DB.sqls.length.should == 1
486
+ end
487
+
488
+ it "should use cached instance variable if available" do
489
+ @c2.many_to_many :attributes, :class => @c1, :cache => true
490
+
491
+ n = @c2.new(:id => 1234)
492
+ MODEL_DB.reset
493
+ n.instance_variable_set(:@attributes, 42)
494
+ n.attributes.should == 42
495
+ MODEL_DB.sqls.should == []
496
+ end
497
+
498
+ it "should not use cached instance variable if asked to reload" do
499
+ @c2.many_to_many :attributes, :class => @c1, :cache => true
500
+
501
+ n = @c2.new(:id => 1234)
502
+ MODEL_DB.reset
503
+ n.instance_variable_set(:@attributes, 42)
504
+ n.attributes(true).should_not == 42
505
+ MODEL_DB.sqls.length.should == 1
506
+ end
507
+
508
+ it "should add item to cached instance variable if it exists when calling add_" do
509
+ @c2.many_to_many :attributes, :class => @c1, :cache => true
510
+
511
+ n = @c2.new(:id => 1234)
512
+ att = @c1.new(:id => 345)
513
+ MODEL_DB.reset
514
+ a = []
515
+ n.instance_variable_set(:@attributes, a)
516
+ n.add_attribute(att)
517
+ a.should == [att]
518
+ end
519
+
520
+ it "should remove item from cached instance variable if it exists when calling remove_" do
521
+ @c2.many_to_many :attributes, :class => @c1, :cache => true
522
+
523
+ n = @c2.new(:id => 1234)
524
+ att = @c1.new(:id => 345)
525
+ MODEL_DB.reset
526
+ a = [att]
527
+ n.instance_variable_set(:@attributes, a)
528
+ n.remove_attribute(att)
529
+ a.should == []
530
+ end
531
+
532
+ it "should have has_and_belongs_to_many alias" do
533
+ @c2.has_and_belongs_to_many :attributes, :class => @c1
534
+
535
+ n = @c2.new(:id => 1234)
536
+ a = n.attributes
537
+ a.should be_a_kind_of(Sequel::Dataset)
538
+ ['SELECT * FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) AND (attributes_nodes.node_id = 1234)',
539
+ 'SELECT * FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.node_id = 1234) AND (attributes_nodes.attribute_id = attributes.id)'
540
+ ].should(include(a.sql))
541
+ end
542
+
543
+ end
544
+
545
+ describe Sequel::Model, "all_association_reflections" do
546
+ before(:each) do
547
+ MODEL_DB.reset
548
+ @c1 = Class.new(Sequel::Model(:nodes)) do
549
+ def self.name
550
+ 'Node'
551
+ end
552
+ end
553
+ end
554
+
555
+ it "should include all association reflection hashes" do
556
+ @c1.all_association_reflections.should == []
557
+ @c1.associate :many_to_one, :parent, :class => @c1
558
+ @c1.all_association_reflections.should == [{
559
+ :type => :many_to_one, :name => :parent, :class_name => 'Node',
560
+ :class => @c1, :key => :parent_id, :block => nil
561
+ }]
562
+ @c1.associate :one_to_many, :children, :class => @c1
563
+ @c1.all_association_reflections.sort_by{|x|x[:name].to_s}.should == [{
564
+ :type => :one_to_many, :name => :children, :class_name => 'Node',
565
+ :class => @c1, :key => :node_id, :block => nil}, {
566
+ :type => :many_to_one, :name => :parent, :class_name => 'Node',
567
+ :class => @c1, :key => :parent_id, :block => nil}]
568
+ end
569
+ end
570
+
571
+ describe Sequel::Model, "association_reflection" do
572
+ before(:each) do
573
+ MODEL_DB.reset
574
+ @c1 = Class.new(Sequel::Model(:nodes)) do
575
+ def self.name
576
+ 'Node'
577
+ end
578
+ end
579
+ end
580
+
581
+ it "should return nil for nonexistent association" do
582
+ @c1.association_reflection(:blah).should == nil
583
+ end
584
+
585
+ it "should return association reflection hash if association exists" do
586
+ @c1.associate :many_to_one, :parent, :class => @c1
587
+ @c1.association_reflection(:parent).should == {
588
+ :type => :many_to_one, :name => :parent, :class_name => 'Node',
589
+ :class => @c1, :key => :parent_id, :block => nil
590
+ }
591
+ @c1.associate :one_to_many, :children, :class => @c1
592
+ @c1.association_reflection(:children).should == {
593
+ :type => :one_to_many, :name => :children, :class_name => 'Node',
594
+ :class => @c1, :key => :node_id, :block => nil
595
+ }
596
+ end
597
+ end
598
+
599
+ describe Sequel::Model, "associations" do
600
+ before(:each) do
601
+ MODEL_DB.reset
602
+ @c1 = Class.new(Sequel::Model(:nodes)) do
603
+ def self.name
604
+ 'Node'
605
+ end
606
+ end
607
+ end
608
+
609
+ it "should include all association names" do
610
+ @c1.associations.should == []
611
+ @c1.associate :many_to_one, :parent, :class => @c1
612
+ @c1.associations.should == [:parent]
613
+ @c1.associate :one_to_many, :children, :class => @c1
614
+ @c1.associations.sort_by{|x|x.to_s}.should == [:children, :parent]
615
+ end
616
+ end