aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Heinemeier Hansson <david@loudthinking.com>2005-04-17 09:59:52 +0000
committerDavid Heinemeier Hansson <david@loudthinking.com>2005-04-17 09:59:52 +0000
commit78d8503a94f043a932fea7321dbae262eb4a5c8b (patch)
tree8e357a23c6f3605a93db89de173b429093e908d9
parent339f4956b3adb8a9d43a024db69f4bc28e09e235 (diff)
downloadrails-78d8503a94f043a932fea7321dbae262eb4a5c8b.tar.gz
rails-78d8503a94f043a932fea7321dbae262eb4a5c8b.tar.bz2
rails-78d8503a94f043a932fea7321dbae262eb4a5c8b.zip
Added acts_as_nested_set #1000 [wschenk]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@1186 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
-rw-r--r--activerecord/test/mixin_nested_set_test.rb184
1 files changed, 184 insertions, 0 deletions
diff --git a/activerecord/test/mixin_nested_set_test.rb b/activerecord/test/mixin_nested_set_test.rb
new file mode 100644
index 0000000000..90eb0fbcd2
--- /dev/null
+++ b/activerecord/test/mixin_nested_set_test.rb
@@ -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 \ No newline at end of file