annotate .svn/pristine/26/26f2b8dec33ec3e8eb2d5b55094ac09d33160993.svn-base @ 1628:9c5f8e24dadc live tip

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