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