@@ -289,6 +289,44 @@ 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
+ @a . append_sibling ( @b )
301
+ @d . prepend_sibling ( @e )
302
+ end
303
+
304
+ it 'order_values properly' do
305
+ expect ( @root1 . reload . order_value ) . to be_nil
306
+ orders_and_names = @root1 . children . reload . map { |ea | [ ea . name , ea . order_value ] }
307
+ expect ( orders_and_names ) . to eq ( [ [ 'e' , 0 ] , [ 'd' , 1 ] , [ 'a' , 2 ] , [ 'b' , 3 ] , [ 'c' , 4 ] ] )
308
+ end
309
+
310
+ it 'raises on prepending and appending to root' do
311
+ expect { @root1 . prepend_sibling ( @f ) } . to raise_error ( ClosureTree ::RootOrderingDisabledError )
312
+ expect { @root1 . append_sibling ( @f ) } . to raise_error ( ClosureTree ::RootOrderingDisabledError )
313
+ end
314
+
315
+ it 'returns empty array for siblings_before and after' do
316
+ expect ( @root1 . siblings_before ) . to eq ( [ ] )
317
+ expect ( @root1 . siblings_after ) . to eq ( [ ] )
318
+ end
319
+
320
+ it 'returns expected result for self_and_descendants_preordered' do
321
+ expect ( @root1 . self_and_descendants_preordered . to_a ) . to eq ( [ @root1 , @e , @d , @a , @b , @c ] )
322
+ end unless sqlite? # sqlite doesn't have a power function.
323
+
324
+ it 'raises on roots_and_descendants_preordered' do
325
+ expect { LabelWithoutRootOrdering . roots_and_descendants_preordered } . to raise_error (
326
+ ClosureTree ::RootOrderingDisabledError )
327
+ end
328
+ end
329
+
292
330
describe 'code in the readme' do
293
331
it 'creates STI label hierarchies' do
294
332
child = Label . find_or_create_by_path ( [
@@ -341,17 +379,7 @@ def roots_name_and_order
341
379
root = Label . create ( :name => "root" )
342
380
a = Label . create ( :name => "a" , :parent => root )
343
381
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
382
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
383
# Add a child to root at end of children.
356
384
root . children << b
357
385
expect ( b . parent ) . to eq ( root )
@@ -395,28 +423,41 @@ def roots_name_and_order
395
423
end
396
424
397
425
context "order_value must be set" do
426
+ shared_examples_for "correct order_value" do
427
+ before do
428
+ @root = model . create ( name : 'root' )
429
+ @a , @b , @c = %w( a b c ) . map { |n | @root . children . create ( name : n ) }
430
+ end
398
431
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
432
+ it 'should set order_value on roots' do
433
+ expect ( @root . order_value ) . to eq ( expected_root_order_value )
434
+ end
403
435
404
- it 'should set order_value on roots' do
405
- expect ( @root . order_value ) . to eq ( 0 )
436
+ it 'should set order_value with siblings' do
437
+ expect ( @a . order_value ) . to eq ( 0 )
438
+ expect ( @b . order_value ) . to eq ( 1 )
439
+ expect ( @c . order_value ) . to eq ( 2 )
440
+ end
441
+
442
+ it 'should reset order_value when a node is moved to another location' do
443
+ root2 = model . create ( name : 'root2' )
444
+ root2 . add_child @b
445
+ expect ( @a . order_value ) . to eq ( 0 )
446
+ expect ( @b . order_value ) . to eq ( 0 )
447
+ expect ( @c . reload . order_value ) . to eq ( 1 )
448
+ end
406
449
end
407
450
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 )
451
+ context " with normal model" do
452
+ let ( :model ) { Label }
453
+ let ( :expected_root_order_value ) { 0 }
454
+ it_behaves_like "correct order_value"
412
455
end
413
456
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 )
457
+ context "without root ordering" do
458
+ let ( :model ) { LabelWithoutRootOrdering }
459
+ let ( :expected_root_order_value ) { nil }
460
+ it_behaves_like "correct order_value"
420
461
end
421
462
end
422
463
0 commit comments