Skip to content

Commit

Permalink
Added acts_as_nested_set rails#1000 [wschenk]
Browse files Browse the repository at this point in the history
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@1186 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information
dhh committed Apr 17, 2005
1 parent 339f495 commit 78d8503
Showing 1 changed file with 184 additions and 0 deletions.
184 changes: 184 additions & 0 deletions activerecord/test/mixin_nested_set_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
require 'abstract_unit'
require 'active_record/acts/nested_set'
require 'fixtures/mixin'
require 'pp'

class MixinNestedSetTest < Test::Unit::TestCase
fixtures :mixins

def test_mixing_in_methods
ns = NestedSet.new
assert( ns.respond_to?( :all_children ) )
assert_equal( ns.scope_condition, "ROOT_ID IS NULL" )

check_method_mixins ns
end

def test_string_scope
ns = NestedSetWithStringScope.new

ns.root_id = 1
assert_equal( ns.scope_condition, "root_id = 1" )
ns.root_id = 42
assert_equal( ns.scope_condition, "root_id = 42" )
check_method_mixins ns
end

def test_symbol_scope
ns = NestedSetWithSymbolScope.new
ns.root_id = 1
assert_equal( ns.scope_condition, "root_id = 1" )
ns.root_id = 42
assert_equal( ns.scope_condition, "root_id = 42" )
check_method_mixins ns
end

def check_method_mixins( obj )
[:scope_condition, :left_col_name, :right_col_name, :parent_column, :root?, :add_child,
:children_count, :full_set, :all_children, :direct_children].each { |symbol| assert( obj.respond_to? symbol ) }
end

def set( id )
NestedSet.find( 3000 + id )
end

def test_adding_children
assert( set(1).unknown? )
assert( set(2).unknown? )
set(1).add_child set(2)

# Did we maintain adding the parent_ids?
assert( set(1).root? )
assert( set(2).child? )
assert( set(2).parent_id == set(1).id )

# Check boundies
assert_equal( set(1).lft, 1 )
assert_equal( set(2).lft, 2 )
assert_equal( set(2).rgt, 3 )
assert_equal( set(1).rgt, 4 )

# Check children cound
assert_equal( set(1).children_count, 1 )

set(1).add_child set(3)

#check boundries
assert_equal( set(1).lft, 1 )
assert_equal( set(2).lft, 2 )
assert_equal( set(2).rgt, 3 )
assert_equal( set(3).lft, 4 )
assert_equal( set(3).rgt, 5 )
assert_equal( set(1).rgt, 6 )

# How is the count looking?
assert_equal( set(1).children_count, 2 )

set(2).add_child set(4)

# boundries
assert_equal( set(1).lft, 1 )
assert_equal( set(2).lft, 2 )
assert_equal( set(4).lft, 3 )
assert_equal( set(4).rgt, 4 )
assert_equal( set(2).rgt, 5 )
assert_equal( set(3).lft, 6 )
assert_equal( set(3).rgt, 7 )
assert_equal( set(1).rgt, 8 )

# Children count
assert_equal( set(1).children_count, 3 )
assert_equal( set(2).children_count, 1 )
assert_equal( set(3).children_count, 0 )
assert_equal( set(4).children_count, 0 )

set(2).add_child set(5)
set(4).add_child set(6)

assert_equal( set(2).children_count, 3 )


# Children accessors
assert_equal( set(1).full_set.length, 6 )
assert_equal( set(2).full_set.length, 4 )
assert_equal( set(4).full_set.length, 2 )

assert_equal( set(1).all_children.length, 5 )
assert_equal( set(6).all_children.length, 0 )

assert_equal( set(1).direct_children.length, 2 )

end

def test_snipping_tree
big_tree = NestedSetWithStringScope.find( 4001 )

# Make sure we have the right one
assert_equal( 3, big_tree.direct_children.length )
assert_equal( 10, big_tree.full_set.length )

NestedSetWithStringScope.find( 4005 ).destroy

big_tree = NestedSetWithStringScope.find( 4001 )

assert_equal( 7, big_tree.full_set.length )
assert_equal( 2, big_tree.direct_children.length )

assert_equal( 1, NestedSetWithStringScope.find(4001).lft )
assert_equal( 2, NestedSetWithStringScope.find(4002).lft )
assert_equal( 3, NestedSetWithStringScope.find(4003).lft )
assert_equal( 4, NestedSetWithStringScope.find(4003).rgt )
assert_equal( 5, NestedSetWithStringScope.find(4004).lft )
assert_equal( 6, NestedSetWithStringScope.find(4004).rgt )
assert_equal( 7, NestedSetWithStringScope.find(4002).rgt )
assert_equal( 8, NestedSetWithStringScope.find(4008).lft )
assert_equal( 9, NestedSetWithStringScope.find(4009).lft )
assert_equal(10, NestedSetWithStringScope.find(4009).rgt )
assert_equal(11, NestedSetWithStringScope.find(4010).lft )
assert_equal(12, NestedSetWithStringScope.find(4010).rgt )
assert_equal(13, NestedSetWithStringScope.find(4008).rgt )
assert_equal(14, NestedSetWithStringScope.find(4001).rgt )
end

def test_deleting_root
NestedSetWithStringScope.find(4001).destroy

assert( NestedSetWithStringScope.find_all.length == 0 )
end

def test_common_usage
@set_1.add_child( @set_2 )
assert_equal( 1, @set_1.direct_children.length )

@set_2.add_child( @set_3 )
assert_equal( 1, @set_1.direct_children.length )

# Local cache is now out of date!
# Problem: the update_alls update all objects up the tree
@set_1.reload
assert_equal( 2, @set_1.all_children.length )

assert_equal( 1, @set_1.lft )
assert_equal( 2, @set_2.lft )
assert_equal( 3, @set_3.lft )
assert_equal( 4, @set_3.rgt )
assert_equal( 5, @set_2.rgt )
assert_equal( 6, @set_1.rgt )

assert( @set_1.root? )

begin
@set_4.add_child( @set_1 )
fail
rescue
end

assert_equal( 2, @set_1.all_children.length )

@set_1.add_child @set_4

assert_equal( 3, @set_1.all_children.length )


end
end

0 comments on commit 78d8503

Please sign in to comment.