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