annotate .svn/pristine/19/199fc9952c2ae576aa633fca73f2902df9432ab7.svn-base @ 1327:287f201c2802 redmine-2.2-integration

Add italic
author Chris Cannam <chris.cannam@soundsoftware.ac.uk>
date Wed, 19 Jun 2013 20:56:22 +0100
parents cbb26bc654de
children
rev   line source
Chris@909 1 require 'test/unit'
Chris@909 2
Chris@909 3 require 'rubygems'
Chris@909 4 gem 'activerecord', '>= 1.15.4.7794'
Chris@909 5 require 'active_record'
Chris@909 6
Chris@909 7 require "#{File.dirname(__FILE__)}/../init"
Chris@909 8
Chris@909 9 ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :dbfile => ":memory:")
Chris@909 10
Chris@909 11 def setup_db
Chris@909 12 ActiveRecord::Schema.define(:version => 1) do
Chris@909 13 create_table :mixins do |t|
Chris@909 14 t.column :pos, :integer
Chris@909 15 t.column :parent_id, :integer
Chris@909 16 t.column :created_at, :datetime
Chris@909 17 t.column :updated_at, :datetime
Chris@909 18 end
Chris@909 19 end
Chris@909 20 end
Chris@909 21
Chris@909 22 def teardown_db
Chris@909 23 ActiveRecord::Base.connection.tables.each do |table|
Chris@909 24 ActiveRecord::Base.connection.drop_table(table)
Chris@909 25 end
Chris@909 26 end
Chris@909 27
Chris@909 28 class Mixin < ActiveRecord::Base
Chris@909 29 end
Chris@909 30
Chris@909 31 class ListMixin < Mixin
Chris@909 32 acts_as_list :column => "pos", :scope => :parent
Chris@909 33
Chris@909 34 def self.table_name() "mixins" end
Chris@909 35 end
Chris@909 36
Chris@909 37 class ListMixinSub1 < ListMixin
Chris@909 38 end
Chris@909 39
Chris@909 40 class ListMixinSub2 < ListMixin
Chris@909 41 end
Chris@909 42
Chris@909 43 class ListWithStringScopeMixin < ActiveRecord::Base
Chris@909 44 acts_as_list :column => "pos", :scope => 'parent_id = #{parent_id}'
Chris@909 45
Chris@909 46 def self.table_name() "mixins" end
Chris@909 47 end
Chris@909 48
Chris@909 49
Chris@909 50 class ListTest < Test::Unit::TestCase
Chris@909 51
Chris@909 52 def setup
Chris@909 53 setup_db
Chris@909 54 (1..4).each { |counter| ListMixin.create! :pos => counter, :parent_id => 5 }
Chris@909 55 end
Chris@909 56
Chris@909 57 def teardown
Chris@909 58 teardown_db
Chris@909 59 end
Chris@909 60
Chris@909 61 def test_reordering
Chris@909 62 assert_equal [1, 2, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
Chris@909 63
Chris@909 64 ListMixin.find(2).move_lower
Chris@909 65 assert_equal [1, 3, 2, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
Chris@909 66
Chris@909 67 ListMixin.find(2).move_higher
Chris@909 68 assert_equal [1, 2, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
Chris@909 69
Chris@909 70 ListMixin.find(1).move_to_bottom
Chris@909 71 assert_equal [2, 3, 4, 1], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
Chris@909 72
Chris@909 73 ListMixin.find(1).move_to_top
Chris@909 74 assert_equal [1, 2, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
Chris@909 75
Chris@909 76 ListMixin.find(2).move_to_bottom
Chris@909 77 assert_equal [1, 3, 4, 2], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
Chris@909 78
Chris@909 79 ListMixin.find(4).move_to_top
Chris@909 80 assert_equal [4, 1, 3, 2], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
Chris@909 81 end
Chris@909 82
Chris@909 83 def test_move_to_bottom_with_next_to_last_item
Chris@909 84 assert_equal [1, 2, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
Chris@909 85 ListMixin.find(3).move_to_bottom
Chris@909 86 assert_equal [1, 2, 4, 3], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
Chris@909 87 end
Chris@909 88
Chris@909 89 def test_next_prev
Chris@909 90 assert_equal ListMixin.find(2), ListMixin.find(1).lower_item
Chris@909 91 assert_nil ListMixin.find(1).higher_item
Chris@909 92 assert_equal ListMixin.find(3), ListMixin.find(4).higher_item
Chris@909 93 assert_nil ListMixin.find(4).lower_item
Chris@909 94 end
Chris@909 95
Chris@909 96 def test_injection
Chris@909 97 item = ListMixin.new(:parent_id => 1)
Chris@909 98 assert_equal "parent_id = 1", item.scope_condition
Chris@909 99 assert_equal "pos", item.position_column
Chris@909 100 end
Chris@909 101
Chris@909 102 def test_insert
Chris@909 103 new = ListMixin.create(:parent_id => 20)
Chris@909 104 assert_equal 1, new.pos
Chris@909 105 assert new.first?
Chris@909 106 assert new.last?
Chris@909 107
Chris@909 108 new = ListMixin.create(:parent_id => 20)
Chris@909 109 assert_equal 2, new.pos
Chris@909 110 assert !new.first?
Chris@909 111 assert new.last?
Chris@909 112
Chris@909 113 new = ListMixin.create(:parent_id => 20)
Chris@909 114 assert_equal 3, new.pos
Chris@909 115 assert !new.first?
Chris@909 116 assert new.last?
Chris@909 117
Chris@909 118 new = ListMixin.create(:parent_id => 0)
Chris@909 119 assert_equal 1, new.pos
Chris@909 120 assert new.first?
Chris@909 121 assert new.last?
Chris@909 122 end
Chris@909 123
Chris@909 124 def test_insert_at
Chris@909 125 new = ListMixin.create(:parent_id => 20)
Chris@909 126 assert_equal 1, new.pos
Chris@909 127
Chris@909 128 new = ListMixin.create(:parent_id => 20)
Chris@909 129 assert_equal 2, new.pos
Chris@909 130
Chris@909 131 new = ListMixin.create(:parent_id => 20)
Chris@909 132 assert_equal 3, new.pos
Chris@909 133
Chris@909 134 new4 = ListMixin.create(:parent_id => 20)
Chris@909 135 assert_equal 4, new4.pos
Chris@909 136
Chris@909 137 new4.insert_at(3)
Chris@909 138 assert_equal 3, new4.pos
Chris@909 139
Chris@909 140 new.reload
Chris@909 141 assert_equal 4, new.pos
Chris@909 142
Chris@909 143 new.insert_at(2)
Chris@909 144 assert_equal 2, new.pos
Chris@909 145
Chris@909 146 new4.reload
Chris@909 147 assert_equal 4, new4.pos
Chris@909 148
Chris@909 149 new5 = ListMixin.create(:parent_id => 20)
Chris@909 150 assert_equal 5, new5.pos
Chris@909 151
Chris@909 152 new5.insert_at(1)
Chris@909 153 assert_equal 1, new5.pos
Chris@909 154
Chris@909 155 new4.reload
Chris@909 156 assert_equal 5, new4.pos
Chris@909 157 end
Chris@909 158
Chris@909 159 def test_delete_middle
Chris@909 160 assert_equal [1, 2, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
Chris@909 161
Chris@909 162 ListMixin.find(2).destroy
Chris@909 163
Chris@909 164 assert_equal [1, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
Chris@909 165
Chris@909 166 assert_equal 1, ListMixin.find(1).pos
Chris@909 167 assert_equal 2, ListMixin.find(3).pos
Chris@909 168 assert_equal 3, ListMixin.find(4).pos
Chris@909 169
Chris@909 170 ListMixin.find(1).destroy
Chris@909 171
Chris@909 172 assert_equal [3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
Chris@909 173
Chris@909 174 assert_equal 1, ListMixin.find(3).pos
Chris@909 175 assert_equal 2, ListMixin.find(4).pos
Chris@909 176 end
Chris@909 177
Chris@909 178 def test_with_string_based_scope
Chris@909 179 new = ListWithStringScopeMixin.create(:parent_id => 500)
Chris@909 180 assert_equal 1, new.pos
Chris@909 181 assert new.first?
Chris@909 182 assert new.last?
Chris@909 183 end
Chris@909 184
Chris@909 185 def test_nil_scope
Chris@909 186 new1, new2, new3 = ListMixin.create, ListMixin.create, ListMixin.create
Chris@909 187 new2.move_higher
Chris@909 188 assert_equal [new2, new1, new3], ListMixin.find(:all, :conditions => 'parent_id IS NULL', :order => 'pos')
Chris@909 189 end
Chris@909 190
Chris@909 191
Chris@909 192 def test_remove_from_list_should_then_fail_in_list?
Chris@909 193 assert_equal true, ListMixin.find(1).in_list?
Chris@909 194 ListMixin.find(1).remove_from_list
Chris@909 195 assert_equal false, ListMixin.find(1).in_list?
Chris@909 196 end
Chris@909 197
Chris@909 198 def test_remove_from_list_should_set_position_to_nil
Chris@909 199 assert_equal [1, 2, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
Chris@909 200
Chris@909 201 ListMixin.find(2).remove_from_list
Chris@909 202
Chris@909 203 assert_equal [2, 1, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
Chris@909 204
Chris@909 205 assert_equal 1, ListMixin.find(1).pos
Chris@909 206 assert_equal nil, ListMixin.find(2).pos
Chris@909 207 assert_equal 2, ListMixin.find(3).pos
Chris@909 208 assert_equal 3, ListMixin.find(4).pos
Chris@909 209 end
Chris@909 210
Chris@909 211 def test_remove_before_destroy_does_not_shift_lower_items_twice
Chris@909 212 assert_equal [1, 2, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
Chris@909 213
Chris@909 214 ListMixin.find(2).remove_from_list
Chris@909 215 ListMixin.find(2).destroy
Chris@909 216
Chris@909 217 assert_equal [1, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
Chris@909 218
Chris@909 219 assert_equal 1, ListMixin.find(1).pos
Chris@909 220 assert_equal 2, ListMixin.find(3).pos
Chris@909 221 assert_equal 3, ListMixin.find(4).pos
Chris@909 222 end
Chris@909 223
Chris@909 224 end
Chris@909 225
Chris@909 226 class ListSubTest < Test::Unit::TestCase
Chris@909 227
Chris@909 228 def setup
Chris@909 229 setup_db
Chris@909 230 (1..4).each { |i| ((i % 2 == 1) ? ListMixinSub1 : ListMixinSub2).create! :pos => i, :parent_id => 5000 }
Chris@909 231 end
Chris@909 232
Chris@909 233 def teardown
Chris@909 234 teardown_db
Chris@909 235 end
Chris@909 236
Chris@909 237 def test_reordering
Chris@909 238 assert_equal [1, 2, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos').map(&:id)
Chris@909 239
Chris@909 240 ListMixin.find(2).move_lower
Chris@909 241 assert_equal [1, 3, 2, 4], ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos').map(&:id)
Chris@909 242
Chris@909 243 ListMixin.find(2).move_higher
Chris@909 244 assert_equal [1, 2, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos').map(&:id)
Chris@909 245
Chris@909 246 ListMixin.find(1).move_to_bottom
Chris@909 247 assert_equal [2, 3, 4, 1], ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos').map(&:id)
Chris@909 248
Chris@909 249 ListMixin.find(1).move_to_top
Chris@909 250 assert_equal [1, 2, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos').map(&:id)
Chris@909 251
Chris@909 252 ListMixin.find(2).move_to_bottom
Chris@909 253 assert_equal [1, 3, 4, 2], ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos').map(&:id)
Chris@909 254
Chris@909 255 ListMixin.find(4).move_to_top
Chris@909 256 assert_equal [4, 1, 3, 2], ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos').map(&:id)
Chris@909 257 end
Chris@909 258
Chris@909 259 def test_move_to_bottom_with_next_to_last_item
Chris@909 260 assert_equal [1, 2, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos').map(&:id)
Chris@909 261 ListMixin.find(3).move_to_bottom
Chris@909 262 assert_equal [1, 2, 4, 3], ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos').map(&:id)
Chris@909 263 end
Chris@909 264
Chris@909 265 def test_next_prev
Chris@909 266 assert_equal ListMixin.find(2), ListMixin.find(1).lower_item
Chris@909 267 assert_nil ListMixin.find(1).higher_item
Chris@909 268 assert_equal ListMixin.find(3), ListMixin.find(4).higher_item
Chris@909 269 assert_nil ListMixin.find(4).lower_item
Chris@909 270 end
Chris@909 271
Chris@909 272 def test_injection
Chris@909 273 item = ListMixin.new("parent_id"=>1)
Chris@909 274 assert_equal "parent_id = 1", item.scope_condition
Chris@909 275 assert_equal "pos", item.position_column
Chris@909 276 end
Chris@909 277
Chris@909 278 def test_insert_at
Chris@909 279 new = ListMixin.create("parent_id" => 20)
Chris@909 280 assert_equal 1, new.pos
Chris@909 281
Chris@909 282 new = ListMixinSub1.create("parent_id" => 20)
Chris@909 283 assert_equal 2, new.pos
Chris@909 284
Chris@909 285 new = ListMixinSub2.create("parent_id" => 20)
Chris@909 286 assert_equal 3, new.pos
Chris@909 287
Chris@909 288 new4 = ListMixin.create("parent_id" => 20)
Chris@909 289 assert_equal 4, new4.pos
Chris@909 290
Chris@909 291 new4.insert_at(3)
Chris@909 292 assert_equal 3, new4.pos
Chris@909 293
Chris@909 294 new.reload
Chris@909 295 assert_equal 4, new.pos
Chris@909 296
Chris@909 297 new.insert_at(2)
Chris@909 298 assert_equal 2, new.pos
Chris@909 299
Chris@909 300 new4.reload
Chris@909 301 assert_equal 4, new4.pos
Chris@909 302
Chris@909 303 new5 = ListMixinSub1.create("parent_id" => 20)
Chris@909 304 assert_equal 5, new5.pos
Chris@909 305
Chris@909 306 new5.insert_at(1)
Chris@909 307 assert_equal 1, new5.pos
Chris@909 308
Chris@909 309 new4.reload
Chris@909 310 assert_equal 5, new4.pos
Chris@909 311 end
Chris@909 312
Chris@909 313 def test_delete_middle
Chris@909 314 assert_equal [1, 2, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos').map(&:id)
Chris@909 315
Chris@909 316 ListMixin.find(2).destroy
Chris@909 317
Chris@909 318 assert_equal [1, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos').map(&:id)
Chris@909 319
Chris@909 320 assert_equal 1, ListMixin.find(1).pos
Chris@909 321 assert_equal 2, ListMixin.find(3).pos
Chris@909 322 assert_equal 3, ListMixin.find(4).pos
Chris@909 323
Chris@909 324 ListMixin.find(1).destroy
Chris@909 325
Chris@909 326 assert_equal [3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos').map(&:id)
Chris@909 327
Chris@909 328 assert_equal 1, ListMixin.find(3).pos
Chris@909 329 assert_equal 2, ListMixin.find(4).pos
Chris@909 330 end
Chris@909 331
Chris@909 332 end