acts_as_tree_test.rb
上传用户:netsea168
上传日期:2022-07-22
资源大小:4652k
文件大小:6k
源码类别:

Ajax

开发平台:

Others

  1. require 'test/unit'
  2. require 'rubygems'
  3. require 'active_record'
  4. $:.unshift File.dirname(__FILE__) + '/../lib'
  5. require File.dirname(__FILE__) + '/../init'
  6. class Test::Unit::TestCase
  7.   def assert_queries(num = 1)
  8.     $query_count = 0
  9.     yield
  10.   ensure
  11.     assert_equal num, $query_count, "#{$query_count} instead of #{num} queries were executed."
  12.   end
  13.   def assert_no_queries(&block)
  14.     assert_queries(0, &block)
  15.   end
  16. end
  17. ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :dbfile => ":memory:")
  18. # AR keeps printing annoying schema statements
  19. $stdout = StringIO.new
  20. def setup_db
  21.   ActiveRecord::Base.logger
  22.   ActiveRecord::Schema.define(:version => 1) do
  23.     create_table :mixins do |t|
  24.       t.column :type, :string
  25.       t.column :parent_id, :integer
  26.     end
  27.   end
  28. end
  29. def teardown_db
  30.   ActiveRecord::Base.connection.tables.each do |table|
  31.     ActiveRecord::Base.connection.drop_table(table)
  32.   end
  33. end
  34. class Mixin < ActiveRecord::Base
  35. end
  36. class TreeMixin < Mixin 
  37.   acts_as_tree :foreign_key => "parent_id", :order => "id"
  38. end
  39. class TreeMixinWithoutOrder < Mixin
  40.   acts_as_tree :foreign_key => "parent_id"
  41. end
  42. class RecursivelyCascadedTreeMixin < Mixin
  43.   acts_as_tree :foreign_key => "parent_id"
  44.   has_one :first_child, :class_name => 'RecursivelyCascadedTreeMixin', :foreign_key => :parent_id
  45. end
  46. class TreeTest < Test::Unit::TestCase
  47.   
  48.   def setup
  49.     setup_db
  50.     @root1 = TreeMixin.create!
  51.     @root_child1 = TreeMixin.create! :parent_id => @root1.id
  52.     @child1_child = TreeMixin.create! :parent_id => @root_child1.id
  53.     @root_child2 = TreeMixin.create! :parent_id => @root1.id
  54.     @root2 = TreeMixin.create!
  55.     @root3 = TreeMixin.create!
  56.   end
  57.   def teardown
  58.     teardown_db
  59.   end
  60.   def test_children
  61.     assert_equal @root1.children, [@root_child1, @root_child2]
  62.     assert_equal @root_child1.children, [@child1_child]
  63.     assert_equal @child1_child.children, []
  64.     assert_equal @root_child2.children, []
  65.   end
  66.   def test_parent
  67.     assert_equal @root_child1.parent, @root1
  68.     assert_equal @root_child1.parent, @root_child2.parent
  69.     assert_nil @root1.parent
  70.   end
  71.   def test_delete
  72.     assert_equal 6, TreeMixin.count
  73.     @root1.destroy
  74.     assert_equal 2, TreeMixin.count
  75.     @root2.destroy
  76.     @root3.destroy
  77.     assert_equal 0, TreeMixin.count
  78.   end
  79.   def test_insert
  80.     @extra = @root1.children.create
  81.     assert @extra
  82.     assert_equal @extra.parent, @root1
  83.     assert_equal 3, @root1.children.size
  84.     assert @root1.children.include?(@extra)
  85.     assert @root1.children.include?(@root_child1)
  86.     assert @root1.children.include?(@root_child2)
  87.   end
  88.   def test_ancestors
  89.     assert_equal [], @root1.ancestors
  90.     assert_equal [@root1], @root_child1.ancestors
  91.     assert_equal [@root_child1, @root1], @child1_child.ancestors
  92.     assert_equal [@root1], @root_child2.ancestors
  93.     assert_equal [], @root2.ancestors
  94.     assert_equal [], @root3.ancestors
  95.   end
  96.   def test_root
  97.     assert_equal @root1, TreeMixin.root
  98.     assert_equal @root1, @root1.root
  99.     assert_equal @root1, @root_child1.root
  100.     assert_equal @root1, @child1_child.root
  101.     assert_equal @root1, @root_child2.root
  102.     assert_equal @root2, @root2.root
  103.     assert_equal @root3, @root3.root
  104.   end
  105.   def test_roots
  106.     assert_equal [@root1, @root2, @root3], TreeMixin.roots
  107.   end
  108.   def test_siblings
  109.     assert_equal [@root2, @root3], @root1.siblings
  110.     assert_equal [@root_child2], @root_child1.siblings
  111.     assert_equal [], @child1_child.siblings
  112.     assert_equal [@root_child1], @root_child2.siblings
  113.     assert_equal [@root1, @root3], @root2.siblings
  114.     assert_equal [@root1, @root2], @root3.siblings
  115.   end
  116.   def test_self_and_siblings
  117.     assert_equal [@root1, @root2, @root3], @root1.self_and_siblings
  118.     assert_equal [@root_child1, @root_child2], @root_child1.self_and_siblings
  119.     assert_equal [@child1_child], @child1_child.self_and_siblings
  120.     assert_equal [@root_child1, @root_child2], @root_child2.self_and_siblings
  121.     assert_equal [@root1, @root2, @root3], @root2.self_and_siblings
  122.     assert_equal [@root1, @root2, @root3], @root3.self_and_siblings
  123.   end           
  124. end
  125. class TreeTestWithEagerLoading < Test::Unit::TestCase
  126.   
  127.   def setup 
  128.     teardown_db
  129.     setup_db
  130.     @root1 = TreeMixin.create!
  131.     @root_child1 = TreeMixin.create! :parent_id => @root1.id
  132.     @child1_child = TreeMixin.create! :parent_id => @root_child1.id
  133.     @root_child2 = TreeMixin.create! :parent_id => @root1.id
  134.     @root2 = TreeMixin.create!
  135.     @root3 = TreeMixin.create!
  136.     
  137.     @rc1 = RecursivelyCascadedTreeMixin.create!
  138.     @rc2 = RecursivelyCascadedTreeMixin.create! :parent_id => @rc1.id 
  139.     @rc3 = RecursivelyCascadedTreeMixin.create! :parent_id => @rc2.id
  140.     @rc4 = RecursivelyCascadedTreeMixin.create! :parent_id => @rc3.id
  141.   end
  142.   def teardown
  143.     teardown_db
  144.   end
  145.     
  146.   def test_eager_association_loading
  147.     roots = TreeMixin.find(:all, :include => :children, :conditions => "mixins.parent_id IS NULL", :order => "mixins.id")
  148.     assert_equal [@root1, @root2, @root3], roots                     
  149.     assert_no_queries do
  150.       assert_equal 2, roots[0].children.size
  151.       assert_equal 0, roots[1].children.size
  152.       assert_equal 0, roots[2].children.size
  153.     end   
  154.   end
  155.   
  156.   def test_eager_association_loading_with_recursive_cascading_three_levels_has_many
  157.     root_node = RecursivelyCascadedTreeMixin.find(:first, :include => { :children => { :children => :children } }, :order => 'mixins.id')
  158.     assert_equal @rc4, assert_no_queries { root_node.children.first.children.first.children.first }
  159.   end
  160.   
  161.   def test_eager_association_loading_with_recursive_cascading_three_levels_has_one
  162.     root_node = RecursivelyCascadedTreeMixin.find(:first, :include => { :first_child => { :first_child => :first_child } }, :order => 'mixins.id')
  163.     assert_equal @rc4, assert_no_queries { root_node.first_child.first_child.first_child }
  164.   end
  165.   
  166.   def test_eager_association_loading_with_recursive_cascading_three_levels_belongs_to
  167.     leaf_node = RecursivelyCascadedTreeMixin.find(:first, :include => { :parent => { :parent => :parent } }, :order => 'mixins.id DESC')
  168.     assert_equal @rc1, assert_no_queries { leaf_node.parent.parent.parent }
  169.   end 
  170. end
  171. class TreeTestWithoutOrder < Test::Unit::TestCase
  172.   
  173.   def setup                               
  174.     setup_db
  175.     @root1 = TreeMixinWithoutOrder.create!
  176.     @root2 = TreeMixinWithoutOrder.create!
  177.   end
  178.   def teardown
  179.     teardown_db
  180.   end
  181.   def test_root
  182.     assert [@root1, @root2].include?(TreeMixinWithoutOrder.root)
  183.   end
  184.   
  185.   def test_roots
  186.     assert_equal [], [@root1, @root2] - TreeMixinWithoutOrder.roots
  187.   end
  188. end