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
|