annotate lib/plugins/awesome_nested_set/test/awesome_nested_set_test.rb @ 1516:b450a9d58aed redmine-2.4

Update to Redmine SVN revision 13356 on 2.4-stable branch
author Chris Cannam
date Tue, 09 Sep 2014 09:28:31 +0100
parents 433d4f72a19b
children
rev   line source
Chris@1115 1 require File.dirname(__FILE__) + '/test_helper'
Chris@1115 2
Chris@1115 3 class Note < ActiveRecord::Base
Chris@1115 4 acts_as_nested_set :scope => [:notable_id, :notable_type]
Chris@1115 5 end
Chris@1115 6
Chris@1115 7 class AwesomeNestedSetTest < Test::Unit::TestCase
Chris@1115 8
Chris@1115 9 class Default < ActiveRecord::Base
Chris@1115 10 acts_as_nested_set
Chris@1115 11 self.table_name = 'categories'
Chris@1115 12 end
Chris@1115 13 class Scoped < ActiveRecord::Base
Chris@1115 14 acts_as_nested_set :scope => :organization
Chris@1115 15 self.table_name = 'categories'
Chris@1115 16 end
Chris@1115 17
Chris@1115 18 def test_left_column_default
Chris@1115 19 assert_equal 'lft', Default.acts_as_nested_set_options[:left_column]
Chris@1115 20 end
Chris@1115 21
Chris@1115 22 def test_right_column_default
Chris@1115 23 assert_equal 'rgt', Default.acts_as_nested_set_options[:right_column]
Chris@1115 24 end
Chris@1115 25
Chris@1115 26 def test_parent_column_default
Chris@1115 27 assert_equal 'parent_id', Default.acts_as_nested_set_options[:parent_column]
Chris@1115 28 end
Chris@1115 29
Chris@1115 30 def test_scope_default
Chris@1115 31 assert_nil Default.acts_as_nested_set_options[:scope]
Chris@1115 32 end
Chris@1115 33
Chris@1115 34 def test_left_column_name
Chris@1115 35 assert_equal 'lft', Default.left_column_name
Chris@1115 36 assert_equal 'lft', Default.new.left_column_name
Chris@1115 37 end
Chris@1115 38
Chris@1115 39 def test_right_column_name
Chris@1115 40 assert_equal 'rgt', Default.right_column_name
Chris@1115 41 assert_equal 'rgt', Default.new.right_column_name
Chris@1115 42 end
Chris@1115 43
Chris@1115 44 def test_parent_column_name
Chris@1115 45 assert_equal 'parent_id', Default.parent_column_name
Chris@1115 46 assert_equal 'parent_id', Default.new.parent_column_name
Chris@1115 47 end
Chris@1115 48
Chris@1115 49 def test_quoted_left_column_name
Chris@1115 50 quoted = Default.connection.quote_column_name('lft')
Chris@1115 51 assert_equal quoted, Default.quoted_left_column_name
Chris@1115 52 assert_equal quoted, Default.new.quoted_left_column_name
Chris@1115 53 end
Chris@1115 54
Chris@1115 55 def test_quoted_right_column_name
Chris@1115 56 quoted = Default.connection.quote_column_name('rgt')
Chris@1115 57 assert_equal quoted, Default.quoted_right_column_name
Chris@1115 58 assert_equal quoted, Default.new.quoted_right_column_name
Chris@1115 59 end
Chris@1115 60
Chris@1115 61 def test_left_column_protected_from_assignment
Chris@1115 62 assert_raises(ActiveRecord::ActiveRecordError) { Category.new.lft = 1 }
Chris@1115 63 end
Chris@1115 64
Chris@1115 65 def test_right_column_protected_from_assignment
Chris@1115 66 assert_raises(ActiveRecord::ActiveRecordError) { Category.new.rgt = 1 }
Chris@1115 67 end
Chris@1115 68
Chris@1115 69 def test_parent_column_protected_from_assignment
Chris@1115 70 assert_raises(ActiveRecord::ActiveRecordError) { Category.new.parent_id = 1 }
Chris@1115 71 end
Chris@1115 72
Chris@1115 73 def test_colums_protected_on_initialize
Chris@1115 74 c = Category.new(:lft => 1, :rgt => 2, :parent_id => 3)
Chris@1115 75 assert_nil c.lft
Chris@1115 76 assert_nil c.rgt
Chris@1115 77 assert_nil c.parent_id
Chris@1115 78 end
Chris@1115 79
Chris@1115 80 def test_scoped_appends_id
Chris@1115 81 assert_equal :organization_id, Scoped.acts_as_nested_set_options[:scope]
Chris@1115 82 end
Chris@1115 83
Chris@1115 84 def test_roots_class_method
Chris@1115 85 assert_equal Category.find_all_by_parent_id(nil), Category.roots
Chris@1115 86 end
Chris@1115 87
Chris@1115 88 def test_root_class_method
Chris@1115 89 assert_equal categories(:top_level), Category.root
Chris@1115 90 end
Chris@1115 91
Chris@1115 92 def test_root
Chris@1115 93 assert_equal categories(:top_level), categories(:child_3).root
Chris@1115 94 end
Chris@1115 95
Chris@1115 96 def test_root?
Chris@1115 97 assert categories(:top_level).root?
Chris@1115 98 assert categories(:top_level_2).root?
Chris@1115 99 end
Chris@1115 100
Chris@1115 101 def test_leaves_class_method
Chris@1115 102 assert_equal Category.find(:all, :conditions => "#{Category.right_column_name} - #{Category.left_column_name} = 1"), Category.leaves
Chris@1115 103 assert_equal Category.leaves.count, 4
Chris@1115 104 assert (Category.leaves.include? categories(:child_1))
Chris@1115 105 assert (Category.leaves.include? categories(:child_2_1))
Chris@1115 106 assert (Category.leaves.include? categories(:child_3))
Chris@1115 107 assert (Category.leaves.include? categories(:top_level_2))
Chris@1115 108 end
Chris@1115 109
Chris@1115 110 def test_leaf
Chris@1115 111 assert categories(:child_1).leaf?
Chris@1115 112 assert categories(:child_2_1).leaf?
Chris@1115 113 assert categories(:child_3).leaf?
Chris@1115 114 assert categories(:top_level_2).leaf?
Chris@1115 115
Chris@1115 116 assert !categories(:top_level).leaf?
Chris@1115 117 assert !categories(:child_2).leaf?
Chris@1115 118 end
Chris@1115 119
Chris@1115 120 def test_parent
Chris@1115 121 assert_equal categories(:child_2), categories(:child_2_1).parent
Chris@1115 122 end
Chris@1115 123
Chris@1115 124 def test_self_and_ancestors
Chris@1115 125 child = categories(:child_2_1)
Chris@1115 126 self_and_ancestors = [categories(:top_level), categories(:child_2), child]
Chris@1115 127 assert_equal self_and_ancestors, child.self_and_ancestors
Chris@1115 128 end
Chris@1115 129
Chris@1115 130 def test_ancestors
Chris@1115 131 child = categories(:child_2_1)
Chris@1115 132 ancestors = [categories(:top_level), categories(:child_2)]
Chris@1115 133 assert_equal ancestors, child.ancestors
Chris@1115 134 end
Chris@1115 135
Chris@1115 136 def test_self_and_siblings
Chris@1115 137 child = categories(:child_2)
Chris@1115 138 self_and_siblings = [categories(:child_1), child, categories(:child_3)]
Chris@1115 139 assert_equal self_and_siblings, child.self_and_siblings
Chris@1115 140 assert_nothing_raised do
Chris@1115 141 tops = [categories(:top_level), categories(:top_level_2)]
Chris@1115 142 assert_equal tops, categories(:top_level).self_and_siblings
Chris@1115 143 end
Chris@1115 144 end
Chris@1115 145
Chris@1115 146 def test_siblings
Chris@1115 147 child = categories(:child_2)
Chris@1115 148 siblings = [categories(:child_1), categories(:child_3)]
Chris@1115 149 assert_equal siblings, child.siblings
Chris@1115 150 end
Chris@1115 151
Chris@1115 152 def test_leaves
Chris@1115 153 leaves = [categories(:child_1), categories(:child_2_1), categories(:child_3), categories(:top_level_2)]
Chris@1115 154 assert categories(:top_level).leaves, leaves
Chris@1115 155 end
Chris@1115 156
Chris@1115 157 def test_level
Chris@1115 158 assert_equal 0, categories(:top_level).level
Chris@1115 159 assert_equal 1, categories(:child_1).level
Chris@1115 160 assert_equal 2, categories(:child_2_1).level
Chris@1115 161 end
Chris@1115 162
Chris@1115 163 def test_has_children?
Chris@1115 164 assert categories(:child_2_1).children.empty?
Chris@1115 165 assert !categories(:child_2).children.empty?
Chris@1115 166 assert !categories(:top_level).children.empty?
Chris@1115 167 end
Chris@1115 168
Chris@1115 169 def test_self_and_descendents
Chris@1115 170 parent = categories(:top_level)
Chris@1115 171 self_and_descendants = [parent, categories(:child_1), categories(:child_2),
Chris@1115 172 categories(:child_2_1), categories(:child_3)]
Chris@1115 173 assert_equal self_and_descendants, parent.self_and_descendants
Chris@1115 174 assert_equal self_and_descendants, parent.self_and_descendants.count
Chris@1115 175 end
Chris@1115 176
Chris@1115 177 def test_descendents
Chris@1115 178 lawyers = Category.create!(:name => "lawyers")
Chris@1115 179 us = Category.create!(:name => "United States")
Chris@1115 180 us.move_to_child_of(lawyers)
Chris@1115 181 patent = Category.create!(:name => "Patent Law")
Chris@1115 182 patent.move_to_child_of(us)
Chris@1115 183 lawyers.reload
Chris@1115 184
Chris@1115 185 assert_equal 1, lawyers.children.size
Chris@1115 186 assert_equal 1, us.children.size
Chris@1115 187 assert_equal 2, lawyers.descendants.size
Chris@1115 188 end
Chris@1115 189
Chris@1115 190 def test_self_and_descendents
Chris@1115 191 parent = categories(:top_level)
Chris@1115 192 descendants = [categories(:child_1), categories(:child_2),
Chris@1115 193 categories(:child_2_1), categories(:child_3)]
Chris@1115 194 assert_equal descendants, parent.descendants
Chris@1115 195 end
Chris@1115 196
Chris@1115 197 def test_children
Chris@1115 198 category = categories(:top_level)
Chris@1115 199 category.children.each {|c| assert_equal category.id, c.parent_id }
Chris@1115 200 end
Chris@1115 201
Chris@1115 202 def test_is_or_is_ancestor_of?
Chris@1115 203 assert categories(:top_level).is_or_is_ancestor_of?(categories(:child_1))
Chris@1115 204 assert categories(:top_level).is_or_is_ancestor_of?(categories(:child_2_1))
Chris@1115 205 assert categories(:child_2).is_or_is_ancestor_of?(categories(:child_2_1))
Chris@1115 206 assert !categories(:child_2_1).is_or_is_ancestor_of?(categories(:child_2))
Chris@1115 207 assert !categories(:child_1).is_or_is_ancestor_of?(categories(:child_2))
Chris@1115 208 assert categories(:child_1).is_or_is_ancestor_of?(categories(:child_1))
Chris@1115 209 end
Chris@1115 210
Chris@1115 211 def test_is_ancestor_of?
Chris@1115 212 assert categories(:top_level).is_ancestor_of?(categories(:child_1))
Chris@1115 213 assert categories(:top_level).is_ancestor_of?(categories(:child_2_1))
Chris@1115 214 assert categories(:child_2).is_ancestor_of?(categories(:child_2_1))
Chris@1115 215 assert !categories(:child_2_1).is_ancestor_of?(categories(:child_2))
Chris@1115 216 assert !categories(:child_1).is_ancestor_of?(categories(:child_2))
Chris@1115 217 assert !categories(:child_1).is_ancestor_of?(categories(:child_1))
Chris@1115 218 end
Chris@1115 219
Chris@1115 220 def test_is_or_is_ancestor_of_with_scope
Chris@1115 221 root = Scoped.root
Chris@1115 222 child = root.children.first
Chris@1115 223 assert root.is_or_is_ancestor_of?(child)
Chris@1115 224 child.update_attribute :organization_id, 'different'
Chris@1115 225 assert !root.is_or_is_ancestor_of?(child)
Chris@1115 226 end
Chris@1115 227
Chris@1115 228 def test_is_or_is_descendant_of?
Chris@1115 229 assert categories(:child_1).is_or_is_descendant_of?(categories(:top_level))
Chris@1115 230 assert categories(:child_2_1).is_or_is_descendant_of?(categories(:top_level))
Chris@1115 231 assert categories(:child_2_1).is_or_is_descendant_of?(categories(:child_2))
Chris@1115 232 assert !categories(:child_2).is_or_is_descendant_of?(categories(:child_2_1))
Chris@1115 233 assert !categories(:child_2).is_or_is_descendant_of?(categories(:child_1))
Chris@1115 234 assert categories(:child_1).is_or_is_descendant_of?(categories(:child_1))
Chris@1115 235 end
Chris@1115 236
Chris@1115 237 def test_is_descendant_of?
Chris@1115 238 assert categories(:child_1).is_descendant_of?(categories(:top_level))
Chris@1115 239 assert categories(:child_2_1).is_descendant_of?(categories(:top_level))
Chris@1115 240 assert categories(:child_2_1).is_descendant_of?(categories(:child_2))
Chris@1115 241 assert !categories(:child_2).is_descendant_of?(categories(:child_2_1))
Chris@1115 242 assert !categories(:child_2).is_descendant_of?(categories(:child_1))
Chris@1115 243 assert !categories(:child_1).is_descendant_of?(categories(:child_1))
Chris@1115 244 end
Chris@1115 245
Chris@1115 246 def test_is_or_is_descendant_of_with_scope
Chris@1115 247 root = Scoped.root
Chris@1115 248 child = root.children.first
Chris@1115 249 assert child.is_or_is_descendant_of?(root)
Chris@1115 250 child.update_attribute :organization_id, 'different'
Chris@1115 251 assert !child.is_or_is_descendant_of?(root)
Chris@1115 252 end
Chris@1115 253
Chris@1115 254 def test_same_scope?
Chris@1115 255 root = Scoped.root
Chris@1115 256 child = root.children.first
Chris@1115 257 assert child.same_scope?(root)
Chris@1115 258 child.update_attribute :organization_id, 'different'
Chris@1115 259 assert !child.same_scope?(root)
Chris@1115 260 end
Chris@1115 261
Chris@1115 262 def test_left_sibling
Chris@1115 263 assert_equal categories(:child_1), categories(:child_2).left_sibling
Chris@1115 264 assert_equal categories(:child_2), categories(:child_3).left_sibling
Chris@1115 265 end
Chris@1115 266
Chris@1115 267 def test_left_sibling_of_root
Chris@1115 268 assert_nil categories(:top_level).left_sibling
Chris@1115 269 end
Chris@1115 270
Chris@1115 271 def test_left_sibling_without_siblings
Chris@1115 272 assert_nil categories(:child_2_1).left_sibling
Chris@1115 273 end
Chris@1115 274
Chris@1115 275 def test_left_sibling_of_leftmost_node
Chris@1115 276 assert_nil categories(:child_1).left_sibling
Chris@1115 277 end
Chris@1115 278
Chris@1115 279 def test_right_sibling
Chris@1115 280 assert_equal categories(:child_3), categories(:child_2).right_sibling
Chris@1115 281 assert_equal categories(:child_2), categories(:child_1).right_sibling
Chris@1115 282 end
Chris@1115 283
Chris@1115 284 def test_right_sibling_of_root
Chris@1115 285 assert_equal categories(:top_level_2), categories(:top_level).right_sibling
Chris@1115 286 assert_nil categories(:top_level_2).right_sibling
Chris@1115 287 end
Chris@1115 288
Chris@1115 289 def test_right_sibling_without_siblings
Chris@1115 290 assert_nil categories(:child_2_1).right_sibling
Chris@1115 291 end
Chris@1115 292
Chris@1115 293 def test_right_sibling_of_rightmost_node
Chris@1115 294 assert_nil categories(:child_3).right_sibling
Chris@1115 295 end
Chris@1115 296
Chris@1115 297 def test_move_left
Chris@1115 298 categories(:child_2).move_left
Chris@1115 299 assert_nil categories(:child_2).left_sibling
Chris@1115 300 assert_equal categories(:child_1), categories(:child_2).right_sibling
Chris@1115 301 assert Category.valid?
Chris@1115 302 end
Chris@1115 303
Chris@1115 304 def test_move_right
Chris@1115 305 categories(:child_2).move_right
Chris@1115 306 assert_nil categories(:child_2).right_sibling
Chris@1115 307 assert_equal categories(:child_3), categories(:child_2).left_sibling
Chris@1115 308 assert Category.valid?
Chris@1115 309 end
Chris@1115 310
Chris@1115 311 def test_move_to_left_of
Chris@1115 312 categories(:child_3).move_to_left_of(categories(:child_1))
Chris@1115 313 assert_nil categories(:child_3).left_sibling
Chris@1115 314 assert_equal categories(:child_1), categories(:child_3).right_sibling
Chris@1115 315 assert Category.valid?
Chris@1115 316 end
Chris@1115 317
Chris@1115 318 def test_move_to_right_of
Chris@1115 319 categories(:child_1).move_to_right_of(categories(:child_3))
Chris@1115 320 assert_nil categories(:child_1).right_sibling
Chris@1115 321 assert_equal categories(:child_3), categories(:child_1).left_sibling
Chris@1115 322 assert Category.valid?
Chris@1115 323 end
Chris@1115 324
Chris@1115 325 def test_move_to_root
Chris@1115 326 categories(:child_2).move_to_root
Chris@1115 327 assert_nil categories(:child_2).parent
Chris@1115 328 assert_equal 0, categories(:child_2).level
Chris@1115 329 assert_equal 1, categories(:child_2_1).level
Chris@1115 330 assert_equal 1, categories(:child_2).left
Chris@1115 331 assert_equal 4, categories(:child_2).right
Chris@1115 332 assert Category.valid?
Chris@1115 333 end
Chris@1115 334
Chris@1115 335 def test_move_to_child_of
Chris@1115 336 categories(:child_1).move_to_child_of(categories(:child_3))
Chris@1115 337 assert_equal categories(:child_3).id, categories(:child_1).parent_id
Chris@1115 338 assert Category.valid?
Chris@1115 339 end
Chris@1115 340
Chris@1115 341 def test_move_to_child_of_appends_to_end
Chris@1115 342 child = Category.create! :name => 'New Child'
Chris@1115 343 child.move_to_child_of categories(:top_level)
Chris@1115 344 assert_equal child, categories(:top_level).children.last
Chris@1115 345 end
Chris@1115 346
Chris@1115 347 def test_subtree_move_to_child_of
Chris@1115 348 assert_equal 4, categories(:child_2).left
Chris@1115 349 assert_equal 7, categories(:child_2).right
Chris@1115 350
Chris@1115 351 assert_equal 2, categories(:child_1).left
Chris@1115 352 assert_equal 3, categories(:child_1).right
Chris@1115 353
Chris@1115 354 categories(:child_2).move_to_child_of(categories(:child_1))
Chris@1115 355 assert Category.valid?
Chris@1115 356 assert_equal categories(:child_1).id, categories(:child_2).parent_id
Chris@1115 357
Chris@1115 358 assert_equal 3, categories(:child_2).left
Chris@1115 359 assert_equal 6, categories(:child_2).right
Chris@1115 360 assert_equal 2, categories(:child_1).left
Chris@1115 361 assert_equal 7, categories(:child_1).right
Chris@1115 362 end
Chris@1115 363
Chris@1115 364 def test_slightly_difficult_move_to_child_of
Chris@1115 365 assert_equal 11, categories(:top_level_2).left
Chris@1115 366 assert_equal 12, categories(:top_level_2).right
Chris@1115 367
Chris@1115 368 # create a new top-level node and move single-node top-level tree inside it.
Chris@1115 369 new_top = Category.create(:name => 'New Top')
Chris@1115 370 assert_equal 13, new_top.left
Chris@1115 371 assert_equal 14, new_top.right
Chris@1115 372
Chris@1115 373 categories(:top_level_2).move_to_child_of(new_top)
Chris@1115 374
Chris@1115 375 assert Category.valid?
Chris@1115 376 assert_equal new_top.id, categories(:top_level_2).parent_id
Chris@1115 377
Chris@1115 378 assert_equal 12, categories(:top_level_2).left
Chris@1115 379 assert_equal 13, categories(:top_level_2).right
Chris@1115 380 assert_equal 11, new_top.left
Chris@1115 381 assert_equal 14, new_top.right
Chris@1115 382 end
Chris@1115 383
Chris@1115 384 def test_difficult_move_to_child_of
Chris@1115 385 assert_equal 1, categories(:top_level).left
Chris@1115 386 assert_equal 10, categories(:top_level).right
Chris@1115 387 assert_equal 5, categories(:child_2_1).left
Chris@1115 388 assert_equal 6, categories(:child_2_1).right
Chris@1115 389
Chris@1115 390 # create a new top-level node and move an entire top-level tree inside it.
Chris@1115 391 new_top = Category.create(:name => 'New Top')
Chris@1115 392 categories(:top_level).move_to_child_of(new_top)
Chris@1115 393 categories(:child_2_1).reload
Chris@1115 394 assert Category.valid?
Chris@1115 395 assert_equal new_top.id, categories(:top_level).parent_id
Chris@1115 396
Chris@1115 397 assert_equal 4, categories(:top_level).left
Chris@1115 398 assert_equal 13, categories(:top_level).right
Chris@1115 399 assert_equal 8, categories(:child_2_1).left
Chris@1115 400 assert_equal 9, categories(:child_2_1).right
Chris@1115 401 end
Chris@1115 402
Chris@1115 403 #rebuild swaps the position of the 2 children when added using move_to_child twice onto same parent
Chris@1115 404 def test_move_to_child_more_than_once_per_parent_rebuild
Chris@1115 405 root1 = Category.create(:name => 'Root1')
Chris@1115 406 root2 = Category.create(:name => 'Root2')
Chris@1115 407 root3 = Category.create(:name => 'Root3')
Chris@1115 408
Chris@1115 409 root2.move_to_child_of root1
Chris@1115 410 root3.move_to_child_of root1
Chris@1115 411
Chris@1115 412 output = Category.roots.last.to_text
Chris@1115 413 Category.update_all('lft = null, rgt = null')
Chris@1115 414 Category.rebuild!
Chris@1115 415
Chris@1115 416 assert_equal Category.roots.last.to_text, output
Chris@1115 417 end
Chris@1115 418
Chris@1115 419 # doing move_to_child twice onto same parent from the furthest right first
Chris@1115 420 def test_move_to_child_more_than_once_per_parent_outside_in
Chris@1115 421 node1 = Category.create(:name => 'Node-1')
Chris@1115 422 node2 = Category.create(:name => 'Node-2')
Chris@1115 423 node3 = Category.create(:name => 'Node-3')
Chris@1115 424
Chris@1115 425 node2.move_to_child_of node1
Chris@1115 426 node3.move_to_child_of node1
Chris@1115 427
Chris@1115 428 output = Category.roots.last.to_text
Chris@1115 429 Category.update_all('lft = null, rgt = null')
Chris@1115 430 Category.rebuild!
Chris@1115 431
Chris@1115 432 assert_equal Category.roots.last.to_text, output
Chris@1115 433 end
Chris@1115 434
Chris@1115 435
Chris@1115 436 def test_valid_with_null_lefts
Chris@1115 437 assert Category.valid?
Chris@1115 438 Category.update_all('lft = null')
Chris@1115 439 assert !Category.valid?
Chris@1115 440 end
Chris@1115 441
Chris@1115 442 def test_valid_with_null_rights
Chris@1115 443 assert Category.valid?
Chris@1115 444 Category.update_all('rgt = null')
Chris@1115 445 assert !Category.valid?
Chris@1115 446 end
Chris@1115 447
Chris@1115 448 def test_valid_with_missing_intermediate_node
Chris@1115 449 # Even though child_2_1 will still exist, it is a sign of a sloppy delete, not an invalid tree.
Chris@1115 450 assert Category.valid?
Chris@1115 451 Category.delete(categories(:child_2).id)
Chris@1115 452 assert Category.valid?
Chris@1115 453 end
Chris@1115 454
Chris@1115 455 def test_valid_with_overlapping_and_rights
Chris@1115 456 assert Category.valid?
Chris@1115 457 categories(:top_level_2)['lft'] = 0
Chris@1115 458 categories(:top_level_2).save
Chris@1115 459 assert !Category.valid?
Chris@1115 460 end
Chris@1115 461
Chris@1115 462 def test_rebuild
Chris@1115 463 assert Category.valid?
Chris@1115 464 before_text = Category.root.to_text
Chris@1115 465 Category.update_all('lft = null, rgt = null')
Chris@1115 466 Category.rebuild!
Chris@1115 467 assert Category.valid?
Chris@1115 468 assert_equal before_text, Category.root.to_text
Chris@1115 469 end
Chris@1115 470
Chris@1115 471 def test_move_possible_for_sibling
Chris@1115 472 assert categories(:child_2).move_possible?(categories(:child_1))
Chris@1115 473 end
Chris@1115 474
Chris@1115 475 def test_move_not_possible_to_self
Chris@1115 476 assert !categories(:top_level).move_possible?(categories(:top_level))
Chris@1115 477 end
Chris@1115 478
Chris@1115 479 def test_move_not_possible_to_parent
Chris@1115 480 categories(:top_level).descendants.each do |descendant|
Chris@1115 481 assert !categories(:top_level).move_possible?(descendant)
Chris@1115 482 assert descendant.move_possible?(categories(:top_level))
Chris@1115 483 end
Chris@1115 484 end
Chris@1115 485
Chris@1115 486 def test_is_or_is_ancestor_of?
Chris@1115 487 [:child_1, :child_2, :child_2_1, :child_3].each do |c|
Chris@1115 488 assert categories(:top_level).is_or_is_ancestor_of?(categories(c))
Chris@1115 489 end
Chris@1115 490 assert !categories(:top_level).is_or_is_ancestor_of?(categories(:top_level_2))
Chris@1115 491 end
Chris@1115 492
Chris@1115 493 def test_left_and_rights_valid_with_blank_left
Chris@1115 494 assert Category.left_and_rights_valid?
Chris@1115 495 categories(:child_2)[:lft] = nil
Chris@1115 496 categories(:child_2).save(false)
Chris@1115 497 assert !Category.left_and_rights_valid?
Chris@1115 498 end
Chris@1115 499
Chris@1115 500 def test_left_and_rights_valid_with_blank_right
Chris@1115 501 assert Category.left_and_rights_valid?
Chris@1115 502 categories(:child_2)[:rgt] = nil
Chris@1115 503 categories(:child_2).save(false)
Chris@1115 504 assert !Category.left_and_rights_valid?
Chris@1115 505 end
Chris@1115 506
Chris@1115 507 def test_left_and_rights_valid_with_equal
Chris@1115 508 assert Category.left_and_rights_valid?
Chris@1115 509 categories(:top_level_2)[:lft] = categories(:top_level_2)[:rgt]
Chris@1115 510 categories(:top_level_2).save(false)
Chris@1115 511 assert !Category.left_and_rights_valid?
Chris@1115 512 end
Chris@1115 513
Chris@1115 514 def test_left_and_rights_valid_with_left_equal_to_parent
Chris@1115 515 assert Category.left_and_rights_valid?
Chris@1115 516 categories(:child_2)[:lft] = categories(:top_level)[:lft]
Chris@1115 517 categories(:child_2).save(false)
Chris@1115 518 assert !Category.left_and_rights_valid?
Chris@1115 519 end
Chris@1115 520
Chris@1115 521 def test_left_and_rights_valid_with_right_equal_to_parent
Chris@1115 522 assert Category.left_and_rights_valid?
Chris@1115 523 categories(:child_2)[:rgt] = categories(:top_level)[:rgt]
Chris@1115 524 categories(:child_2).save(false)
Chris@1115 525 assert !Category.left_and_rights_valid?
Chris@1115 526 end
Chris@1115 527
Chris@1115 528 def test_moving_dirty_objects_doesnt_invalidate_tree
Chris@1115 529 r1 = Category.create
Chris@1115 530 r2 = Category.create
Chris@1115 531 r3 = Category.create
Chris@1115 532 r4 = Category.create
Chris@1115 533 nodes = [r1, r2, r3, r4]
Chris@1115 534
Chris@1115 535 r2.move_to_child_of(r1)
Chris@1115 536 assert Category.valid?
Chris@1115 537
Chris@1115 538 r3.move_to_child_of(r1)
Chris@1115 539 assert Category.valid?
Chris@1115 540
Chris@1115 541 r4.move_to_child_of(r2)
Chris@1115 542 assert Category.valid?
Chris@1115 543 end
Chris@1115 544
Chris@1115 545 def test_multi_scoped_no_duplicates_for_columns?
Chris@1115 546 assert_nothing_raised do
Chris@1115 547 Note.no_duplicates_for_columns?
Chris@1115 548 end
Chris@1115 549 end
Chris@1115 550
Chris@1115 551 def test_multi_scoped_all_roots_valid?
Chris@1115 552 assert_nothing_raised do
Chris@1115 553 Note.all_roots_valid?
Chris@1115 554 end
Chris@1115 555 end
Chris@1115 556
Chris@1115 557 def test_multi_scoped
Chris@1115 558 note1 = Note.create!(:body => "A", :notable_id => 2, :notable_type => 'Category')
Chris@1115 559 note2 = Note.create!(:body => "B", :notable_id => 2, :notable_type => 'Category')
Chris@1115 560 note3 = Note.create!(:body => "C", :notable_id => 2, :notable_type => 'Default')
Chris@1115 561
Chris@1115 562 assert_equal [note1, note2], note1.self_and_siblings
Chris@1115 563 assert_equal [note3], note3.self_and_siblings
Chris@1115 564 end
Chris@1115 565
Chris@1115 566 def test_multi_scoped_rebuild
Chris@1115 567 root = Note.create!(:body => "A", :notable_id => 3, :notable_type => 'Category')
Chris@1115 568 child1 = Note.create!(:body => "B", :notable_id => 3, :notable_type => 'Category')
Chris@1115 569 child2 = Note.create!(:body => "C", :notable_id => 3, :notable_type => 'Category')
Chris@1115 570
Chris@1115 571 child1.move_to_child_of root
Chris@1115 572 child2.move_to_child_of root
Chris@1115 573
Chris@1115 574 Note.update_all('lft = null, rgt = null')
Chris@1115 575 Note.rebuild!
Chris@1115 576
Chris@1115 577 assert_equal Note.roots.find_by_body('A'), root
Chris@1115 578 assert_equal [child1, child2], Note.roots.find_by_body('A').children
Chris@1115 579 end
Chris@1115 580
Chris@1115 581 def test_same_scope_with_multi_scopes
Chris@1115 582 assert_nothing_raised do
Chris@1115 583 notes(:scope1).same_scope?(notes(:child_1))
Chris@1115 584 end
Chris@1115 585 assert notes(:scope1).same_scope?(notes(:child_1))
Chris@1115 586 assert notes(:child_1).same_scope?(notes(:scope1))
Chris@1115 587 assert !notes(:scope1).same_scope?(notes(:scope2))
Chris@1115 588 end
Chris@1115 589
Chris@1115 590 def test_quoting_of_multi_scope_column_names
Chris@1115 591 assert_equal ["\"notable_id\"", "\"notable_type\""], Note.quoted_scope_column_names
Chris@1115 592 end
Chris@1115 593
Chris@1115 594 def test_equal_in_same_scope
Chris@1115 595 assert_equal notes(:scope1), notes(:scope1)
Chris@1115 596 assert_not_equal notes(:scope1), notes(:child_1)
Chris@1115 597 end
Chris@1115 598
Chris@1115 599 def test_equal_in_different_scopes
Chris@1115 600 assert_not_equal notes(:scope1), notes(:scope2)
Chris@1115 601 end
Chris@1115 602
Chris@1115 603 end