acts_as_list 1.0.4 → 1.2.4

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.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +39 -4
  3. data/README.md +17 -9
  4. data/Rakefile +0 -8
  5. data/lib/acts_as_list/active_record/acts/callback_definer.rb +2 -4
  6. data/lib/acts_as_list/active_record/acts/list.rb +33 -34
  7. data/lib/acts_as_list/active_record/acts/position_column_method_definer.rb +15 -6
  8. data/lib/acts_as_list/active_record/acts/scope_method_definer.rb +1 -2
  9. data/lib/acts_as_list/active_record/acts/sequential_updates_method_definer.rb +15 -15
  10. data/lib/acts_as_list/active_record/acts/with_connection.rb +25 -0
  11. data/lib/acts_as_list/version.rb +1 -1
  12. metadata +102 -61
  13. data/.github/FUNDING.yml +0 -3
  14. data/.gitignore +0 -12
  15. data/.travis.yml +0 -55
  16. data/Appraisals +0 -40
  17. data/Gemfile +0 -28
  18. data/acts_as_list.gemspec +0 -34
  19. data/gemfiles/rails_4_2.gemfile +0 -32
  20. data/gemfiles/rails_5_0.gemfile +0 -31
  21. data/gemfiles/rails_5_1.gemfile +0 -31
  22. data/gemfiles/rails_5_2.gemfile +0 -31
  23. data/gemfiles/rails_6_0.gemfile +0 -31
  24. data/gemfiles/rails_6_1.gemfile +0 -31
  25. data/test/database.yml +0 -16
  26. data/test/helper.rb +0 -69
  27. data/test/shared.rb +0 -12
  28. data/test/shared_array_scope_list.rb +0 -177
  29. data/test/shared_list.rb +0 -324
  30. data/test/shared_list_sub.rb +0 -188
  31. data/test/shared_no_addition.rb +0 -38
  32. data/test/shared_quoting.rb +0 -23
  33. data/test/shared_top_addition.rb +0 -110
  34. data/test/shared_zero_based.rb +0 -104
  35. data/test/test_default_scope_with_select.rb +0 -33
  36. data/test/test_joined_list.rb +0 -61
  37. data/test/test_list.rb +0 -1086
  38. data/test/test_no_update_for_extra_classes.rb +0 -131
  39. data/test/test_no_update_for_scope_destruction.rb +0 -69
  40. data/test/test_no_update_for_subclasses.rb +0 -56
  41. data/test/test_scope_with_user_defined_foreign_key.rb +0 -42
data/test/shared.rb DELETED
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Common shared behaviour.
4
- module Shared
5
- autoload :List, 'shared_list'
6
- autoload :ListSub, 'shared_list_sub'
7
- autoload :ZeroBased, 'shared_zero_based'
8
- autoload :ArrayScopeList, 'shared_array_scope_list'
9
- autoload :TopAddition, 'shared_top_addition'
10
- autoload :NoAddition, 'shared_no_addition'
11
- autoload :Quoting, 'shared_quoting'
12
- end
@@ -1,177 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Shared
4
- module ArrayScopeList
5
- def setup
6
- (1..4).each { |counter| ArrayScopeListMixin.create! pos: counter, parent_id: 5, parent_type: 'ParentClass' }
7
- (1..4).each { |counter| ArrayScopeListMixin.create! pos: counter, parent_id: 6, parent_type: 'ParentClass' }
8
- end
9
-
10
- def test_reordering
11
- assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
12
-
13
- ArrayScopeListMixin.where(id: 2).first.move_lower
14
- assert_equal [1, 3, 2, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
15
-
16
- ArrayScopeListMixin.where(id: 2).first.move_higher
17
- assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
18
-
19
- ArrayScopeListMixin.where(id: 1).first.move_to_bottom
20
- assert_equal [2, 3, 4, 1], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
21
-
22
- ArrayScopeListMixin.where(id: 1).first.move_to_top
23
- assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
24
-
25
- ArrayScopeListMixin.where(id: 2).first.move_to_bottom
26
- assert_equal [1, 3, 4, 2], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
27
-
28
- ArrayScopeListMixin.where(id: 4).first.move_to_top
29
- assert_equal [4, 1, 3, 2], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
30
-
31
- ArrayScopeListMixin.where(id: 4).first.insert_at(4)
32
- assert_equal [1, 3, 2, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
33
- assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:pos)
34
- end
35
-
36
- def test_move_to_bottom_with_next_to_last_item
37
- assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
38
- ArrayScopeListMixin.where(id: 3).first.move_to_bottom
39
- assert_equal [1, 2, 4, 3], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
40
- end
41
-
42
- def test_next_prev
43
- assert_equal ArrayScopeListMixin.where(id: 2).first, ArrayScopeListMixin.where(id: 1).first.lower_item
44
- assert_nil ArrayScopeListMixin.where(id: 1).first.higher_item
45
- assert_equal ArrayScopeListMixin.where(id: 3).first, ArrayScopeListMixin.where(id: 4).first.higher_item
46
- assert_nil ArrayScopeListMixin.where(id: 4).first.lower_item
47
- end
48
-
49
- def test_injection
50
- item = ArrayScopeListMixin.new(parent_id: 1, parent_type: 'ParentClass')
51
- assert_equal "pos", item.position_column
52
- end
53
-
54
- def test_insert
55
- new = ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass')
56
- assert_equal 1, new.pos
57
- assert new.first?
58
- assert new.last?
59
-
60
- new = ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass')
61
- assert_equal 2, new.pos
62
- assert !new.first?
63
- assert new.last?
64
-
65
- new = ArrayScopeListMixin.acts_as_list_no_update { ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass') }
66
- assert_equal_or_nil $default_position,new.pos
67
- assert_equal $default_position.is_a?(Integer), new.first?
68
- assert !new.last?
69
-
70
- new = ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass')
71
- assert_equal 3, new.pos
72
- assert !new.first?
73
- assert new.last?
74
-
75
- new = ArrayScopeListMixin.create(parent_id: 0, parent_type: 'ParentClass')
76
- assert_equal 1, new.pos
77
- assert new.first?
78
- assert new.last?
79
- end
80
-
81
- def test_insert_at
82
- new = ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass')
83
- assert_equal 1, new.pos
84
-
85
- new = ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass')
86
- assert_equal 2, new.pos
87
-
88
- new = ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass')
89
- assert_equal 3, new.pos
90
-
91
- new_noup = ArrayScopeListMixin.acts_as_list_no_update { ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass') }
92
- assert_equal_or_nil $default_position,new_noup.pos
93
-
94
- new4 = ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass')
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 = ArrayScopeListMixin.create(parent_id: 20, parent_type: 'ParentClass')
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
-
118
- new_noup.reload
119
- assert_equal_or_nil $default_position, new_noup.pos
120
- end
121
-
122
- def test_delete_middle
123
- assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
124
-
125
- ArrayScopeListMixin.where(id: 2).first.destroy
126
-
127
- assert_equal [1, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
128
-
129
- assert_equal 1, ArrayScopeListMixin.where(id: 1).first.pos
130
- assert_equal 2, ArrayScopeListMixin.where(id: 3).first.pos
131
- assert_equal 3, ArrayScopeListMixin.where(id: 4).first.pos
132
-
133
- ArrayScopeListMixin.where(id: 1).first.destroy
134
-
135
- assert_equal [3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
136
-
137
- assert_equal 1, ArrayScopeListMixin.where(id: 3).first.pos
138
- assert_equal 2, ArrayScopeListMixin.where(id: 4).first.pos
139
-
140
- ArrayScopeListMixin.acts_as_list_no_update { ArrayScopeListMixin.where(id: 3).first.destroy }
141
-
142
- assert_equal [4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
143
-
144
- assert_equal 2, ArrayScopeListMixin.where(id: 4).first.pos
145
- end
146
-
147
- def test_remove_from_list_should_then_fail_in_list?
148
- assert_equal true, ArrayScopeListMixin.where(id: 1).first.in_list?
149
- ArrayScopeListMixin.where(id: 1).first.remove_from_list
150
- assert_equal false, ArrayScopeListMixin.where(id: 1).first.in_list?
151
- end
152
-
153
- def test_remove_from_list_should_set_position_to_nil
154
- assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
155
-
156
- ArrayScopeListMixin.where(id: 2).first.remove_from_list
157
-
158
- assert_equal 1, ArrayScopeListMixin.where(id: 1).first.pos
159
- assert_nil ArrayScopeListMixin.where(id: 2).first.pos
160
- assert_equal 2, ArrayScopeListMixin.where(id: 3).first.pos
161
- assert_equal 3, ArrayScopeListMixin.where(id: 4).first.pos
162
- end
163
-
164
- def test_remove_before_destroy_does_not_shift_lower_items_twice
165
- assert_equal [1, 2, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
166
-
167
- ArrayScopeListMixin.where(id: 2).first.remove_from_list
168
- ArrayScopeListMixin.where(id: 2).first.destroy
169
-
170
- assert_equal [1, 3, 4], ArrayScopeListMixin.where(parent_id: 5, parent_type: 'ParentClass').order('pos').map(&:id)
171
-
172
- assert_equal 1, ArrayScopeListMixin.where(id: 1).first.pos
173
- assert_equal 2, ArrayScopeListMixin.where(id: 3).first.pos
174
- assert_equal 3, ArrayScopeListMixin.where(id: 4).first.pos
175
- end
176
- end
177
- end
data/test/shared_list.rb DELETED
@@ -1,324 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Shared
4
- module List
5
- def setup
6
- (1..4).each do |counter|
7
- node = ListMixin.new parent_id: 5
8
- node.pos = counter
9
- node.save!
10
- end
11
- end
12
-
13
- def test_current_position
14
- first_item = ListMixin.where(parent_id: 5).first
15
- assert_equal 1, first_item.current_position
16
- first_item.remove_from_list
17
- assert_nil first_item.current_position
18
- end
19
-
20
- def test_reordering
21
- assert_equal [1, 2, 3, 4], ListMixin.where(parent_id: 5).order('pos').map(&:id)
22
-
23
- ListMixin.where(id: 2).first.move_lower
24
- assert_equal [1, 3, 2, 4], ListMixin.where(parent_id: 5).order('pos').map(&:id)
25
-
26
- ListMixin.where(id: 2).first.move_higher
27
- assert_equal [1, 2, 3, 4], ListMixin.where(parent_id: 5).order('pos').map(&:id)
28
-
29
- ListMixin.where(id: 1).first.move_to_bottom
30
- assert_equal [2, 3, 4, 1], ListMixin.where(parent_id: 5).order('pos').map(&:id)
31
-
32
- ListMixin.where(id: 1).first.move_to_top
33
- assert_equal [1, 2, 3, 4], ListMixin.where(parent_id: 5).order('pos').map(&:id)
34
-
35
- ListMixin.where(id: 2).first.move_to_bottom
36
- assert_equal [1, 3, 4, 2], ListMixin.where(parent_id: 5).order('pos').map(&:id)
37
-
38
- ListMixin.where(id: 4).first.move_to_top
39
- assert_equal [4, 1, 3, 2], ListMixin.where(parent_id: 5).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.where(parent_id: 5).order('pos').map(&:id)
44
- ListMixin.where(id: 3).first.move_to_bottom
45
- assert_equal [1, 2, 4, 3], ListMixin.where(parent_id: 5).order('pos').map(&:id)
46
- end
47
-
48
- def test_next_prev
49
- assert_equal ListMixin.where(id: 2).first, ListMixin.where(id: 1).first.lower_item
50
- assert_nil ListMixin.where(id: 1).first.higher_item
51
- assert_equal ListMixin.where(id: 3).first, ListMixin.where(id: 4).first.higher_item
52
- assert_nil ListMixin.where(id: 4).first.lower_item
53
- end
54
-
55
- def test_injection
56
- item = ListMixin.new(parent_id: 1)
57
- assert_equal({ parent_id: 1 }, item.scope_condition)
58
- assert_equal "pos", item.position_column
59
- end
60
-
61
- def test_insert
62
- new = ListMixin.create(parent_id: 20)
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.acts_as_list_no_update { ListMixin.create(parent_id: 20) }
73
- assert_equal_or_nil $default_position, new.pos
74
- assert_equal $default_position.is_a?(Integer), new.first?
75
- assert !new.last?
76
-
77
- new = ListMixin.create(parent_id: 20)
78
- assert_equal 3, new.pos
79
- assert !new.first?
80
- assert new.last?
81
-
82
- new = ListMixin.create(parent_id: 0)
83
- assert_equal 1, new.pos
84
- assert new.first?
85
- assert new.last?
86
- end
87
-
88
- def test_insert_at
89
- new = ListMixin.create(parent_id: 20)
90
- assert_equal 1, new.pos
91
-
92
- new = ListMixin.create(parent_id: 20)
93
- assert_equal 2, new.pos
94
-
95
- new = ListMixin.create(parent_id: 20)
96
- assert_equal 3, new.pos
97
-
98
- new_noup = ListMixin.acts_as_list_no_update { ListMixin.create(parent_id: 20) }
99
- assert_equal_or_nil $default_position, new_noup.pos
100
-
101
- new4 = ListMixin.create(parent_id: 20)
102
- assert_equal 4, new4.pos
103
-
104
- new4.insert_at(3)
105
- assert_equal 3, new4.pos
106
-
107
- new.reload
108
- assert_equal 4, new.pos
109
-
110
- new.insert_at(2)
111
- assert_equal 2, new.pos
112
-
113
- new4.reload
114
- assert_equal 4, new4.pos
115
-
116
- new5 = ListMixin.create(parent_id: 20)
117
- assert_equal 5, new5.pos
118
-
119
- new5.insert_at(1)
120
- assert_equal 1, new5.pos
121
-
122
- new4.reload
123
- assert_equal 5, new4.pos
124
-
125
- new_noup.reload
126
- assert_equal_or_nil $default_position, new_noup.pos
127
-
128
- last1 = ListMixin.where('pos IS NOT NULL').order('pos').last
129
- last2 = ListMixin.where('pos IS NOT NULL').order('pos').last
130
- last1.insert_at(1)
131
- last2.insert_at(1)
132
- pos_list = ListMixin.where(parent_id: 20).order("pos ASC#{' NULLS FIRST' if ENV['DB'] == 'postgresql'}").map(&:pos)
133
- assert_equal [$default_position, 1, 2, 3, 4, 5], pos_list
134
- end
135
-
136
- def test_insert_at_after_dup
137
- new1 = ListMixin.create(parent_id: 20)
138
- new2 = ListMixin.create(parent_id: 20)
139
- new3 = ListMixin.create(parent_id: 20)
140
-
141
- duped = new1.dup
142
- duped.save
143
- [new1, new2, new3, duped].map(&:reload)
144
-
145
- assert_equal [1, 2, 3, 4], [duped.pos, new1.pos, new2.pos, new3.pos]
146
- end
147
-
148
- def test_delete_middle
149
- assert_equal [1, 2, 3, 4], ListMixin.where(parent_id: 5).order('pos').map(&:id)
150
-
151
- ListMixin.where(id: 2).first.destroy
152
-
153
- assert_equal [1, 3, 4], ListMixin.where(parent_id: 5).order('pos').map(&:id)
154
-
155
- assert_equal 1, ListMixin.where(id: 1).first.pos
156
- assert_equal 2, ListMixin.where(id: 3).first.pos
157
- assert_equal 3, ListMixin.where(id: 4).first.pos
158
-
159
- ListMixin.where(id: 1).first.destroy
160
-
161
- assert_equal [3, 4], ListMixin.where(parent_id: 5).order('pos').map(&:id)
162
-
163
- assert_equal 1, ListMixin.where(id: 3).first.pos
164
- assert_equal 2, ListMixin.where(id: 4).first.pos
165
-
166
- ListMixin.acts_as_list_no_update { ListMixin.where(id: 3).first.destroy }
167
-
168
- assert_equal [4], ListMixin.where(parent_id: 5).order('pos').map(&:id)
169
-
170
- assert_equal 2, ListMixin.where(id: 4).first.pos
171
- end
172
-
173
- def test_with_string_based_scope
174
- new = ListWithStringScopeMixin.create(parent_id: 500)
175
- assert_equal 1, new.pos
176
- assert new.first?
177
- assert new.last?
178
- end
179
-
180
- def test_nil_scope
181
- new1, new2, new3 = ListMixin.create, ListMixin.create, ListMixin.create
182
- new2.move_higher
183
- assert_equal [new2, new1, new3].map(&:id), ListMixin.where(parent_id: nil).order('pos').map(&:id)
184
- end
185
-
186
- def test_update_position_when_scope_changes
187
- assert_equal [1, 2, 3, 4], ListMixin.where(parent_id: 5).order('pos').map(&:id)
188
- ListMixin.create(parent_id: 6)
189
-
190
- ListMixin.where(id: 2).first.move_within_scope(6)
191
-
192
- assert_equal 2, ListMixin.where(id: 2).first.pos
193
-
194
- assert_equal [1, 3, 4], ListMixin.where(parent_id: 5).order('pos').map(&:id)
195
-
196
- assert_equal 1, ListMixin.where(id: 1).first.pos
197
- assert_equal 2, ListMixin.where(id: 3).first.pos
198
- assert_equal 3, ListMixin.where(id: 4).first.pos
199
-
200
- ListMixin.where(id: 2).first.move_within_scope(5)
201
- assert_equal [1, 3, 4, 2], ListMixin.where(parent_id: 5).order('pos').map(&:id)
202
- end
203
-
204
- def test_remove_from_list_should_then_fail_in_list?
205
- assert_equal true, ListMixin.where(id: 1).first.in_list?
206
- ListMixin.where(id: 1).first.remove_from_list
207
- assert_equal false, ListMixin.where(id: 1).first.in_list?
208
- end
209
-
210
- def test_remove_from_list_should_set_position_to_nil
211
- assert_equal [1, 2, 3, 4], ListMixin.where(parent_id: 5).order('pos').map(&:id)
212
-
213
- ListMixin.where(id: 2).first.remove_from_list
214
-
215
- assert_equal 1, ListMixin.where(id: 1).first.pos
216
- assert_nil ListMixin.where(id: 2).first.pos
217
- assert_equal 2, ListMixin.where(id: 3).first.pos
218
- assert_equal 3, ListMixin.where(id: 4).first.pos
219
- end
220
-
221
- def test_remove_before_destroy_does_not_shift_lower_items_twice
222
- assert_equal [1, 2, 3, 4], ListMixin.where(parent_id: 5).order('pos').map(&:id)
223
-
224
- ListMixin.where(id: 2).first.remove_from_list
225
- ListMixin.where(id: 2).first.destroy
226
-
227
- assert_equal [1, 3, 4], ListMixin.where(parent_id: 5).order('pos').map(&:id)
228
-
229
- assert_equal 1, ListMixin.where(id: 1).first.pos
230
- assert_equal 2, ListMixin.where(id: 3).first.pos
231
- assert_equal 3, ListMixin.where(id: 4).first.pos
232
- end
233
-
234
- def test_before_destroy_callbacks_do_not_update_position_to_nil_before_deleting_the_record
235
- assert_equal [1, 2, 3, 4], ListMixin.where(parent_id: 5).order('pos').map(&:id)
236
-
237
- # We need to trigger all the before_destroy callbacks without actually
238
- # destroying the record so we can see the affect the callbacks have on
239
- # the record.
240
- list = ListMixin.where(id: 2).first
241
- if list.respond_to?(:run_callbacks)
242
- list.run_callbacks(:destroy)
243
- else
244
- list.send(:callback, :before_destroy)
245
- end
246
-
247
- assert_equal [1, 2, 3, 4], ListMixin.where(parent_id: 5).order('pos').map(&:id)
248
-
249
- assert_equal 1, ListMixin.where(id: 1).first.pos
250
- assert_equal 2, ListMixin.where(id: 2).first.pos
251
- assert_equal 2, ListMixin.where(id: 3).first.pos
252
- assert_equal 3, ListMixin.where(id: 4).first.pos
253
- end
254
-
255
- def test_before_create_callback_adds_to_bottom
256
- assert_equal [1, 2, 3, 4], ListMixin.where(parent_id: 5).order('pos').map(&:id)
257
-
258
- new = ListMixin.create(parent_id: 5)
259
- assert_equal 5, new.pos
260
- assert !new.first?
261
- assert new.last?
262
-
263
- assert_equal [1, 2, 3, 4, 5], ListMixin.where(parent_id: 5).order('pos').map(&:id)
264
- end
265
-
266
- def test_before_create_callback_adds_to_given_position
267
- assert_equal [1, 2, 3, 4], ListMixin.where(parent_id: 5).order('pos').map(&:id)
268
-
269
- new = ListMixin.new(parent_id: 5)
270
- new.pos = 1
271
- new.save!
272
- assert_equal 1, new.pos
273
- assert new.first?
274
- assert !new.last?
275
-
276
- assert_equal [5, 1, 2, 3, 4], ListMixin.where(parent_id: 5).order('pos').map(&:id)
277
-
278
- new6 = ListMixin.new(parent_id: 5)
279
- new6.pos = 3
280
- new6.save!
281
- assert_equal 3, new6.pos
282
- assert !new6.first?
283
- assert !new6.last?
284
-
285
- assert_equal [5, 1, 6, 2, 3, 4], ListMixin.where(parent_id: 5).order('pos').map(&:id)
286
-
287
- new = ListMixin.new(parent_id: 5)
288
- new.pos = 3
289
- ListMixin.acts_as_list_no_update { new.save! }
290
- assert_equal 3, new.pos
291
- assert_equal 3, new6.pos
292
- assert !new.first?
293
- assert !new.last?
294
-
295
- assert_equal [5, 1, 6, 7, 2, 3, 4], ListMixin.where(parent_id: 5).order('pos, id').map(&:id)
296
- end
297
-
298
- def test_non_persisted_records_dont_get_lock_called
299
- new = ListMixin.new(parent_id: 5)
300
- new.destroy
301
- end
302
-
303
- def test_invalid_records_dont_get_inserted
304
- new = ListMixinError.new(parent_id: 5, state: nil)
305
- assert !new.valid?
306
- new.insert_at(1)
307
- assert !new.persisted?
308
- end
309
-
310
- def test_invalid_records_raise_error_with_insert_at!
311
- new = ListMixinError.new(parent_id: 5, state: nil)
312
- assert !new.valid?
313
- assert_raises ActiveRecord::RecordInvalid do
314
- new.insert_at!(1)
315
- end
316
- end
317
-
318
- def test_find_or_create_doesnt_raise_deprecation_warning
319
- assert_no_deprecation_warning_raised_by('ActiveRecord deprecation warning raised when using `find_or_create_by` when we didn\'t expect it') do
320
- ListMixin.where(parent_id: 5).find_or_create_by(pos: 5)
321
- end
322
- end
323
- end
324
- end
@@ -1,188 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Shared
4
- module ListSub
5
- def setup
6
- (1..4).each do |i|
7
- node = ((i % 2 == 1) ? ListMixinSub1 : ListMixinSub2).new parent_id: 5000
8
- node.pos = i
9
- node.save!
10
- end
11
- end
12
-
13
- def test_reordering
14
- assert_equal [1, 2, 3, 4], ListMixin.where(parent_id: 5000).order('pos').map(&:id)
15
-
16
- ListMixin.where(id: 2).first.move_lower
17
- assert_equal [1, 3, 2, 4], ListMixin.where(parent_id: 5000).order('pos').map(&:id)
18
-
19
- ListMixin.where(id: 2).first.move_higher
20
- assert_equal [1, 2, 3, 4], ListMixin.where(parent_id: 5000).order('pos').map(&:id)
21
-
22
- ListMixin.where(id: 1).first.move_to_bottom
23
- assert_equal [2, 3, 4, 1], ListMixin.where(parent_id: 5000).order('pos').map(&:id)
24
-
25
- ListMixin.where(id: 1).first.move_to_top
26
- assert_equal [1, 2, 3, 4], ListMixin.where(parent_id: 5000).order('pos').map(&:id)
27
-
28
- ListMixin.where(id: 2).first.move_to_bottom
29
- assert_equal [1, 3, 4, 2], ListMixin.where(parent_id: 5000).order('pos').map(&:id)
30
-
31
- ListMixin.where(id: 4).first.move_to_top
32
- assert_equal [4, 1, 3, 2], ListMixin.where(parent_id: 5000).order('pos').map(&:id)
33
- end
34
-
35
- def test_move_to_bottom_with_next_to_last_item
36
- assert_equal [1, 2, 3, 4], ListMixin.where(parent_id: 5000).order('pos').map(&:id)
37
- ListMixin.where(id: 3).first.move_to_bottom
38
- assert_equal [1, 2, 4, 3], ListMixin.where(parent_id: 5000).order('pos').map(&:id)
39
- end
40
-
41
- def test_next_prev
42
- assert_equal ListMixin.where(id: 2).first, ListMixin.where(id: 1).first.lower_item
43
- assert_nil ListMixin.where(id: 1).first.higher_item
44
- assert_equal ListMixin.where(id: 3).first, ListMixin.where(id: 4).first.higher_item
45
- assert_nil ListMixin.where(id: 4).first.lower_item
46
- end
47
-
48
- def test_next_prev_not_regular_sequence
49
- ListMixin.all.each do |item|
50
- item.update pos: item.pos * 5
51
- end
52
-
53
- assert_equal [1, 2, 3, 4], ListMixin.where(parent_id: 5000).order('pos').map(&:id)
54
- assert_equal [5, 10, 15, 20], ListMixin.where(parent_id: 5000).order('id').map(&:pos)
55
-
56
- ListMixin.where(id: 2).first.move_lower
57
- assert_equal [1, 3, 2, 4], ListMixin.where(parent_id: 5000).order('pos').map(&:id)
58
- assert_equal [5, 15, 10, 20], ListMixin.where(parent_id: 5000).order('id').map(&:pos)
59
-
60
-
61
- ListMixin.where(id: 2).first.move_higher
62
- assert_equal [1, 2, 3, 4], ListMixin.where(parent_id: 5000).order('pos').map(&:id)
63
- assert_equal [5, 10, 15, 20], ListMixin.where(parent_id: 5000).order('id').map(&:pos)
64
-
65
- ListMixin.where(id: 1).first.move_to_bottom
66
- assert_equal [2, 3, 4, 1], ListMixin.where(parent_id: 5000).order('pos').map(&:id)
67
-
68
- ListMixin.where(id: 1).first.move_to_top
69
- assert_equal [1, 2, 3, 4], ListMixin.where(parent_id: 5000).order('pos').map(&:id)
70
-
71
- ListMixin.where(id: 2).first.move_to_bottom
72
- assert_equal [1, 3, 4, 2], ListMixin.where(parent_id: 5000).order('pos').map(&:id)
73
-
74
- ListMixin.where(id: 4).first.move_to_top
75
- assert_equal [4, 1, 3, 2], ListMixin.where(parent_id: 5000).order('pos').map(&:id)
76
- end
77
-
78
- def test_next_prev_groups
79
- li1 = ListMixin.where(id: 1).first
80
- li2 = ListMixin.where(id: 2).first
81
- li3 = ListMixin.where(id: 3).first
82
- li4 = ListMixin.where(id: 4).first
83
- assert_equal [li2, li3, li4], li1.lower_items
84
- assert_equal [li4], li3.lower_items
85
- assert_equal [li2, li3], li1.lower_items(2)
86
- assert_equal [], li4.lower_items
87
-
88
- assert_equal [li2, li1], li3.higher_items
89
- assert_equal [li1], li2.higher_items
90
- assert_equal [li3, li2], li4.higher_items(2)
91
- assert_equal [], li1.higher_items
92
- end
93
-
94
- def test_next_prev_groups_with_same_position
95
- li1 = ListMixin.where(id: 1).first
96
- li2 = ListMixin.where(id: 2).first
97
- li3 = ListMixin.where(id: 3).first
98
- li4 = ListMixin.where(id: 4).first
99
-
100
- li3.update_column(:pos, 2) # Make the same position as li2
101
-
102
- assert_equal [1, 2, 2, 4], ListMixin.order(:pos).pluck(:pos)
103
-
104
- assert_equal [li3, li4], li2.lower_items
105
- assert_equal [li2, li4], li3.lower_items
106
-
107
- assert_equal [li3, li1], li2.higher_items
108
- assert_equal [li2, li1], li3.higher_items
109
- end
110
-
111
- def test_injection
112
- item = ListMixin.new("parent_id"=>1)
113
- assert_equal({ parent_id: 1 }, item.scope_condition)
114
- assert_equal "pos", item.position_column
115
- end
116
-
117
- def test_insert_at
118
- new = ListMixin.create("parent_id" => 20)
119
- assert_equal 1, new.pos
120
-
121
- new = ListMixinSub1.create("parent_id" => 20)
122
- assert_equal 2, new.pos
123
-
124
- new = ListMixinSub1.create("parent_id" => 20)
125
- assert_equal 3, new.pos
126
-
127
- new_noup = ListMixinSub1.acts_as_list_no_update { ListMixinSub1.create("parent_id" => 20) }
128
- assert_equal_or_nil $default_position, new_noup.pos
129
-
130
- new4 = ListMixin.create("parent_id" => 20)
131
- assert_equal 4, new4.pos
132
-
133
- new4.insert_at(3)
134
- assert_equal 3, new4.pos
135
-
136
- new.reload
137
- assert_equal 4, new.pos
138
-
139
- new.insert_at(2)
140
- assert_equal 2, new.pos
141
-
142
- new4.reload
143
- assert_equal 4, new4.pos
144
-
145
- new5 = ListMixinSub1.create("parent_id" => 20)
146
- assert_equal 5, new5.pos
147
-
148
- new5.insert_at(1)
149
- assert_equal 1, new5.pos
150
-
151
- new4.reload
152
- assert_equal 5, new4.pos
153
-
154
- new_noup.reload
155
- assert_equal_or_nil $default_position, new_noup.pos
156
- end
157
-
158
- def test_delete_middle
159
- assert_equal [1, 2, 3, 4], ListMixin.where(parent_id: 5000).order('pos').map(&:id)
160
-
161
- ListMixin.where(id: 2).first.destroy
162
-
163
- assert_equal [1, 3, 4], ListMixin.where(parent_id: 5000).order('pos').map(&:id)
164
-
165
- assert_equal 1, ListMixin.where(id: 1).first.pos
166
- assert_equal 2, ListMixin.where(id: 3).first.pos
167
- assert_equal 3, ListMixin.where(id: 4).first.pos
168
-
169
- ListMixin.where(id: 1).first.destroy
170
-
171
- assert_equal [3, 4], ListMixin.where(parent_id: 5000).order('pos').map(&:id)
172
-
173
- assert_equal 1, ListMixin.where(id: 3).first.pos
174
- assert_equal 2, ListMixin.where(id: 4).first.pos
175
-
176
- ListMixin.acts_as_list_no_update { ListMixin.where(id: 3).first.destroy }
177
-
178
- assert_equal [4], ListMixin.where(parent_id: 5000).order('pos').map(&:id)
179
-
180
- assert_equal 2, ListMixin.where(id: 4).first.pos
181
- end
182
-
183
- def test_acts_as_list_class
184
- assert_equal TheBaseClass, TheBaseSubclass.new.acts_as_list_class
185
- assert_equal TheAbstractSubclass, TheAbstractSubclass.new.acts_as_list_class
186
- end
187
- end
188
- end