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:
parent
339f4956b3
commit
78d8503a94
1 changed files with 184 additions and 0 deletions
184
activerecord/test/mixin_nested_set_test.rb
Normal file
184
activerecord/test/mixin_nested_set_test.rb
Normal 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
|
Loading…
Reference in a new issue