@@ -289,6 +289,50 @@ def roots_name_and_order
289
289
end
290
290
end
291
291
292
+ context "doesn't order roots when requested" do
293
+ before :each do
294
+ @root1 = LabelWithoutRootOrdering . create! ( :name => 'root1' )
295
+ @root2 = LabelWithoutRootOrdering . create! ( :name => 'root2' )
296
+ @a , @b , @c , @d , @e = ( 'a' ..'e' ) . map { |ea | LabelWithoutRootOrdering . new ( :name => ea ) }
297
+ @root1 . children << @a
298
+ @root1 . append_child ( @c )
299
+ @root1 . prepend_child ( @d )
300
+
301
+ # Reload is needed here and below because order values may have been adjusted in the DB during
302
+ # prepend_child, append_sibling, etc.
303
+ [ @a , @c , @d ] . each ( &:reload )
304
+
305
+ @a . append_sibling ( @b )
306
+ [ @a , @c , @d , @b ] . each ( &:reload )
307
+ @d . prepend_sibling ( @e )
308
+ end
309
+
310
+ it 'order_values properly' do
311
+ expect ( @root1 . reload . order_value ) . to be_nil
312
+ orders_and_names = @root1 . children . reload . map { |ea | [ ea . name , ea . order_value ] }
313
+ expect ( orders_and_names ) . to eq ( [ [ 'e' , 0 ] , [ 'd' , 1 ] , [ 'a' , 2 ] , [ 'b' , 3 ] , [ 'c' , 4 ] ] )
314
+ end
315
+
316
+ it 'raises on prepending and appending to root' do
317
+ expect { @root1 . prepend_sibling ( @f ) } . to raise_error ( ClosureTree ::RootOrderingDisabledError )
318
+ expect { @root1 . append_sibling ( @f ) } . to raise_error ( ClosureTree ::RootOrderingDisabledError )
319
+ end
320
+
321
+ it 'returns empty array for siblings_before and after' do
322
+ expect ( @root1 . siblings_before ) . to eq ( [ ] )
323
+ expect ( @root1 . siblings_after ) . to eq ( [ ] )
324
+ end
325
+
326
+ it 'returns expected result for self_and_descendants_preordered' do
327
+ expect ( @root1 . self_and_descendants_preordered . to_a ) . to eq ( [ @root1 , @e , @d , @a , @b , @c ] )
328
+ end unless sqlite? # sqlite doesn't have a power function.
329
+
330
+ it 'raises on roots_and_descendants_preordered' do
331
+ expect { LabelWithoutRootOrdering . roots_and_descendants_preordered } . to raise_error (
332
+ ClosureTree ::RootOrderingDisabledError )
333
+ end
334
+ end
335
+
292
336
describe 'code in the readme' do
293
337
it 'creates STI label hierarchies' do
294
338
child = Label . find_or_create_by_path ( [
@@ -341,17 +385,7 @@ def roots_name_and_order
341
385
root = Label . create ( :name => "root" )
342
386
a = Label . create ( :name => "a" , :parent => root )
343
387
b = Label . create ( :name => "b" , :parent => root )
344
- expect ( a . order_value ) . to eq ( 0 )
345
- expect ( b . order_value ) . to eq ( 1 )
346
- #c = Label.create(:name => "c")
347
388
348
- # should the order_value for roots be set?
349
- expect ( root . order_value ) . not_to be_nil
350
- expect ( root . order_value ) . to eq ( 0 )
351
-
352
- # order_value should never be nil on a child.
353
- expect ( a . order_value ) . not_to be_nil
354
- expect ( a . order_value ) . to eq ( 0 )
355
389
# Add a child to root at end of children.
356
390
root . children << b
357
391
expect ( b . parent ) . to eq ( root )
@@ -395,28 +429,41 @@ def roots_name_and_order
395
429
end
396
430
397
431
context "order_value must be set" do
432
+ shared_examples_for "correct order_value" do
433
+ before do
434
+ @root = model . create ( name : 'root' )
435
+ @a , @b , @c = %w( a b c ) . map { |n | @root . children . create ( name : n ) }
436
+ end
398
437
399
- before do
400
- @root = Label . create ( name : 'root' )
401
- @a , @b , @c = %w( a b c ) . map { |n | @root . children . create ( name : n ) }
402
- end
438
+ it 'should set order_value on roots' do
439
+ expect ( @root . order_value ) . to eq ( expected_root_order_value )
440
+ end
403
441
404
- it 'should set order_value on roots' do
405
- expect ( @root . order_value ) . to eq ( 0 )
442
+ it 'should set order_value with siblings' do
443
+ expect ( @a . order_value ) . to eq ( 0 )
444
+ expect ( @b . order_value ) . to eq ( 1 )
445
+ expect ( @c . order_value ) . to eq ( 2 )
446
+ end
447
+
448
+ it 'should reset order_value when a node is moved to another location' do
449
+ root2 = model . create ( name : 'root2' )
450
+ root2 . add_child @b
451
+ expect ( @a . order_value ) . to eq ( 0 )
452
+ expect ( @b . order_value ) . to eq ( 0 )
453
+ expect ( @c . reload . order_value ) . to eq ( 1 )
454
+ end
406
455
end
407
456
408
- it 'should set order_value with siblings' do
409
- expect ( @a . order_value ) . to eq ( 0 )
410
- expect ( @b . order_value ) . to eq ( 1 )
411
- expect ( @c . order_value ) . to eq ( 2 )
457
+ context " with normal model" do
458
+ let ( :model ) { Label }
459
+ let ( :expected_root_order_value ) { 0 }
460
+ it_behaves_like "correct order_value"
412
461
end
413
462
414
- it 'should reset order_value when a node is moved to another location' do
415
- root2 = Label . create ( name : 'root2' )
416
- root2 . add_child @b
417
- expect ( @a . order_value ) . to eq ( 0 )
418
- expect ( @b . order_value ) . to eq ( 0 )
419
- expect ( @c . reload . order_value ) . to eq ( 1 )
463
+ context "without root ordering" do
464
+ let ( :model ) { LabelWithoutRootOrdering }
465
+ let ( :expected_root_order_value ) { nil }
466
+ it_behaves_like "correct order_value"
420
467
end
421
468
end
422
469
0 commit comments