@@ -289,6 +289,50 @@ def roots_name_and_order
289289 end
290290 end
291291
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+ 292336 describe 'code in the readme' do
293337 it 'creates STI label hierarchies' do
294338 child = Label . find_or_create_by_path ( [
@@ -341,17 +385,7 @@ def roots_name_and_order
341385 root = Label . create ( :name => "root" )
342386 a = Label . create ( :name => "a" , :parent => root )
343387 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")
347388
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 )
355389 # Add a child to root at end of children.
356390 root . children << b
357391 expect ( b . parent ) . to eq ( root )
@@ -395,28 +429,41 @@ def roots_name_and_order
395429 end
396430
397431 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
398437
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
403441
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
406455 end
407456
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"
412461 end
413462
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"
420467 end
421468 end
422469
0 commit comments