annotate .svn/pristine/a7/a7d2f426cb2319278bd482b53b5c849fd8c928c2.svn-base @ 1298:4f746d8966dd redmine_2.3_integration

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