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
|