simply_stored 0.5.4 → 0.6.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.
@@ -1,639 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/test_helper')
2
- require File.expand_path(File.dirname(__FILE__) + '/fixtures/couch')
3
-
4
- class HasAndBelongsToManyTest < Test::Unit::TestCase
5
- context "has_and_belongs_to_many" do
6
- setup do
7
- CouchPotato::Config.database_name = 'simply_stored_test'
8
- recreate_db
9
- end
10
-
11
- context "with has_and_belongs_to_many" do
12
- should "create a fetch method for the associated objects" do
13
- server = Server.new
14
- assert server.respond_to?(:networks)
15
-
16
- network = Network.new
17
- assert network.respond_to?(:servers)
18
- end
19
-
20
- should "raise an error if another property with the same name already exists" do
21
- assert_raise(RuntimeError) do
22
- class ::DoubleHasAdnBelongsToManyServer
23
- include SimplyStored::Couch
24
- property :other_users
25
- has_and_belongs_to_many :other_users
26
- end
27
- end
28
- end
29
-
30
- should "fetch the associated objects" do
31
- network = Network.create(:klass => "A")
32
- 3.times {
33
- server = Server.new
34
- server.network_ids = [network.id]
35
- server.save!
36
- }
37
- assert_equal 3, network.servers.size
38
- end
39
-
40
- should "fetch the associated objects from the other side of the relation" do
41
- network = Network.create(:klass => "A")
42
- 3.times {
43
- server = Server.new
44
- server.network_ids = [network.id]
45
- server.save!
46
- }
47
- assert_equal 1, Server.first.networks.size
48
- end
49
-
50
- should "set the parent object on the clients cache" do
51
- Network.expects(:find).never
52
- network = Network.create(:klass => "A")
53
- 3.times {
54
- server = Server.new
55
- server.add_network(network)
56
- }
57
- assert_equal network, network.servers.first.networks.first
58
- end
59
-
60
- should "set the parent object on the clients cache from the other side of the relation" do
61
- Server.expects(:find).never
62
- network = Network.create(:klass => "A")
63
- 3.times {
64
- server = Server.new
65
- network.add_server(server)
66
- }
67
- assert_equal network, network.servers.first.networks.first
68
- end
69
-
70
- should "work relations from both sides" do
71
- network_a = Network.create(:klass => "A")
72
- network_b = Network.create(:klass => "B")
73
- 3.times {
74
- server = Server.new
75
- server.add_network(network_a)
76
- server.add_network(network_b)
77
- }
78
- assert_equal 3, network_a.servers.size
79
- network_a.servers.each do |server|
80
- assert_equal 2, server.networks.size
81
- end
82
- assert_equal 3, network_b.servers.size
83
- network_b.servers.each do |server|
84
- assert_equal 2, server.networks.size
85
- end
86
- end
87
-
88
- should "work relations from both sides - regardless from where the add was called" do
89
- network_a = Network.create(:klass => "A")
90
- network_b = Network.create(:klass => "B")
91
- 3.times {
92
- server = Server.new
93
- network_a.add_server(server)
94
- network_b.add_server(server)
95
- }
96
- assert_equal 3, network_a.servers.size
97
- network_a.servers.each do |server|
98
- assert_equal 2, server.networks.size, server.network_ids.inspect
99
- end
100
- assert_equal 3, network_b.servers.size
101
- network_b.servers.each do |server|
102
- assert_equal 2, server.networks.size
103
- end
104
- end
105
-
106
- context "limit" do
107
-
108
- should "be able to limit the result set" do
109
- network = Network.create(:klass => "A")
110
- 3.times {
111
- server = Server.new
112
- server.add_network(network)
113
- }
114
- assert_equal 2, network.servers(:limit => 2).size
115
- end
116
-
117
- should "use the given options in the cache-key" do
118
- network = Network.create(:klass => "A")
119
- 3.times {
120
- server = Server.new
121
- server.add_network(network)
122
- }
123
- assert_equal 2, network.servers(:limit => 2).size
124
- assert_equal 3, network.servers(:limit => 3).size
125
- end
126
-
127
- should "be able to limit the result set - for both directions" do
128
- network_a = Network.create(:klass => "A")
129
- network_b = Network.create(:klass => "B")
130
- 3.times {
131
- server = Server.new
132
- server.add_network(network_a)
133
- server.add_network(network_b)
134
- }
135
- assert_equal 2, network_a.servers(:limit => 2).size
136
- assert_equal 3, network_a.servers(:limit => 3).size
137
-
138
- assert_equal 2, network_a.servers.first.networks(:limit => 2).size
139
- assert_equal 1, network_a.servers.first.networks(:limit => 1).size
140
- end
141
- end
142
-
143
- context "order" do
144
- setup do
145
- @network = Network.create(:klass => "A")
146
- @network.created_at = Time.local(2000)
147
- @network.save!
148
- @network_b = Network.create(:klass => "B")
149
- @network_b.created_at = Time.local(2002)
150
- @network_b.save!
151
- 3.times do |i|
152
- server = Server.new
153
- server.add_network(@network)
154
- server.add_network(@network_b)
155
- server.created_at = Time.local(2000 + i)
156
- server.save!
157
- end
158
- end
159
-
160
- should "support different order" do
161
- assert_nothing_raised do
162
- @network.servers(:order => :asc)
163
- end
164
-
165
- assert_nothing_raised do
166
- @network.servers(:order => :desc)
167
- end
168
- end
169
-
170
- should "reverse the order if :desc" do
171
- assert_equal @network.servers(:order => :asc).map(&:id).reverse, @network.servers(:order => :desc).map(&:id)
172
- server = @network.servers.first
173
- assert_equal server.networks(:order => :asc).map(&:id).reverse, server.networks(:order => :desc).map(&:id)
174
- end
175
-
176
- should "work with the limit option" do
177
- server = Server.new
178
- server.add_network(@network)
179
- server.add_network(@network_b)
180
- assert_not_equal @network.servers(:order => :asc, :limit => 3).map(&:id).reverse, @network.servers(:order => :desc, :limit => 3).map(&:id)
181
- assert_not_equal server.networks(:order => :asc, :limit => 1).map(&:id).reverse, server.networks(:order => :desc, :limit => 1).map(&:id)
182
- end
183
- end
184
-
185
- should "verify the given options for the accessor method" do
186
- network = Network.create(:klass => "A")
187
- assert_raise(ArgumentError) do
188
- network.servers(:foo => :bar)
189
- end
190
- end
191
-
192
- should "verify the given options for the association defintion" do
193
- assert_raise(ArgumentError) do
194
- Network.instance_eval do
195
- has_and_belongs_to_many :foo, :bar => :do
196
- end
197
- end
198
- end
199
-
200
- should "only fetch objects of the correct type" do
201
- network = Network.create(:klass => "A")
202
- server = Server.new
203
- server.network_ids = [network.id]
204
- server.save!
205
-
206
- comment = Comment.new
207
- comment.network = network
208
- comment.save!
209
-
210
- assert_equal 1, network.servers.size
211
- end
212
-
213
- should "getter should user cache" do
214
- network = Network.create(:klass => "A")
215
- server = Server.new
216
- server.network_ids = [network.id]
217
- server.save!
218
- network.servers
219
- assert_equal [server], network.instance_variable_get("@servers")[:all]
220
- end
221
-
222
- should "add methods to handle associated objects" do
223
- network = Network.create(:klass => "A")
224
- assert network.respond_to?(:add_server)
225
- assert network.respond_to?(:remove_server)
226
- assert network.respond_to?(:remove_all_servers)
227
- end
228
-
229
- should "add methods to handle associated objects - for the other side too" do
230
- server = Server.create
231
- assert server.respond_to?(:add_network)
232
- assert server.respond_to?(:remove_network)
233
- assert server.respond_to?(:remove_all_networks)
234
- end
235
-
236
- should 'ignore the cache when requesting explicit reload' do
237
- network = Network.create(:klass => "A")
238
- assert_equal [], network.servers
239
- server = Server.new
240
- server.network_ids = [network.id]
241
- server.save!
242
- assert_equal [server], network.servers(:force_reload => true)
243
- end
244
-
245
- should "use the correct view when handling inheritance" do
246
- network = Network.create
247
- subnet = Subnet.create
248
- server = Server.new
249
- server.network_ids = [network.id]
250
- server.save!
251
- assert_equal 1, network.servers.size
252
- server.update_attributes(:network_ids => nil, :subnet_ids => [subnet.id])
253
- assert_equal 1, subnet.servers.size
254
- end
255
-
256
- context "when adding items" do
257
- should "add the item to the internal cache" do
258
- network = Network.new(:klass => "C")
259
- server = Server.new
260
- assert_equal [], network.servers
261
- network.add_server(server)
262
- assert_equal [server], network.servers
263
- assert_equal [server], network.instance_variable_get("@servers")[:all]
264
- end
265
-
266
- should "raise an error when the added item is not an object of the expected class" do
267
- network = Network.new
268
- assert_raise(ArgumentError, 'excepted Server got String') do
269
- network.add_server('foo')
270
- end
271
- end
272
-
273
- should "save the added item" do
274
- server = Server.new
275
- network = Network.create(:klass => "A")
276
- network.add_server(server)
277
- assert !server.new_record?
278
- end
279
-
280
- should "save the added item - from both directions" do
281
- server = Server.new
282
- network = Network.create(:klass => "A")
283
- server.add_network(network)
284
- assert !server.new_record?
285
- end
286
-
287
- should 'set the forein key on the added object' do
288
- server = Server.new
289
- network = Network.create(:klass => "A")
290
- network.add_server(server)
291
- assert_equal [network.id], server.network_ids
292
- end
293
-
294
- should 'set the forein key on the added object - from both directions' do
295
- server = Server.new
296
- network = Network.create(:klass => "A")
297
- server.add_network(network)
298
- assert_equal [network.id], server.network_ids
299
- end
300
-
301
- should "adding multiple times doesn't hurt" do
302
- server = Server.new
303
- network = Network.create(:klass => "A")
304
- network.add_server(server)
305
- network.add_server(server)
306
- server.add_network(network)
307
- assert_equal [network.id], server.network_ids
308
- assert_equal [network.id], Server.find(server.id).network_ids
309
- end
310
- end
311
-
312
- context "when removing items" do
313
- should "should unset the foreign key" do
314
- server = Server.new
315
- network = Network.create(:klass => "A")
316
- network.add_server(server)
317
-
318
- network.remove_server(server)
319
- assert_equal [], server.network_ids
320
- end
321
-
322
- should "should unset the foreign key - from both directions" do
323
- server = Server.new
324
- network = Network.create(:klass => "A")
325
- network.add_server(server)
326
-
327
- server.remove_network(network)
328
- assert_equal [], server.network_ids
329
- end
330
-
331
- should "remove the item from the cache" do
332
- server = Server.new
333
- network = Network.create(:klass => "A")
334
- network.add_server(server)
335
- assert network.servers.include?(server)
336
- network.remove_server(server)
337
- assert !network.servers.any?{|s| server.id == s.id}
338
- assert_equal [], network.instance_variable_get("@servers")[:all]
339
- end
340
-
341
- should "remove the item from the cache - from both directions" do
342
- server = Server.new
343
- network = Network.create(:klass => "A")
344
- network.add_server(server)
345
- assert server.networks.include?(network)
346
- server.remove_network(network)
347
- assert !server.networks.any?{|n| network.id == n.id}
348
- assert_equal [], server.instance_variable_get("@networks")[:all]
349
- end
350
-
351
- should "save the removed item with the nullified foreign key" do
352
- server = Server.new
353
- network = Network.create(:klass => "A")
354
- network.add_server(server)
355
-
356
- network.remove_server(server)
357
- server = Server.find(server.id)
358
- assert_equal [], server.network_ids
359
- end
360
-
361
- should "save the removed item with the nullified foreign key - from both directions" do
362
- server = Server.new
363
- network = Network.create(:klass => "A")
364
- network.add_server(server)
365
-
366
- server.remove_network(network)
367
- server = Server.find(server.id)
368
- assert_equal [], server.network_ids
369
- end
370
-
371
- should 'raise an error when another object is the owner of the object to be removed' do
372
- server = Server.new
373
- network = Network.create(:klass => "A")
374
- network.add_server(server)
375
-
376
- other_server = Server.create
377
- assert_raise(ArgumentError) do
378
- network.remove_server(other_server)
379
- end
380
- end
381
-
382
- should 'raise an error when another object is the owner of the object to be removed - from both directions' do
383
- server = Server.new
384
- network = Network.create(:klass => "A")
385
- network.add_server(server)
386
-
387
- other_network = Network.create
388
- assert_raise(ArgumentError) do
389
- server.remove_network(other_network)
390
- end
391
- end
392
-
393
- should 'raise an error when the object is the wrong type' do
394
- assert_raise(ArgumentError, 'excepted Server got String') do
395
- Network.new.remove_server('foo')
396
- end
397
- assert_raise(ArgumentError, 'excepted Network got String') do
398
- Server.new.remove_network('foo')
399
- end
400
- end
401
- end
402
-
403
- context "when removing all items" do
404
- should 'nullify the foreign keys on all referenced items' do
405
- server_1 = Server.new
406
- server_2 = Server.new
407
- network = Network.create(:klass => "A")
408
- network.add_server(server_1)
409
- network.add_server(server_2)
410
- network.remove_all_servers
411
- server_1 = Server.find(server_1.id)
412
- server_2 = Server.find(server_2.id)
413
- assert_equal [], server_1.network_ids
414
- assert_equal [], server_2.network_ids
415
- end
416
-
417
- should 'nullify the foreign keys on all referenced items - from both directions' do
418
- server_1 = Server.new
419
- server_2 = Server.new
420
- network = Network.create(:klass => "A")
421
- network.add_server(server_1)
422
- network.add_server(server_2)
423
- server_1.remove_all_networks
424
- server_1 = Server.find(server_1.id)
425
- server_2 = Server.find(server_2.id)
426
- assert_equal [], server_1.network_ids
427
- assert_equal [network.id], server_2.network_ids
428
- end
429
-
430
- should 'empty the cache' do
431
- server_1 = Server.new
432
- server_2 = Server.new
433
- network = Network.create(:klass => "A")
434
- network.add_server(server_1)
435
- network.add_server(server_2)
436
- network.remove_all_servers
437
- assert_equal [], network.servers
438
- assert_equal [], network.instance_variable_get("@servers")[:all]
439
- end
440
-
441
- should 'empty the cache - from both directions' do
442
- server_1 = Server.new
443
- server_2 = Server.new
444
- network = Network.create(:klass => "A")
445
- network.add_server(server_1)
446
- network.add_server(server_2)
447
- server_1.remove_all_networks
448
- assert_equal [], server_1.networks
449
- assert_equal [], server_1.instance_variable_get("@networks")[:all]
450
- end
451
-
452
- context "when counting" do
453
- setup do
454
- @network = Network.create(:klass => "C")
455
- @server = Server.create
456
- end
457
-
458
- should "define a count method" do
459
- assert @network.respond_to?(:server_count)
460
- assert @server.respond_to?(:network_count)
461
- end
462
-
463
- should "cache the result" do
464
- assert_equal 0, @network.server_count
465
- Server.create(:network_ids => [@network.id])
466
- assert_equal 0, @network.server_count
467
- assert_equal 0, @network.instance_variable_get("@server_count")
468
- @network.instance_variable_set("@server_count", nil)
469
- assert_equal 1, @network.server_count
470
- end
471
-
472
- should "cache the result - from both directions" do
473
- assert_equal 0, @server.network_count
474
- @server.network_ids = [@network.id]
475
- @server.save!
476
- assert_equal 0, @server.network_count
477
- assert_equal 0, @server.instance_variable_get("@network_count")
478
- @server.instance_variable_set("@network_count", nil)
479
- assert_equal 1, @server.network_count
480
- end
481
-
482
- should "force reload even if cached" do
483
- assert_equal 0, @network.server_count
484
- Server.create(:network_ids => [@network.id])
485
- assert_equal 0, @network.server_count
486
- assert_equal 1, @network.server_count(:force_reload => true)
487
- end
488
-
489
- should "force reload even if cached - from both directions" do
490
- assert_equal 0, @server.network_count
491
- @server.network_ids = [@network.id]
492
- @server.save!
493
- assert_equal 0, @server.network_count
494
- assert_equal 1, @server.network_count(:force_reload => true)
495
- end
496
-
497
- should "count the number of belongs_to objects" do
498
- assert_equal 0, @network.server_count(:force_reload => true)
499
- Server.create(:network_ids => [@network.id])
500
- assert_equal 1, @network.server_count(:force_reload => true)
501
- Server.create(:network_ids => [@network.id])
502
- assert_equal 2, @network.server_count(:force_reload => true)
503
- Server.create(:network_ids => [@network.id])
504
- assert_equal 3, @network.server_count(:force_reload => true)
505
- end
506
-
507
- should "count the number of belongs_to objects - from both directions" do
508
- assert_equal 0, @server.network_count(:force_reload => true)
509
- @server.network_ids = [@network.id]
510
- @server.save!
511
- assert_equal 1, @server.network_count(:force_reload => true)
512
- @server.network_ids = [@network.id, Network.create.id]
513
- @server.save!
514
- assert_equal 2, @server.network_count(:force_reload => true)
515
- end
516
-
517
- should "not count non-releated objects" do
518
- Server.all.each{|s| s.delete}
519
- network_1 = Network.create(:klass => "A")
520
- network_2 = Network.create(:klass => "B")
521
- server_1 = Server.create
522
- server_2 = Server.create(:network_ids => [network_1.id])
523
- server_3 = Server.create(:network_ids => [network_1.id, network_2.id])
524
- assert_equal 3, Server.count
525
- assert_equal 2, network_1.server_count
526
- assert_equal 1, network_2.server_count
527
- assert_equal 0, server_1.network_count
528
- assert_equal 1, server_2.network_count
529
- assert_equal 2, server_3.network_count
530
- end
531
-
532
- should "not count deleted objects" do
533
- network = Network.create(:klass => "A")
534
- server = Server.create(:network_ids => [network.id])
535
- assert_equal 1, network.server_count(:force_reload => true)
536
- server.delete
537
- assert_equal 0, network.server_count(:force_reload => true)
538
- end
539
-
540
- should "not count deleted objects - from both directions" do
541
- network = Network.create(:klass => "A")
542
- server = Server.create(:network_ids => [network.id])
543
- assert_equal 1, server.network_count(:force_reload => true)
544
- network.delete
545
- assert_equal 0, server.network_count(:force_reload => true)
546
- end
547
-
548
- end
549
- end
550
-
551
- context "with deleted" do
552
- should "not fetch deleted objects" do
553
- network = Network.create(:klass => "A")
554
- server = Server.new
555
- server.network_ids = [network.id]
556
- server.save!
557
- assert_equal 1, network.servers(:force_reload => true).size
558
- assert_no_difference "Network.count" do
559
- assert_difference "Server.count", -1 do
560
- server.delete
561
- end
562
- end
563
- assert_equal 0, network.servers(:force_reload => true).size
564
- end
565
-
566
- should "not fetch deleted objects - from both directions" do
567
- network = Network.create(:klass => "A")
568
- server = Server.new
569
- server.network_ids = [network.id]
570
- server.save!
571
- assert_equal 1, server.networks(:force_reload => true).size
572
- assert_difference "Network.count", -1 do
573
- assert_no_difference "Server.count" do
574
- network.delete
575
- end
576
- end
577
- assert_equal 0, server.networks(:force_reload => true).size, server.networks(:force_reload => true).inspect
578
- assert_equal [], server.reload.network_ids
579
- end
580
- end
581
-
582
-
583
- context "with soft deleted" do
584
-
585
- should "not load soft deleted - items storing keys" do
586
- network = Network.create
587
- router = Router.new
588
- network.add_router(router)
589
- assert_equal 1, network.routers.size
590
- router.delete
591
- assert_equal 0, Router.count
592
- assert_equal 1, Router.count(:with_deleted => true)
593
- assert_equal 0, network.routers(:force_reload => true).size
594
- assert_equal 1, network.routers(:force_reload => true, :with_deleted => true).size
595
- router.delete!
596
- assert_equal 0, network.routers(:force_reload => true, :with_deleted => true).size
597
- end
598
-
599
- should "not count soft deleted - items storing keys" do
600
- network = Network.create
601
- router = Router.new
602
- network.add_router(router)
603
- assert_equal 1, network.routers.size
604
- router.delete
605
- assert_equal 0, Router.count
606
- assert_equal 1, Router.count(:with_deleted => true)
607
- assert_equal 0, network.router_count(:force_reload => true)
608
- assert_equal 1, network.router_count(:force_reload => true, :with_deleted => true)
609
- router.delete!
610
- assert_equal 0, network.router_count(:force_reload => true, :with_deleted => true)
611
- end
612
-
613
- should "not load soft deleted - items not storing keys: not supported" do
614
- book = Book.create
615
- author = Author.create
616
- author.add_book(book)
617
- author.delete
618
- assert_equal 0, Author.count
619
- assert_equal 1, Author.count(:with_deleted => true)
620
- assert_equal 0, book.authors(:force_reload => true).size
621
- assert_equal 0, book.authors(:force_reload => true, :with_deleted => true).size
622
- end
623
-
624
- should "not count soft deleted - items not storing keys: not supported" do
625
- book = Book.create
626
- author = Author.create
627
- author.add_book(book)
628
- author.delete
629
- assert_equal 0, Author.count
630
- assert_equal 1, Author.count(:with_deleted => true)
631
- assert_equal 0, book.author_count(:force_reload => true)
632
- assert_equal 0, book.author_count(:force_reload => true, :with_deleted => true)
633
- end
634
-
635
- end
636
-
637
- end
638
- end
639
- end