aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/test
diff options
context:
space:
mode:
Diffstat (limited to 'activerecord/test')
-rw-r--r--activerecord/test/fixtures/mixin.rb6
-rw-r--r--activerecord/test/fixtures/mixins.yml9
-rw-r--r--activerecord/test/mixin_test.rb163
3 files changed, 178 insertions, 0 deletions
diff --git a/activerecord/test/fixtures/mixin.rb b/activerecord/test/fixtures/mixin.rb
index a0a92c4f64..0411c0d87e 100644
--- a/activerecord/test/fixtures/mixin.rb
+++ b/activerecord/test/fixtures/mixin.rb
@@ -16,6 +16,12 @@ class ListMixin < Mixin
def self.table_name() "mixins" end
end
+class ListMixinSub1 < ListMixin
+end
+
+class ListMixinSub2 < ListMixin
+end
+
class ListWithStringScopeMixin < ActiveRecord::Base
acts_as_list :column => "pos", :scope => 'parent_id = #{parent_id}'
diff --git a/activerecord/test/fixtures/mixins.yml b/activerecord/test/fixtures/mixins.yml
index 7b20965512..cb21349cd0 100644
--- a/activerecord/test/fixtures/mixins.yml
+++ b/activerecord/test/fixtures/mixins.yml
@@ -78,3 +78,12 @@ tree_<%= set[0] %>:
root_id: 42
<% end %>
+
+# subclasses of list items
+<% (1..4).each do |i| %>
+list_sub_<%= i %>:
+ id: <%= i + 5000 %>
+ pos: <%= i %>
+ parent_id: 5000
+ type: <%= (i % 2 == 1) ? ListMixinSub1 : ListMixinSub2 %>
+<% end %>
diff --git a/activerecord/test/mixin_test.rb b/activerecord/test/mixin_test.rb
index 82b2a143fd..4a59b649dd 100644
--- a/activerecord/test/mixin_test.rb
+++ b/activerecord/test/mixin_test.rb
@@ -195,6 +195,7 @@ class ListTest < Test::Unit::TestCase
new2.move_higher
assert_equal [new2, new1, new3], ListMixin.find(:all, :conditions => 'parent_id IS NULL', :order => 'pos')
end
+
end
class TreeTest < Test::Unit::TestCase
@@ -353,3 +354,165 @@ class TouchTest < Test::Unit::TestCase
end
end
+
+
+class ListSubTest < Test::Unit::TestCase
+ fixtures :mixins
+
+ def test_reordering
+
+ assert_equal [mixins(:list_sub_1),
+ mixins(:list_sub_2),
+ mixins(:list_sub_3),
+ mixins(:list_sub_4)],
+ ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos')
+
+ mixins(:list_sub_2).move_lower
+
+ assert_equal [mixins(:list_sub_1),
+ mixins(:list_sub_3),
+ mixins(:list_sub_2),
+ mixins(:list_sub_4)],
+ ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos')
+
+ mixins(:list_sub_2).move_higher
+
+ assert_equal [mixins(:list_sub_1),
+ mixins(:list_sub_2),
+ mixins(:list_sub_3),
+ mixins(:list_sub_4)],
+ ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos')
+
+ mixins(:list_sub_1).move_to_bottom
+
+ assert_equal [mixins(:list_sub_2),
+ mixins(:list_sub_3),
+ mixins(:list_sub_4),
+ mixins(:list_sub_1)],
+ ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos')
+
+ mixins(:list_sub_1).move_to_top
+
+ assert_equal [mixins(:list_sub_1),
+ mixins(:list_sub_2),
+ mixins(:list_sub_3),
+ mixins(:list_sub_4)],
+ ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos')
+
+
+ mixins(:list_sub_2).move_to_bottom
+
+ assert_equal [mixins(:list_sub_1),
+ mixins(:list_sub_3),
+ mixins(:list_sub_4),
+ mixins(:list_sub_2)],
+ ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos')
+
+ mixins(:list_sub_4).move_to_top
+
+ assert_equal [mixins(:list_sub_4),
+ mixins(:list_sub_1),
+ mixins(:list_sub_3),
+ mixins(:list_sub_2)],
+ ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos')
+
+ end
+
+ def test_move_to_bottom_with_next_to_last_item
+ assert_equal [mixins(:list_sub_1),
+ mixins(:list_sub_2),
+ mixins(:list_sub_3),
+ mixins(:list_sub_4)],
+ ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos')
+
+ mixins(:list_sub_3).move_to_bottom
+
+ assert_equal [mixins(:list_sub_1),
+ mixins(:list_sub_2),
+ mixins(:list_sub_4),
+ mixins(:list_sub_3)],
+ ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos')
+ end
+
+ def test_next_prev
+ assert_equal mixins(:list_sub_2), mixins(:list_sub_1).lower_item
+ assert_nil mixins(:list_sub_1).higher_item
+ assert_equal mixins(:list_sub_3), mixins(:list_sub_4).higher_item
+ assert_nil mixins(:list_sub_4).lower_item
+ end
+
+
+ def test_injection
+ item = ListMixin.new("parent_id"=>1)
+ assert_equal "parent_id = 1", item.scope_condition
+ assert_equal "pos", item.position_column
+ end
+
+
+ def test_insert_at
+ new = ListMixin.create("parent_id" => 20)
+ assert_equal 1, new.pos
+
+ new = ListMixinSub1.create("parent_id" => 20)
+ assert_equal 2, new.pos
+
+ new = ListMixinSub2.create("parent_id" => 20)
+ assert_equal 3, new.pos
+
+ new4 = ListMixin.create("parent_id" => 20)
+ assert_equal 4, new4.pos
+
+ new4.insert_at(3)
+ assert_equal 3, new4.pos
+
+ new.reload
+ assert_equal 4, new.pos
+
+ new.insert_at(2)
+ assert_equal 2, new.pos
+
+ new4.reload
+ assert_equal 4, new4.pos
+
+ new5 = ListMixinSub1.create("parent_id" => 20)
+ assert_equal 5, new5.pos
+
+ new5.insert_at(1)
+ assert_equal 1, new5.pos
+
+ new4.reload
+ assert_equal 5, new4.pos
+ end
+
+ def test_delete_middle
+
+ assert_equal [mixins(:list_sub_1),
+ mixins(:list_sub_2),
+ mixins(:list_sub_3),
+ mixins(:list_sub_4)],
+ ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos')
+
+ mixins(:list_sub_2).destroy
+
+ assert_equal [mixins(:list_sub_1, :reload),
+ mixins(:list_sub_3, :reload),
+ mixins(:list_sub_4, :reload)],
+ ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos')
+
+ assert_equal 1, mixins(:list_sub_1).pos
+ assert_equal 2, mixins(:list_sub_3).pos
+ assert_equal 3, mixins(:list_sub_4).pos
+
+ mixins(:list_sub_1).destroy
+
+ assert_equal [mixins(:list_sub_3, :reload),
+ mixins(:list_sub_4, :reload)],
+ ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos')
+
+ assert_equal 1, mixins(:list_sub_3).pos
+ assert_equal 2, mixins(:list_sub_4).pos
+
+ end
+
+end
+