1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Added acts_as_nested_set #1000 [wschenk]

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@1186 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
David Heinemeier Hansson 2005-04-17 09:59:52 +00:00
parent 339f4956b3
commit 78d8503a94

View file

@ -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