acts_as_list_ar 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,8 @@
1
+ begin
2
+ require File.dirname(__FILE__) + '/../../../../spec/spec_helper'
3
+ rescue LoadError
4
+ puts "You need to install rspec in your base app"
5
+ exit
6
+ end
7
+
8
+ plugin_spec_dir = File.dirname(__FILE__)
@@ -0,0 +1,247 @@
1
+ # Load the plugin's test_helper (Rails 2.x needs the path)
2
+ require 'test/unit'
3
+ begin
4
+ require File.dirname(__FILE__) + '/test_helper.rb'
5
+ rescue LoadError
6
+ require 'test_helper'
7
+ end
8
+
9
+ class ListTest < ActiveSupport::TestCase
10
+ def setup
11
+ setup_db
12
+ (1..4).each { |counter| ListMixin.create! :pos => counter, :parent_id => 5 }
13
+ end
14
+
15
+ def teardown
16
+ teardown_db
17
+ end
18
+
19
+ def test_reordering
20
+ assert_equal [1, 2, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
21
+
22
+ ListMixin.find(2).move_lower
23
+ assert_equal [1, 3, 2, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
24
+
25
+ ListMixin.find(2).move_higher
26
+ assert_equal [1, 2, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
27
+
28
+ ListMixin.find(1).move_to_bottom
29
+ assert_equal [2, 3, 4, 1], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
30
+
31
+ ListMixin.find(1).move_to_top
32
+ assert_equal [1, 2, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
33
+
34
+ ListMixin.find(2).move_to_bottom
35
+ assert_equal [1, 3, 4, 2], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
36
+
37
+ ListMixin.find(4).move_to_top
38
+ assert_equal [4, 1, 3, 2], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
39
+ end
40
+
41
+ def test_move_to_bottom_with_next_to_last_item
42
+ assert_equal [1, 2, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
43
+ ListMixin.find(3).move_to_bottom
44
+ assert_equal [1, 2, 4, 3], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
45
+ end
46
+
47
+ def test_next_prev
48
+ assert_equal ListMixin.find(2), ListMixin.find(1).lower_item
49
+ assert_nil ListMixin.find(1).higher_item
50
+ assert_equal ListMixin.find(3), ListMixin.find(4).higher_item
51
+ assert_nil ListMixin.find(4).lower_item
52
+ end
53
+
54
+ def test_injection
55
+ item = ListMixin.new(:parent_id => 1)
56
+ assert_equal ["parent_id = 1"], item.scope_condition
57
+ assert_equal "pos", item.position_column
58
+ end
59
+
60
+ def test_insert
61
+ new = ListMixin.create(:parent_id => 20)
62
+ # insert as last
63
+ assert_equal 1, new.pos
64
+ assert new.first?
65
+ assert new.last?
66
+
67
+ new = ListMixin.create(:parent_id => 20)
68
+ assert_equal 2, new.pos
69
+ assert !new.first?
70
+ assert new.last?
71
+
72
+ new = ListMixin.create(:parent_id => 20)
73
+ assert_equal 3, new.pos
74
+ assert !new.first?
75
+ assert new.last?
76
+
77
+ new = ListMixin.create(:parent_id => 0)
78
+ assert_equal 1, new.pos
79
+ assert new.first?
80
+ assert new.last?
81
+ end
82
+
83
+ def test_insert_at
84
+ # insert as last
85
+ new = ListMixin.create(:parent_id => 20)
86
+ assert_equal 1, new.pos
87
+
88
+ new = ListMixin.create(:parent_id => 20)
89
+ assert_equal 2, new.pos
90
+
91
+ new = ListMixin.create(:parent_id => 20)
92
+ assert_equal 3, new.pos
93
+
94
+ new4 = ListMixin.create(:parent_id => 20)
95
+ assert_equal 4, new4.pos
96
+
97
+ new4.insert_at(3)
98
+ assert_equal 3, new4.pos
99
+
100
+ new.reload
101
+ assert_equal 4, new.pos
102
+
103
+ new.insert_at(2)
104
+ assert_equal 2, new.pos
105
+
106
+ new4.reload
107
+ assert_equal 4, new4.pos
108
+
109
+ new5 = ListMixin.create(:parent_id => 20)
110
+ assert_equal 5, new5.pos
111
+
112
+ new5.insert_at(1)
113
+ assert_equal 1, new5.pos
114
+
115
+ new4.reload
116
+ assert_equal 5, new4.pos
117
+ end
118
+
119
+ def test_delete_middle
120
+ assert_equal [1, 2, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
121
+
122
+ ListMixin.find(2).destroy
123
+
124
+ assert_equal [1, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
125
+
126
+ assert_equal 1, ListMixin.find(1).pos
127
+ assert_equal 2, ListMixin.find(3).pos
128
+ assert_equal 3, ListMixin.find(4).pos
129
+
130
+ ListMixin.find(1).destroy
131
+
132
+ assert_equal [3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
133
+
134
+ assert_equal 1, ListMixin.find(3).pos
135
+ assert_equal 2, ListMixin.find(4).pos
136
+ end
137
+
138
+ def test_with_string_based_scope
139
+ new = ListWithStringScopeMixin.create(:parent_id => 500)
140
+ assert_equal 1, new.pos
141
+ assert new.first?
142
+ assert new.last?
143
+ end
144
+
145
+ def test_nil_scope
146
+ new1, new2, new3 = ListMixin.create, ListMixin.create, ListMixin.create
147
+ new2.move_higher
148
+ assert_equal [new2, new1, new3], ListMixin.find(:all, :conditions => 'parent_id IS NULL', :order => 'pos')
149
+ end
150
+
151
+ def test_remove_from_list_should_then_fail_in_list?
152
+ assert_equal true, ListMixin.find(1).in_list?
153
+ ListMixin.find(1).remove_from_list
154
+ assert_equal false, ListMixin.find(1).in_list?
155
+ end
156
+
157
+ def test_remove_from_list_should_set_position_to_nil
158
+ assert_equal [1, 2, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
159
+
160
+ ListMixin.find(2).remove_from_list
161
+
162
+ assert_equal [2, 1, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
163
+
164
+ assert_equal 1, ListMixin.find(1).pos
165
+ assert_equal nil, ListMixin.find(2).pos
166
+ assert_equal 2, ListMixin.find(3).pos
167
+ assert_equal 3, ListMixin.find(4).pos
168
+ end
169
+
170
+ def test_move_to_lower_in_list
171
+ assert_equal [1, 2, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
172
+ item = ListMixin.find(2)
173
+ item.move_to(3)
174
+ assert_equal [1, 3, 2, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
175
+ item.move_to(7)
176
+ assert_equal [1, 3, 4, 2], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
177
+ assert_equal 4, item.pos
178
+ end
179
+
180
+ def test_move_to_higher_in_list
181
+ assert_equal [1, 2, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
182
+ item = ListMixin.find(2)
183
+ item.move_to(1)
184
+ assert_equal [2, 1, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
185
+ item.move_to(-2)
186
+ assert_equal [2, 1, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
187
+ assert_equal 1, item.pos
188
+ end
189
+
190
+ def test_remove_before_destroy_does_not_shift_lower_items_twice
191
+ assert_equal [1, 2, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
192
+
193
+ ListMixin.find(2).remove_from_list
194
+ ListMixin.find(2).destroy
195
+
196
+ assert_equal [1, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
197
+
198
+ assert_equal 1, ListMixin.find(1).pos
199
+ assert_equal 2, ListMixin.find(3).pos
200
+ assert_equal 3, ListMixin.find(4).pos
201
+ end
202
+
203
+ def test_should_not_trigger_unexpected_callbacks_on_destroy
204
+ element = ListMixin.find(2)
205
+ assert !element.before_save_triggered
206
+ element.destroy
207
+ assert !element.before_save_triggered
208
+ end
209
+
210
+ # special thanks to openhood on github
211
+ def test_delete_middle_with_holes
212
+ # first we check everything is at expected place
213
+ assert_equal [1, 2, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
214
+
215
+ # then we create a hole in the list, say you're working with existing data in which you already have holes
216
+ # or your scope is very complex
217
+ ListMixin.delete(2)
218
+
219
+ # we ensure the hole is really here
220
+ assert_equal [1, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
221
+ assert_equal 1, ListMixin.find(1).pos
222
+ assert_equal 3, ListMixin.find(3).pos
223
+ assert_equal 4, ListMixin.find(4).pos
224
+
225
+ # can we retrieve lower item despite the hole?
226
+ assert_equal 3, ListMixin.find(1).lower_item.id
227
+
228
+ # can we move an item lower jumping more than one position?
229
+ ListMixin.find(1).move_lower
230
+ assert_equal [3, 1, 4], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
231
+ assert_equal 2, ListMixin.find(3).pos
232
+ assert_equal 3, ListMixin.find(1).pos
233
+ assert_equal 4, ListMixin.find(4).pos
234
+
235
+ # create another hole
236
+ ListMixin.delete(1)
237
+
238
+ # can we retrieve higher item despite the hole?
239
+ assert_equal 3, ListMixin.find(4).higher_item.id
240
+
241
+ # can we move an item higher jumping more than one position?
242
+ ListMixin.find(4).move_higher
243
+ assert_equal [4, 3], ListMixin.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
244
+ assert_equal 2, ListMixin.find(4).pos
245
+ assert_equal 3, ListMixin.find(3).pos
246
+ end
247
+ end
@@ -0,0 +1,187 @@
1
+ # Load the plugin's test_helper (Rails 2.x needs the path)
2
+ begin
3
+ require File.dirname(__FILE__) + '/test_helper.rb'
4
+ rescue LoadError
5
+ require 'test_helper'
6
+ end
7
+ require 'test/helper'
8
+
9
+ class ListWithStringIdsTest < ActiveSupport::TestCase
10
+
11
+ def setup
12
+ setup_db
13
+ (1..4).each do |counter|
14
+ m = MixinWithStrings.new(:pos => counter, :parent_id => 5)
15
+ m.id = counter.to_s
16
+ m.save!
17
+ end
18
+ end
19
+
20
+ def teardown
21
+ teardown_db
22
+ end
23
+
24
+ def test_reordering
25
+ assert_equal [1, 2, 3, 4], MixinWithStrings.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
26
+
27
+ MixinWithStrings.find(2).move_lower
28
+ assert_equal [1, 3, 2, 4], MixinWithStrings.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
29
+
30
+ MixinWithStrings.find(2).move_higher
31
+ assert_equal [1, 2, 3, 4], MixinWithStrings.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
32
+
33
+ MixinWithStrings.find(1).move_to_bottom
34
+ assert_equal [2, 3, 4, 1], MixinWithStrings.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
35
+
36
+ MixinWithStrings.find(1).move_to_top
37
+ assert_equal [1, 2, 3, 4], MixinWithStrings.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
38
+
39
+ MixinWithStrings.find(2).move_to_bottom
40
+ assert_equal [1, 3, 4, 2], MixinWithStrings.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
41
+
42
+ MixinWithStrings.find(4).move_to_top
43
+ assert_equal [4, 1, 3, 2], MixinWithStrings.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
44
+ end
45
+
46
+ def test_move_to_bottom_with_next_to_last_item
47
+ assert_equal [1, 2, 3, 4], MixinWithStrings.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
48
+ MixinWithStrings.find(3).move_to_bottom
49
+ assert_equal [1, 2, 4, 3], MixinWithStrings.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
50
+ end
51
+
52
+ def test_next_prev
53
+ assert_equal MixinWithStrings.find(2), MixinWithStrings.find(1).lower_item
54
+ assert_nil MixinWithStrings.find(1).higher_item
55
+ assert_equal MixinWithStrings.find(3), MixinWithStrings.find(4).higher_item
56
+ assert_nil MixinWithStrings.find(4).lower_item
57
+ end
58
+
59
+ def test_injection
60
+ item = MixinWithStrings.new(:parent_id => 1)
61
+ assert_equal ["parent_id = 1"], item.scope_condition
62
+ assert_equal "pos", item.position_column
63
+ end
64
+
65
+ def test_insert
66
+ new = MixinWithStrings.create(:parent_id => 20)
67
+ assert_equal 1, new.pos
68
+ assert new.first?
69
+ assert new.last?
70
+
71
+ new = MixinWithStrings.create(:parent_id => 20)
72
+ assert_equal 2, new.pos
73
+ assert !new.first?
74
+ assert new.last?
75
+
76
+ new = MixinWithStrings.create(:parent_id => 20)
77
+ assert_equal 3, new.pos
78
+ assert !new.first?
79
+ assert new.last?
80
+
81
+ new = MixinWithStrings.create(:parent_id => 0)
82
+ assert_equal 1, new.pos
83
+ assert new.first?
84
+ assert new.last?
85
+ end
86
+
87
+ def test_insert_at
88
+ new = MixinWithStrings.create(:parent_id => 20)
89
+ assert_equal 1, new.pos
90
+
91
+ new = MixinWithStrings.create(:parent_id => 20)
92
+ assert_equal 2, new.pos
93
+
94
+ new = MixinWithStrings.create(:parent_id => 20)
95
+ assert_equal 3, new.pos
96
+
97
+ new4 = MixinWithStrings.create(:parent_id => 20)
98
+ assert_equal 4, new4.pos
99
+
100
+ new4.insert_at(3)
101
+ assert_equal 3, new4.pos
102
+
103
+ new.reload
104
+ assert_equal 4, new.pos
105
+
106
+ new.insert_at(2)
107
+ assert_equal 2, new.pos
108
+
109
+ new4.reload
110
+ assert_equal 4, new4.pos
111
+
112
+ new5 = MixinWithStrings.create(:parent_id => 20)
113
+ assert_equal 5, new5.pos
114
+
115
+ new5.insert_at(1)
116
+ assert_equal 1, new5.pos
117
+
118
+ new4.reload
119
+ assert_equal 5, new4.pos
120
+ end
121
+
122
+ def test_delete_middle
123
+ assert_equal [1, 2, 3, 4], MixinWithStrings.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
124
+
125
+ MixinWithStrings.find(2).destroy
126
+
127
+ assert_equal [1, 3, 4], MixinWithStrings.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
128
+
129
+ assert_equal 1, MixinWithStrings.find(1).pos
130
+ assert_equal 2, MixinWithStrings.find(3).pos
131
+ assert_equal 3, MixinWithStrings.find(4).pos
132
+
133
+ MixinWithStrings.find(1).destroy
134
+
135
+ assert_equal [3, 4], MixinWithStrings.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
136
+
137
+ assert_equal 1, MixinWithStrings.find(3).pos
138
+ assert_equal 2, MixinWithStrings.find(4).pos
139
+ end
140
+
141
+ def test_with_string_based_scope
142
+ new = ListWithStringScopeMixin.create(:parent_id => 500)
143
+ assert_equal 1, new.pos
144
+ assert new.first?
145
+ assert new.last?
146
+ end
147
+
148
+ def test_nil_scope
149
+ new1, new2, new3 = MixinWithStrings.create, MixinWithStrings.create, MixinWithStrings.create
150
+ new2.move_higher
151
+ assert_equal [new2, new1, new3], MixinWithStrings.find(:all, :conditions => 'parent_id IS NULL', :order => 'pos')
152
+ end
153
+
154
+
155
+ def test_remove_from_list_should_then_fail_in_list?
156
+ assert_equal true, MixinWithStrings.find(1).in_list?
157
+ MixinWithStrings.find(1).remove_from_list
158
+ assert_equal false, MixinWithStrings.find(1).in_list?
159
+ end
160
+
161
+ def test_remove_from_list_should_set_position_to_nil
162
+ assert_equal [1, 2, 3, 4], MixinWithStrings.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
163
+
164
+ MixinWithStrings.find(2).remove_from_list
165
+
166
+ assert_equal [2, 1, 3, 4], MixinWithStrings.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
167
+
168
+ assert_equal 1, MixinWithStrings.find(1).pos
169
+ assert_equal nil, MixinWithStrings.find(2).pos
170
+ assert_equal 2, MixinWithStrings.find(3).pos
171
+ assert_equal 3, MixinWithStrings.find(4).pos
172
+ end
173
+
174
+ def test_remove_before_destroy_does_not_shift_lower_items_twice
175
+ assert_equal [1, 2, 3, 4], MixinWithStrings.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
176
+
177
+ MixinWithStrings.find(2).remove_from_list
178
+ MixinWithStrings.find(2).destroy
179
+
180
+ assert_equal [1, 3, 4], MixinWithStrings.find(:all, :conditions => 'parent_id = 5', :order => 'pos').map(&:id)
181
+
182
+ assert_equal 1, MixinWithStrings.find(1).pos
183
+ assert_equal 2, MixinWithStrings.find(3).pos
184
+ assert_equal 3, MixinWithStrings.find(4).pos
185
+ end
186
+
187
+ end
@@ -0,0 +1,127 @@
1
+ # Load the plugin's test_helper (Rails 2.x needs the path)
2
+ begin
3
+ require File.dirname(__FILE__) + '/test_helper.rb'
4
+ rescue LoadError
5
+ require 'test_helper'
6
+ end
7
+ require 'test/helper'
8
+
9
+ class ListSubTest < ActiveSupport::TestCase
10
+
11
+ def setup
12
+ setup_db
13
+ (1..4).each { |i| ((i % 2 == 1) ? ListMixinSub1 : ListMixinSub2).create! :pos => i, :parent_id => 5000 }
14
+ end
15
+
16
+ def teardown
17
+ teardown_db
18
+ end
19
+
20
+ def test_reordering
21
+ assert_equal [1, 2, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos').map(&:id)
22
+
23
+ ListMixin.find(2).move_lower
24
+ assert_equal [1, 3, 2, 4], ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos').map(&:id)
25
+
26
+ ListMixin.find(2).move_higher
27
+ assert_equal [1, 2, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos').map(&:id)
28
+
29
+ ListMixin.find(1).move_to_bottom
30
+ assert_equal [2, 3, 4, 1], ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos').map(&:id)
31
+
32
+ ListMixin.find(1).move_to_top
33
+ assert_equal [1, 2, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos').map(&:id)
34
+
35
+ ListMixin.find(2).move_to_bottom
36
+ assert_equal [1, 3, 4, 2], ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos').map(&:id)
37
+
38
+ ListMixin.find(4).move_to_top
39
+ assert_equal [4, 1, 3, 2], ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos').map(&:id)
40
+ end
41
+
42
+ def test_move_to_bottom_with_next_to_last_item
43
+ assert_equal [1, 2, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos').map(&:id)
44
+ ListMixin.find(3).move_to_bottom
45
+ assert_equal [1, 2, 4, 3], ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos').map(&:id)
46
+ end
47
+
48
+ def test_next_prev
49
+ assert_equal ListMixin.find(2), ListMixin.find(1).lower_item
50
+ assert_nil ListMixin.find(1).higher_item
51
+ assert_equal ListMixin.find(3), ListMixin.find(4).higher_item
52
+ assert_nil ListMixin.find(4).lower_item
53
+ end
54
+
55
+ def test_sti
56
+ new = StiMixinSub1.create
57
+ assert_equal 1, new.position
58
+ new = StiMixinSub1.create
59
+ assert_equal 2, new.position
60
+
61
+ new = StiMixinSub2.create
62
+ assert_equal 1, new.position
63
+ new = StiMixinSub2.create
64
+ assert_equal 2, new.position
65
+ end
66
+
67
+ def test_injection
68
+ item = ListMixin.new("parent_id" => 1)
69
+ assert_equal "parent_id = 1", item.scope_condition
70
+ assert_equal "pos", item.position_column
71
+ end
72
+
73
+ def test_insert_at
74
+ new = ListMixin.create("parent_id" => 20)
75
+ assert_equal 1, new.pos
76
+
77
+ new = ListMixinSub1.create("parent_id" => 20)
78
+ assert_equal 2, new.pos
79
+
80
+ new = ListMixinSub2.create("parent_id" => 20)
81
+ assert_equal 3, new.pos
82
+
83
+ new4 = ListMixin.create("parent_id" => 20)
84
+ assert_equal 4, new4.pos
85
+
86
+ new4.insert_at(3)
87
+ assert_equal 3, new4.pos
88
+
89
+ new.reload
90
+ assert_equal 4, new.pos
91
+
92
+ new.insert_at(2)
93
+ assert_equal 2, new.pos
94
+
95
+ new4.reload
96
+ assert_equal 4, new4.pos
97
+
98
+ new5 = ListMixinSub1.create("parent_id" => 20)
99
+ assert_equal 5, new5.pos
100
+
101
+ new5.insert_at(1)
102
+ assert_equal 1, new5.pos
103
+
104
+ new4.reload
105
+ assert_equal 5, new4.pos
106
+ end
107
+
108
+ def test_delete_middle
109
+ assert_equal [1, 2, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos').map(&:id)
110
+
111
+ ListMixin.find(2).destroy
112
+
113
+ assert_equal [1, 3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos').map(&:id)
114
+
115
+ assert_equal 1, ListMixin.find(1).pos
116
+ assert_equal 2, ListMixin.find(3).pos
117
+ assert_equal 3, ListMixin.find(4).pos
118
+
119
+ ListMixin.find(1).destroy
120
+
121
+ assert_equal [3, 4], ListMixin.find(:all, :conditions => 'parent_id = 5000', :order => 'pos').map(&:id)
122
+
123
+ assert_equal 1, ListMixin.find(3).pos
124
+ assert_equal 2, ListMixin.find(4).pos
125
+ end
126
+
127
+ end