acts_as_paranoid 0.6.2 → 0.7.3
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +126 -10
- data/CONTRIBUTING.md +59 -0
- data/README.md +151 -57
- data/lib/acts_as_paranoid.rb +29 -29
- data/lib/acts_as_paranoid/associations.rb +21 -17
- data/lib/acts_as_paranoid/core.rb +151 -95
- data/lib/acts_as_paranoid/relation.rb +9 -0
- data/lib/acts_as_paranoid/validations.rb +8 -74
- data/lib/acts_as_paranoid/version.rb +3 -1
- data/test/test_associations.rb +118 -46
- data/test/test_core.rb +264 -66
- data/test/test_default_scopes.rb +20 -7
- data/test/test_dependent_recovery.rb +54 -0
- data/test/test_deprecated_behavior.rb +30 -0
- data/test/test_helper.rb +130 -95
- data/test/test_inheritance.rb +3 -1
- data/test/test_relations.rb +98 -16
- data/test/test_table_namespace.rb +40 -0
- data/test/test_validations.rb +27 -7
- metadata +78 -32
- data/lib/acts_as_paranoid/preloader_association.rb +0 -16
- data/test/test_preloader_association.rb +0 -27
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActsAsParanoid
|
2
4
|
module Relation
|
3
5
|
def self.included(base)
|
@@ -28,6 +30,13 @@ module ActsAsParanoid
|
|
28
30
|
end
|
29
31
|
|
30
32
|
def destroy!(id_or_array)
|
33
|
+
destroy_fully! id_or_array
|
34
|
+
end
|
35
|
+
|
36
|
+
deprecate :destroy!,
|
37
|
+
deprecator: ActiveSupport::Deprecation.new("0.8.0", "ActsAsParanoid")
|
38
|
+
|
39
|
+
def destroy_fully!(id_or_array)
|
31
40
|
where(primary_key => id_or_array).orig_delete_all
|
32
41
|
end
|
33
42
|
end
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/core_ext/array/wrap"
|
2
4
|
|
3
5
|
module ActsAsParanoid
|
4
6
|
module Validations
|
@@ -6,85 +8,17 @@ module ActsAsParanoid
|
|
6
8
|
base.extend ClassMethods
|
7
9
|
end
|
8
10
|
|
9
|
-
class UniquenessWithoutDeletedValidator
|
10
|
-
|
11
|
-
name = "V#{version.to_s.tr('.', '_')}"
|
12
|
-
unless constants.include? name.to_sym
|
13
|
-
raise "Unknown validator version #{name.inspect}; expected one of #{constants.sort.join(', ')}"
|
14
|
-
end
|
15
|
-
const_get name
|
16
|
-
end
|
17
|
-
|
18
|
-
class V5 < ActiveRecord::Validations::UniquenessValidator
|
19
|
-
def validate_each(record, attribute, value)
|
20
|
-
finder_class = find_finder_class_for(record)
|
21
|
-
table = finder_class.arel_table
|
22
|
-
|
23
|
-
relation = build_relation(finder_class, attribute, value)
|
24
|
-
[Array(finder_class.primary_key), Array(record.send(:id))].transpose.each do |pk_key, pk_value|
|
25
|
-
relation = relation.where(table[pk_key.to_sym].not_eq(pk_value))
|
26
|
-
end if record.persisted?
|
27
|
-
|
28
|
-
Array.wrap(options[:scope]).each do |scope_item|
|
29
|
-
relation = relation.where(table[scope_item].eq(record.public_send(scope_item)))
|
30
|
-
end
|
31
|
-
|
32
|
-
if relation.where(finder_class.paranoid_default_scope).exists?(relation)
|
33
|
-
record.errors.add(attribute, :taken, options.except(:case_sensitive, :scope).merge(:value => value))
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
protected
|
38
|
-
|
39
|
-
def build_relation(klass, attribute, value)
|
40
|
-
if ActiveRecord::VERSION::MINOR == 0 && ActiveRecord::VERSION::MAJOR == 5
|
41
|
-
return super(klass, klass.arel_table, attribute, value)
|
42
|
-
else
|
43
|
-
super
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
class V4 < ActiveRecord::Validations::UniquenessValidator
|
49
|
-
def validate_each(record, attribute, value)
|
50
|
-
finder_class = find_finder_class_for(record)
|
51
|
-
table = finder_class.arel_table
|
52
|
-
|
53
|
-
# TODO: Use record.class.column_types[attribute.to_s].coder ?
|
54
|
-
coder = record.class.column_types[attribute.to_s]
|
55
|
-
|
56
|
-
if value && coder
|
57
|
-
value = if coder.respond_to? :type_cast_for_database
|
58
|
-
coder.type_cast_for_database value
|
59
|
-
else
|
60
|
-
coder.type_cast_for_write value
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
relation = build_relation(finder_class, table, attribute, value)
|
65
|
-
[Array(finder_class.primary_key), Array(record.send(:id))].transpose.each do |pk_key, pk_value|
|
66
|
-
relation = relation.and(table[pk_key.to_sym].not_eq(pk_value))
|
67
|
-
end if record.persisted?
|
68
|
-
|
69
|
-
Array.wrap(options[:scope]).each do |scope_item|
|
70
|
-
scope_value = record.send(scope_item)
|
71
|
-
relation = relation.and(table[scope_item].eq(scope_value))
|
72
|
-
end
|
73
|
-
|
74
|
-
# Re-add ActsAsParanoid default scope conditions manually.
|
75
|
-
if finder_class.unscoped.where(finder_class.paranoid_default_scope).where(relation).exists?
|
76
|
-
record.errors.add(attribute, :taken, options.except(:case_sensitive, :scope).merge(:value => value))
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
11
|
+
class UniquenessWithoutDeletedValidator < ActiveRecord::Validations::UniquenessValidator
|
12
|
+
private
|
80
13
|
|
81
|
-
|
14
|
+
def build_relation(klass, attribute, value)
|
15
|
+
super.where(klass.paranoid_default_scope)
|
82
16
|
end
|
83
17
|
end
|
84
18
|
|
85
19
|
module ClassMethods
|
86
20
|
def validates_uniqueness_of_without_deleted(*attr_names)
|
87
|
-
validates_with UniquenessWithoutDeletedValidator
|
21
|
+
validates_with UniquenessWithoutDeletedValidator, _merge_attributes(attr_names)
|
88
22
|
end
|
89
23
|
end
|
90
24
|
end
|
data/test/test_associations.rb
CHANGED
@@ -1,27 +1,34 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
2
4
|
|
3
5
|
class AssociationsTest < ParanoidBaseTest
|
4
|
-
def
|
5
|
-
|
6
|
-
|
7
|
-
paranoid_company_1.paranoid_products.create! :name => "ParanoidProduct #1"
|
8
|
-
paranoid_company_2.paranoid_products.create! :name => "ParanoidProduct #2"
|
6
|
+
def test_removal_with_destroy_associations
|
7
|
+
paranoid_company = ParanoidDestroyCompany.create! name: "ParanoidDestroyCompany #1"
|
8
|
+
paranoid_company.paranoid_products.create! name: "ParanoidProduct #1"
|
9
9
|
|
10
10
|
assert_equal 1, ParanoidDestroyCompany.count
|
11
|
-
assert_equal 1,
|
12
|
-
assert_equal 2, ParanoidProduct.count
|
11
|
+
assert_equal 1, ParanoidProduct.count
|
13
12
|
|
14
13
|
ParanoidDestroyCompany.first.destroy
|
15
14
|
assert_equal 0, ParanoidDestroyCompany.count
|
16
|
-
assert_equal
|
15
|
+
assert_equal 0, ParanoidProduct.count
|
17
16
|
assert_equal 1, ParanoidDestroyCompany.with_deleted.count
|
18
|
-
assert_equal
|
17
|
+
assert_equal 1, ParanoidProduct.with_deleted.count
|
19
18
|
|
20
19
|
ParanoidDestroyCompany.with_deleted.first.destroy
|
21
20
|
assert_equal 0, ParanoidDestroyCompany.count
|
22
|
-
assert_equal
|
21
|
+
assert_equal 0, ParanoidProduct.count
|
23
22
|
assert_equal 0, ParanoidDestroyCompany.with_deleted.count
|
24
|
-
assert_equal
|
23
|
+
assert_equal 0, ParanoidProduct.with_deleted.count
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_removal_with_delete_all_associations
|
27
|
+
paranoid_company = ParanoidDeleteCompany.create! name: "ParanoidDestroyCompany #1"
|
28
|
+
paranoid_company.paranoid_products.create! name: "ParanoidProduct #2"
|
29
|
+
|
30
|
+
assert_equal 1, ParanoidDeleteCompany.count
|
31
|
+
assert_equal 1, ParanoidProduct.count
|
25
32
|
|
26
33
|
ParanoidDeleteCompany.first.destroy
|
27
34
|
assert_equal 0, ParanoidDeleteCompany.count
|
@@ -38,17 +45,20 @@ class AssociationsTest < ParanoidBaseTest
|
|
38
45
|
|
39
46
|
def test_belongs_to_with_scope_option
|
40
47
|
paranoid_has_many_dependant = ParanoidHasManyDependant.new
|
41
|
-
includes_values = ParanoidTime.includes(:not_paranoid).includes_values
|
42
48
|
|
43
|
-
|
49
|
+
expected_includes_values = ParanoidTime.includes(:not_paranoid).includes_values
|
50
|
+
includes_values = paranoid_has_many_dependant
|
51
|
+
.association(:paranoid_time_with_scope).scope.includes_values
|
44
52
|
|
45
|
-
|
53
|
+
assert_equal expected_includes_values, includes_values
|
54
|
+
|
55
|
+
paranoid_time = ParanoidTime.create(name: "not-hello")
|
46
56
|
paranoid_has_many_dependant.paranoid_time = paranoid_time
|
47
57
|
paranoid_has_many_dependant.save!
|
48
58
|
|
49
59
|
assert_nil paranoid_has_many_dependant.paranoid_time_with_scope
|
50
60
|
|
51
|
-
paranoid_time.update(name:
|
61
|
+
paranoid_time.update(name: "hello")
|
52
62
|
|
53
63
|
paranoid_has_many_dependant.reload
|
54
64
|
|
@@ -68,26 +78,29 @@ class AssociationsTest < ParanoidBaseTest
|
|
68
78
|
assert_equal includes_values, paranoid_has_many_dependant
|
69
79
|
.association(:paranoid_time_with_scope_with_deleted).scope.includes_values
|
70
80
|
|
71
|
-
paranoid_time = ParanoidTime.create(name:
|
81
|
+
paranoid_time = ParanoidTime.create(name: "not-hello")
|
72
82
|
paranoid_has_many_dependant.paranoid_time = paranoid_time
|
73
83
|
paranoid_has_many_dependant.save!
|
74
84
|
|
75
85
|
assert_nil paranoid_has_many_dependant.paranoid_time_with_scope_with_deleted
|
76
86
|
|
77
|
-
paranoid_time.update(name:
|
87
|
+
paranoid_time.update(name: "hello")
|
78
88
|
paranoid_has_many_dependant.reload
|
79
89
|
|
80
|
-
assert_equal paranoid_time, paranoid_has_many_dependant
|
90
|
+
assert_equal paranoid_time, paranoid_has_many_dependant
|
91
|
+
.paranoid_time_with_scope_with_deleted
|
81
92
|
|
82
93
|
paranoid_time.destroy
|
83
94
|
paranoid_has_many_dependant.reload
|
84
95
|
|
85
|
-
assert_equal paranoid_time, paranoid_has_many_dependant
|
96
|
+
assert_equal paranoid_time, paranoid_has_many_dependant
|
97
|
+
.paranoid_time_with_scope_with_deleted
|
86
98
|
end
|
87
99
|
|
88
100
|
def test_belongs_to_with_deleted
|
89
101
|
paranoid_time = ParanoidTime.first
|
90
|
-
paranoid_has_many_dependant = paranoid_time.paranoid_has_many_dependants
|
102
|
+
paranoid_has_many_dependant = paranoid_time.paranoid_has_many_dependants
|
103
|
+
.create(name: "dependant!")
|
91
104
|
|
92
105
|
assert_equal paranoid_time, paranoid_has_many_dependant.paranoid_time
|
93
106
|
assert_equal paranoid_time, paranoid_has_many_dependant.paranoid_time_with_deleted
|
@@ -101,20 +114,25 @@ class AssociationsTest < ParanoidBaseTest
|
|
101
114
|
|
102
115
|
def test_belongs_to_polymorphic_with_deleted
|
103
116
|
paranoid_time = ParanoidTime.first
|
104
|
-
paranoid_has_many_dependant = ParanoidHasManyDependant
|
117
|
+
paranoid_has_many_dependant = ParanoidHasManyDependant
|
118
|
+
.create!(name: "dependant!", paranoid_time_polymorphic_with_deleted: paranoid_time)
|
105
119
|
|
106
120
|
assert_equal paranoid_time, paranoid_has_many_dependant.paranoid_time
|
107
|
-
assert_equal paranoid_time, paranoid_has_many_dependant
|
121
|
+
assert_equal paranoid_time, paranoid_has_many_dependant
|
122
|
+
.paranoid_time_polymorphic_with_deleted
|
108
123
|
|
109
124
|
paranoid_time.destroy
|
110
125
|
|
111
126
|
assert_nil paranoid_has_many_dependant.reload.paranoid_time
|
112
|
-
assert_equal paranoid_time, paranoid_has_many_dependant
|
127
|
+
assert_equal paranoid_time, paranoid_has_many_dependant
|
128
|
+
.reload.paranoid_time_polymorphic_with_deleted
|
113
129
|
end
|
114
130
|
|
115
131
|
def test_belongs_to_nil_polymorphic_with_deleted
|
116
132
|
paranoid_time = ParanoidTime.first
|
117
|
-
paranoid_has_many_dependant =
|
133
|
+
paranoid_has_many_dependant =
|
134
|
+
ParanoidHasManyDependant.create!(name: "dependant!",
|
135
|
+
paranoid_time_polymorphic_with_deleted: nil)
|
118
136
|
|
119
137
|
assert_nil paranoid_has_many_dependant.paranoid_time
|
120
138
|
assert_nil paranoid_has_many_dependant.paranoid_time_polymorphic_with_deleted
|
@@ -126,19 +144,23 @@ class AssociationsTest < ParanoidBaseTest
|
|
126
144
|
end
|
127
145
|
|
128
146
|
def test_belongs_to_options
|
129
|
-
paranoid_time = ParanoidHasManyDependant.reflections
|
147
|
+
paranoid_time = ParanoidHasManyDependant.reflections
|
148
|
+
.with_indifferent_access[:paranoid_time]
|
130
149
|
assert_equal :belongs_to, paranoid_time.macro
|
131
150
|
assert_nil paranoid_time.options[:with_deleted]
|
132
151
|
end
|
133
152
|
|
134
153
|
def test_belongs_to_with_deleted_options
|
135
|
-
paranoid_time_with_deleted =
|
154
|
+
paranoid_time_with_deleted =
|
155
|
+
ParanoidHasManyDependant.reflections
|
156
|
+
.with_indifferent_access[:paranoid_time_with_deleted]
|
136
157
|
assert_equal :belongs_to, paranoid_time_with_deleted.macro
|
137
158
|
assert paranoid_time_with_deleted.options[:with_deleted]
|
138
159
|
end
|
139
160
|
|
140
161
|
def test_belongs_to_polymorphic_with_deleted_options
|
141
|
-
paranoid_time_polymorphic_with_deleted = ParanoidHasManyDependant.reflections
|
162
|
+
paranoid_time_polymorphic_with_deleted = ParanoidHasManyDependant.reflections
|
163
|
+
.with_indifferent_access[:paranoid_time_polymorphic_with_deleted]
|
142
164
|
assert_equal :belongs_to, paranoid_time_polymorphic_with_deleted.macro
|
143
165
|
assert paranoid_time_polymorphic_with_deleted.options[:with_deleted]
|
144
166
|
end
|
@@ -161,6 +183,50 @@ class AssociationsTest < ParanoidBaseTest
|
|
161
183
|
assert_equal [child], parent.paranoid_has_many_dependants.with_deleted.to_a
|
162
184
|
end
|
163
185
|
|
186
|
+
def test_join_with_model_with_deleted
|
187
|
+
obj = ParanoidHasManyDependant.create(paranoid_time: ParanoidTime.create)
|
188
|
+
assert_not_nil obj.paranoid_time
|
189
|
+
assert_not_nil obj.paranoid_time_with_deleted
|
190
|
+
|
191
|
+
obj.paranoid_time.destroy
|
192
|
+
obj.reload
|
193
|
+
|
194
|
+
assert_nil obj.paranoid_time
|
195
|
+
assert_not_nil obj.paranoid_time_with_deleted
|
196
|
+
|
197
|
+
# Note that obj is destroyed because of dependent: :destroy in ParanoidTime
|
198
|
+
assert obj.destroyed?
|
199
|
+
|
200
|
+
assert_empty ParanoidHasManyDependant.with_deleted.joins(:paranoid_time)
|
201
|
+
assert_equal [obj],
|
202
|
+
ParanoidHasManyDependant.with_deleted.joins(:paranoid_time_with_deleted)
|
203
|
+
end
|
204
|
+
|
205
|
+
def test_includes_with_deleted
|
206
|
+
paranoid_time = ParanoidTime.first
|
207
|
+
paranoid_time.paranoid_has_many_dependants.create(name: "dependant!")
|
208
|
+
|
209
|
+
paranoid_time.destroy
|
210
|
+
|
211
|
+
ParanoidHasManyDependant.with_deleted
|
212
|
+
.includes(:paranoid_time_with_deleted).each do |hasmany|
|
213
|
+
assert_not_nil hasmany.paranoid_time_with_deleted
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
def test_includes_with_deleted_with_polymorphic_parent
|
218
|
+
not_paranoid_parent = NotParanoidHasManyAsParent.create(name: "not paranoid parent")
|
219
|
+
paranoid_parent = ParanoidHasManyAsParent.create(name: "paranoid parent")
|
220
|
+
ParanoidBelongsToPolymorphic.create(name: "belongs_to", parent: not_paranoid_parent)
|
221
|
+
ParanoidBelongsToPolymorphic.create(name: "belongs_to", parent: paranoid_parent)
|
222
|
+
|
223
|
+
paranoid_parent.destroy
|
224
|
+
|
225
|
+
ParanoidBelongsToPolymorphic.with_deleted.includes(:parent).each do |hasmany|
|
226
|
+
assert_not_nil hasmany.parent
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
164
230
|
def test_cannot_find_a_paranoid_deleted_many_many_association
|
165
231
|
left = ParanoidManyManyParentLeft.create
|
166
232
|
right = ParanoidManyManyParentRight.create
|
@@ -171,8 +237,10 @@ class AssociationsTest < ParanoidBaseTest
|
|
171
237
|
left.reload
|
172
238
|
|
173
239
|
assert_equal [], left.paranoid_many_many_children, "Linking objects not deleted"
|
174
|
-
assert_equal [], left.paranoid_many_many_parent_rights,
|
175
|
-
|
240
|
+
assert_equal [], left.paranoid_many_many_parent_rights,
|
241
|
+
"Associated objects not unlinked"
|
242
|
+
assert_equal right, ParanoidManyManyParentRight.find(right.id),
|
243
|
+
"Associated object deleted"
|
176
244
|
end
|
177
245
|
|
178
246
|
def test_cannot_find_a_paranoid_destroyed_many_many_association
|
@@ -185,11 +253,13 @@ class AssociationsTest < ParanoidBaseTest
|
|
185
253
|
left.reload
|
186
254
|
|
187
255
|
assert_equal [], left.paranoid_many_many_children, "Linking objects not deleted"
|
188
|
-
assert_equal [], left.paranoid_many_many_parent_rights,
|
189
|
-
|
256
|
+
assert_equal [], left.paranoid_many_many_parent_rights,
|
257
|
+
"Associated objects not unlinked"
|
258
|
+
assert_equal right, ParanoidManyManyParentRight.find(right.id),
|
259
|
+
"Associated object deleted"
|
190
260
|
end
|
191
261
|
|
192
|
-
def
|
262
|
+
def test_cannot_find_a_has_many_through_object_when_its_linking_object_is_soft_destroyed
|
193
263
|
left = ParanoidManyManyParentLeft.create
|
194
264
|
right = ParanoidManyManyParentRight.create
|
195
265
|
left.paranoid_many_many_parent_rights << right
|
@@ -218,8 +288,10 @@ class AssociationsTest < ParanoidBaseTest
|
|
218
288
|
left.paranoid_many_many_parent_rights << right
|
219
289
|
|
220
290
|
child = left.paranoid_many_many_children.first
|
221
|
-
assert_equal left, child.paranoid_many_many_parent_left,
|
222
|
-
|
291
|
+
assert_equal left, child.paranoid_many_many_parent_left,
|
292
|
+
"Child's left parent is incorrect"
|
293
|
+
assert_equal right, child.paranoid_many_many_parent_right,
|
294
|
+
"Child's right parent is incorrect"
|
223
295
|
|
224
296
|
left.paranoid_many_many_parent_rights.clear
|
225
297
|
|
@@ -232,8 +304,10 @@ class AssociationsTest < ParanoidBaseTest
|
|
232
304
|
left.paranoid_many_many_parent_rights << right
|
233
305
|
|
234
306
|
child = left.paranoid_many_many_children.first
|
235
|
-
assert_equal left, child.paranoid_many_many_parent_left,
|
236
|
-
|
307
|
+
assert_equal left, child.paranoid_many_many_parent_left,
|
308
|
+
"Child's left parent is incorrect"
|
309
|
+
assert_equal right, child.paranoid_many_many_parent_right,
|
310
|
+
"Child's right parent is incorrect"
|
237
311
|
|
238
312
|
left.paranoid_many_many_parent_rights.destroy(right)
|
239
313
|
|
@@ -246,8 +320,10 @@ class AssociationsTest < ParanoidBaseTest
|
|
246
320
|
left.paranoid_many_many_parent_rights << right
|
247
321
|
|
248
322
|
child = left.paranoid_many_many_children.first
|
249
|
-
assert_equal left, child.paranoid_many_many_parent_left,
|
250
|
-
|
323
|
+
assert_equal left, child.paranoid_many_many_parent_left,
|
324
|
+
"Child's left parent is incorrect"
|
325
|
+
assert_equal right, child.paranoid_many_many_parent_right,
|
326
|
+
"Child's right parent is incorrect"
|
251
327
|
|
252
328
|
left.paranoid_many_many_parent_rights.delete(right)
|
253
329
|
|
@@ -270,13 +346,9 @@ class AssociationsTest < ParanoidBaseTest
|
|
270
346
|
assert_not_nil not_paranoid.paranoid_time
|
271
347
|
end
|
272
348
|
|
273
|
-
def
|
274
|
-
|
275
|
-
|
349
|
+
def test_mass_assignment_of_paranoid_column_disabled
|
350
|
+
assert_raises ActiveRecord::RecordNotSaved do
|
351
|
+
ParanoidTime.create! name: "Foo", deleted_at: Time.now
|
276
352
|
end
|
277
|
-
now = Time.now
|
278
|
-
record = ParanoidTime.create! :name => 'Foo', :deleted_at => now
|
279
|
-
assert_equal 'Foo', record.name
|
280
|
-
assert_equal now, record.deleted_at
|
281
353
|
end
|
282
354
|
end
|
data/test/test_core.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
2
4
|
|
3
5
|
class ParanoidTest < ParanoidBaseTest
|
4
6
|
def test_paranoid?
|
@@ -69,6 +71,13 @@ class ParanoidTest < ParanoidBaseTest
|
|
69
71
|
assert_not_nil pt.paranoid_value
|
70
72
|
end
|
71
73
|
|
74
|
+
def test_non_persisted_delete
|
75
|
+
pt = ParanoidTime.new
|
76
|
+
assert_nil pt.paranoid_value
|
77
|
+
pt.delete
|
78
|
+
assert_not_nil pt.paranoid_value
|
79
|
+
end
|
80
|
+
|
72
81
|
def test_non_persisted_destroy!
|
73
82
|
pt = ParanoidTime.new
|
74
83
|
assert_nil pt.paranoid_value
|
@@ -94,12 +103,69 @@ class ParanoidTest < ParanoidBaseTest
|
|
94
103
|
assert_equal 1, ParanoidString.count
|
95
104
|
end
|
96
105
|
|
106
|
+
def test_recovery!
|
107
|
+
ParanoidBoolean.first.destroy
|
108
|
+
ParanoidBoolean.create(name: "paranoid")
|
109
|
+
|
110
|
+
assert_raise do
|
111
|
+
ParanoidBoolean.only_deleted.first.recover!
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_recover_has_one_association
|
116
|
+
parent = ParanoidBoolean.create(name: "parent")
|
117
|
+
child = parent.create_paranoid_has_one_dependant(name: "child")
|
118
|
+
|
119
|
+
parent.destroy
|
120
|
+
assert parent.paranoid_has_one_dependant.destroyed?
|
121
|
+
|
122
|
+
parent.recover
|
123
|
+
refute parent.paranoid_has_one_dependant.destroyed?
|
124
|
+
|
125
|
+
child.reload
|
126
|
+
refute child.destroyed?
|
127
|
+
end
|
128
|
+
|
129
|
+
def test_recover_has_many_association
|
130
|
+
parent = ParanoidTime.create(name: "parent")
|
131
|
+
child = parent.paranoid_has_many_dependants.create(name: "child")
|
132
|
+
|
133
|
+
parent.destroy
|
134
|
+
assert child.destroyed?
|
135
|
+
|
136
|
+
parent.recover
|
137
|
+
assert_equal 1, parent.paranoid_has_many_dependants.count
|
138
|
+
|
139
|
+
child.reload
|
140
|
+
refute child.destroyed?
|
141
|
+
end
|
142
|
+
|
143
|
+
# Rails does not allow saving deleted records
|
144
|
+
def test_no_save_after_destroy
|
145
|
+
paranoid = ParanoidString.first
|
146
|
+
paranoid.destroy
|
147
|
+
paranoid.name = "Let's update!"
|
148
|
+
|
149
|
+
assert_not paranoid.save
|
150
|
+
assert_raises ActiveRecord::RecordNotSaved do
|
151
|
+
paranoid.save!
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
def test_scope_chaining
|
156
|
+
assert_equal 3, ParanoidBoolean.unscoped.with_deleted.count
|
157
|
+
assert_equal 0, ParanoidBoolean.unscoped.only_deleted.count
|
158
|
+
assert_equal 0, ParanoidBoolean.with_deleted.only_deleted.count
|
159
|
+
assert_equal 3, ParanoidBoolean.with_deleted.with_deleted.count
|
160
|
+
end
|
161
|
+
|
97
162
|
def setup_recursive_tests
|
98
163
|
@paranoid_time_object = ParanoidTime.first
|
99
164
|
|
100
165
|
# Create one extra ParanoidHasManyDependant record so that we can validate
|
101
166
|
# the correct dependants are recovered.
|
102
|
-
ParanoidTime.where(
|
167
|
+
ParanoidTime.where("id <> ?", @paranoid_time_object.id).first
|
168
|
+
.paranoid_has_many_dependants.create(name: "should not be recovered").destroy
|
103
169
|
|
104
170
|
@paranoid_boolean_count = ParanoidBoolean.count
|
105
171
|
|
@@ -108,20 +174,21 @@ class ParanoidTest < ParanoidBaseTest
|
|
108
174
|
assert_equal 1, NotParanoid.count
|
109
175
|
|
110
176
|
(1..3).each do |i|
|
111
|
-
has_many_object = @paranoid_time_object.paranoid_has_many_dependants
|
112
|
-
|
177
|
+
has_many_object = @paranoid_time_object.paranoid_has_many_dependants
|
178
|
+
.create(name: "has_many_#{i}")
|
179
|
+
has_many_object.create_paranoid_belongs_dependant(name: "belongs_to_#{i}")
|
113
180
|
has_many_object.save
|
114
181
|
|
115
|
-
paranoid_boolean = @paranoid_time_object.paranoid_booleans
|
116
|
-
|
182
|
+
paranoid_boolean = @paranoid_time_object.paranoid_booleans
|
183
|
+
.create(name: "boolean_#{i}")
|
184
|
+
paranoid_boolean.create_paranoid_has_one_dependant(name: "has_one_#{i}")
|
117
185
|
paranoid_boolean.save
|
118
186
|
|
119
|
-
@paranoid_time_object.not_paranoids.create(:
|
120
|
-
|
187
|
+
@paranoid_time_object.not_paranoids.create(name: "not_paranoid_a#{i}")
|
121
188
|
end
|
122
189
|
|
123
|
-
@paranoid_time_object.create_not_paranoid(:
|
124
|
-
@paranoid_time_object.create_has_one_not_paranoid(:
|
190
|
+
@paranoid_time_object.create_not_paranoid(name: "not_paranoid_belongs_to")
|
191
|
+
@paranoid_time_object.create_has_one_not_paranoid(name: "has_one_not_paranoid")
|
125
192
|
|
126
193
|
assert_equal 3, ParanoidTime.count
|
127
194
|
assert_equal 3, ParanoidHasManyDependant.count
|
@@ -172,7 +239,7 @@ class ParanoidTest < ParanoidBaseTest
|
|
172
239
|
@paranoid_time_object.destroy
|
173
240
|
@paranoid_time_object.reload
|
174
241
|
|
175
|
-
@paranoid_time_object.recover(:
|
242
|
+
@paranoid_time_object.recover(recursive: true)
|
176
243
|
|
177
244
|
assert_equal 3, ParanoidTime.count
|
178
245
|
assert_equal 3, ParanoidHasManyDependant.count
|
@@ -193,14 +260,14 @@ class ParanoidTest < ParanoidBaseTest
|
|
193
260
|
@paranoid_time_object.paranoid_has_many_dependants.first.destroy
|
194
261
|
end
|
195
262
|
Time.stub :now, 1.hour.ago do
|
196
|
-
@paranoid_time_object.paranoid_has_many_dependants
|
197
|
-
last.paranoid_belongs_dependant
|
198
|
-
destroy
|
263
|
+
@paranoid_time_object.paranoid_has_many_dependants
|
264
|
+
.last.paranoid_belongs_dependant
|
265
|
+
.destroy
|
199
266
|
end
|
200
267
|
@paranoid_time_object.destroy
|
201
268
|
@paranoid_time_object.reload
|
202
269
|
|
203
|
-
@paranoid_time_object.recover(:
|
270
|
+
@paranoid_time_object.recover(recursive: true)
|
204
271
|
|
205
272
|
assert_equal 3, ParanoidTime.count
|
206
273
|
assert_equal 2, ParanoidHasManyDependant.count
|
@@ -213,17 +280,17 @@ class ParanoidTest < ParanoidBaseTest
|
|
213
280
|
|
214
281
|
def test_recursive_recovery_for_belongs_to_polymorphic
|
215
282
|
child_1 = ParanoidAndroid.create
|
216
|
-
section_1 = ParanoidSection.create(:
|
283
|
+
section_1 = ParanoidSection.create(paranoid_thing: child_1)
|
217
284
|
|
218
|
-
child_2 = ParanoidPolygon.create(:
|
219
|
-
section_2 = ParanoidSection.create(:
|
285
|
+
child_2 = ParanoidPolygon.create(sides: 3)
|
286
|
+
section_2 = ParanoidSection.create(paranoid_thing: child_2)
|
220
287
|
|
221
288
|
assert_equal section_1.paranoid_thing, child_1
|
222
289
|
assert_equal section_1.paranoid_thing.class, ParanoidAndroid
|
223
290
|
assert_equal section_2.paranoid_thing, child_2
|
224
291
|
assert_equal section_2.paranoid_thing.class, ParanoidPolygon
|
225
292
|
|
226
|
-
parent = ParanoidTime.create(:
|
293
|
+
parent = ParanoidTime.create(name: "paranoid_parent")
|
227
294
|
parent.paranoid_sections << section_1
|
228
295
|
parent.paranoid_sections << section_2
|
229
296
|
|
@@ -254,7 +321,7 @@ class ParanoidTest < ParanoidBaseTest
|
|
254
321
|
@paranoid_time_object.destroy
|
255
322
|
@paranoid_time_object.reload
|
256
323
|
|
257
|
-
@paranoid_time_object.recover(:
|
324
|
+
@paranoid_time_object.recover(recursive: false)
|
258
325
|
|
259
326
|
assert_equal 3, ParanoidTime.count
|
260
327
|
assert_equal 0, ParanoidHasManyDependant.count
|
@@ -265,6 +332,24 @@ class ParanoidTest < ParanoidBaseTest
|
|
265
332
|
assert_equal 0, HasOneNotParanoid.count
|
266
333
|
end
|
267
334
|
|
335
|
+
def test_dirty
|
336
|
+
pt = ParanoidTime.create
|
337
|
+
pt.destroy
|
338
|
+
assert_not pt.changed?
|
339
|
+
end
|
340
|
+
|
341
|
+
def test_delete_dirty
|
342
|
+
pt = ParanoidTime.create
|
343
|
+
pt.delete
|
344
|
+
assert_not pt.changed?
|
345
|
+
end
|
346
|
+
|
347
|
+
def test_destroy_fully_dirty
|
348
|
+
pt = ParanoidTime.create
|
349
|
+
pt.destroy_fully!
|
350
|
+
assert_not pt.changed?
|
351
|
+
end
|
352
|
+
|
268
353
|
def test_deleted?
|
269
354
|
ParanoidTime.first.destroy
|
270
355
|
assert ParanoidTime.with_deleted.first.deleted?
|
@@ -273,6 +358,43 @@ class ParanoidTest < ParanoidBaseTest
|
|
273
358
|
assert ParanoidString.with_deleted.first.deleted?
|
274
359
|
end
|
275
360
|
|
361
|
+
def test_delete_deleted?
|
362
|
+
ParanoidTime.first.delete
|
363
|
+
assert ParanoidTime.with_deleted.first.deleted?
|
364
|
+
|
365
|
+
ParanoidString.first.delete
|
366
|
+
assert ParanoidString.with_deleted.first.deleted?
|
367
|
+
end
|
368
|
+
|
369
|
+
def test_destroy_fully_deleted?
|
370
|
+
object = ParanoidTime.first
|
371
|
+
object.destroy_fully!
|
372
|
+
assert object.deleted?
|
373
|
+
|
374
|
+
object = ParanoidString.first
|
375
|
+
object.destroy_fully!
|
376
|
+
assert object.deleted?
|
377
|
+
end
|
378
|
+
|
379
|
+
def test_deleted_fully?
|
380
|
+
ParanoidTime.first.destroy
|
381
|
+
assert_not ParanoidTime.with_deleted.first.deleted_fully?
|
382
|
+
|
383
|
+
ParanoidString.first.destroy
|
384
|
+
assert ParanoidString.with_deleted.first.deleted?
|
385
|
+
end
|
386
|
+
|
387
|
+
def test_delete_deleted_fully?
|
388
|
+
ParanoidTime.first.delete
|
389
|
+
assert_not ParanoidTime.with_deleted.first.deleted_fully?
|
390
|
+
end
|
391
|
+
|
392
|
+
def test_destroy_fully_deleted_fully?
|
393
|
+
object = ParanoidTime.first
|
394
|
+
object.destroy_fully!
|
395
|
+
assert object.deleted_fully?
|
396
|
+
end
|
397
|
+
|
276
398
|
def test_paranoid_destroy_callbacks
|
277
399
|
@paranoid_with_callback = ParanoidWithCallback.first
|
278
400
|
ParanoidWithCallback.transaction do
|
@@ -368,104 +490,126 @@ class ParanoidTest < ParanoidBaseTest
|
|
368
490
|
|
369
491
|
# Test string type columns that don't have a nil value when not deleted (Y/N for example)
|
370
492
|
def test_string_type_with_no_nil_value_before_destroy
|
371
|
-
ps = ParanoidString.create!(:
|
372
|
-
assert_equal 1, ParanoidString.where(:
|
493
|
+
ps = ParanoidString.create!(deleted: "not dead")
|
494
|
+
assert_equal 1, ParanoidString.where(id: ps).count
|
373
495
|
end
|
374
496
|
|
375
497
|
def test_string_type_with_no_nil_value_after_destroy
|
376
|
-
ps = ParanoidString.create!(:
|
498
|
+
ps = ParanoidString.create!(deleted: "not dead")
|
377
499
|
ps.destroy
|
378
|
-
assert_equal 0, ParanoidString.where(:
|
500
|
+
assert_equal 0, ParanoidString.where(id: ps).count
|
379
501
|
end
|
380
502
|
|
381
503
|
def test_string_type_with_no_nil_value_before_destroy_with_deleted
|
382
|
-
ps = ParanoidString.create!(:
|
383
|
-
assert_equal 1, ParanoidString.with_deleted.where(:
|
504
|
+
ps = ParanoidString.create!(deleted: "not dead")
|
505
|
+
assert_equal 1, ParanoidString.with_deleted.where(id: ps).count
|
384
506
|
end
|
385
507
|
|
386
508
|
def test_string_type_with_no_nil_value_after_destroy_with_deleted
|
387
|
-
ps = ParanoidString.create!(:
|
509
|
+
ps = ParanoidString.create!(deleted: "not dead")
|
388
510
|
ps.destroy
|
389
|
-
assert_equal 1, ParanoidString.with_deleted.where(:
|
511
|
+
assert_equal 1, ParanoidString.with_deleted.where(id: ps).count
|
390
512
|
end
|
391
513
|
|
392
514
|
def test_string_type_with_no_nil_value_before_destroy_only_deleted
|
393
|
-
ps = ParanoidString.create!(:
|
394
|
-
assert_equal 0, ParanoidString.only_deleted.where(:
|
515
|
+
ps = ParanoidString.create!(deleted: "not dead")
|
516
|
+
assert_equal 0, ParanoidString.only_deleted.where(id: ps).count
|
395
517
|
end
|
396
518
|
|
397
519
|
def test_string_type_with_no_nil_value_after_destroy_only_deleted
|
398
|
-
ps = ParanoidString.create!(:
|
520
|
+
ps = ParanoidString.create!(deleted: "not dead")
|
399
521
|
ps.destroy
|
400
|
-
assert_equal 1, ParanoidString.only_deleted.where(:
|
522
|
+
assert_equal 1, ParanoidString.only_deleted.where(id: ps).count
|
401
523
|
end
|
402
524
|
|
403
525
|
def test_string_type_with_no_nil_value_after_destroyed_twice
|
404
|
-
ps = ParanoidString.create!(:
|
526
|
+
ps = ParanoidString.create!(deleted: "not dead")
|
405
527
|
2.times { ps.destroy }
|
406
|
-
assert_equal 0, ParanoidString.with_deleted.where(:
|
528
|
+
assert_equal 0, ParanoidString.with_deleted.where(id: ps).count
|
407
529
|
end
|
408
530
|
|
409
531
|
# Test boolean type columns, that are not nullable
|
410
532
|
def test_boolean_type_with_no_nil_value_before_destroy
|
411
|
-
ps = ParanoidBooleanNotNullable.create!
|
412
|
-
assert_equal 1, ParanoidBooleanNotNullable.where(:
|
533
|
+
ps = ParanoidBooleanNotNullable.create!
|
534
|
+
assert_equal 1, ParanoidBooleanNotNullable.where(id: ps).count
|
413
535
|
end
|
414
536
|
|
415
537
|
def test_boolean_type_with_no_nil_value_after_destroy
|
416
|
-
ps = ParanoidBooleanNotNullable.create!
|
538
|
+
ps = ParanoidBooleanNotNullable.create!
|
417
539
|
ps.destroy
|
418
|
-
assert_equal 0, ParanoidBooleanNotNullable.where(:
|
540
|
+
assert_equal 0, ParanoidBooleanNotNullable.where(id: ps).count
|
419
541
|
end
|
420
542
|
|
421
543
|
def test_boolean_type_with_no_nil_value_before_destroy_with_deleted
|
422
|
-
ps = ParanoidBooleanNotNullable.create!
|
423
|
-
assert_equal 1, ParanoidBooleanNotNullable.with_deleted.where(:
|
544
|
+
ps = ParanoidBooleanNotNullable.create!
|
545
|
+
assert_equal 1, ParanoidBooleanNotNullable.with_deleted.where(id: ps).count
|
424
546
|
end
|
425
547
|
|
426
548
|
def test_boolean_type_with_no_nil_value_after_destroy_with_deleted
|
427
|
-
ps = ParanoidBooleanNotNullable.create!
|
549
|
+
ps = ParanoidBooleanNotNullable.create!
|
428
550
|
ps.destroy
|
429
|
-
assert_equal 1, ParanoidBooleanNotNullable.with_deleted.where(:
|
551
|
+
assert_equal 1, ParanoidBooleanNotNullable.with_deleted.where(id: ps).count
|
430
552
|
end
|
431
553
|
|
432
554
|
def test_boolean_type_with_no_nil_value_before_destroy_only_deleted
|
433
|
-
ps = ParanoidBooleanNotNullable.create!
|
434
|
-
assert_equal 0, ParanoidBooleanNotNullable.only_deleted.where(:
|
555
|
+
ps = ParanoidBooleanNotNullable.create!
|
556
|
+
assert_equal 0, ParanoidBooleanNotNullable.only_deleted.where(id: ps).count
|
435
557
|
end
|
436
558
|
|
437
559
|
def test_boolean_type_with_no_nil_value_after_destroy_only_deleted
|
438
|
-
ps = ParanoidBooleanNotNullable.create!
|
560
|
+
ps = ParanoidBooleanNotNullable.create!
|
439
561
|
ps.destroy
|
440
|
-
assert_equal 1, ParanoidBooleanNotNullable.only_deleted.where(:
|
562
|
+
assert_equal 1, ParanoidBooleanNotNullable.only_deleted.where(id: ps).count
|
441
563
|
end
|
442
564
|
|
443
565
|
def test_boolean_type_with_no_nil_value_after_destroyed_twice
|
444
|
-
ps = ParanoidBooleanNotNullable.create!
|
566
|
+
ps = ParanoidBooleanNotNullable.create!
|
445
567
|
2.times { ps.destroy }
|
446
|
-
assert_equal 0, ParanoidBooleanNotNullable.with_deleted.where(:
|
568
|
+
assert_equal 0, ParanoidBooleanNotNullable.with_deleted.where(id: ps).count
|
569
|
+
end
|
570
|
+
|
571
|
+
def test_boolean_type_with_no_nil_value_after_recover
|
572
|
+
ps = ParanoidBooleanNotNullable.create!
|
573
|
+
ps.destroy
|
574
|
+
assert_equal 1, ParanoidBooleanNotNullable.only_deleted.where(id: ps).count
|
575
|
+
|
576
|
+
ps.recover
|
577
|
+
assert_equal 1, ParanoidBooleanNotNullable.where(id: ps).count
|
578
|
+
end
|
579
|
+
|
580
|
+
def test_boolean_type_with_no_nil_value_after_recover!
|
581
|
+
ps = ParanoidBooleanNotNullable.create!
|
582
|
+
ps.destroy
|
583
|
+
assert_equal 1, ParanoidBooleanNotNullable.only_deleted.where(id: ps).count
|
584
|
+
|
585
|
+
ps.recover!
|
586
|
+
assert_equal 1, ParanoidBooleanNotNullable.where(id: ps).count
|
447
587
|
end
|
448
588
|
|
449
589
|
def test_no_double_tap_destroys_fully
|
450
|
-
ps = ParanoidNoDoubleTapDestroysFully.create!
|
590
|
+
ps = ParanoidNoDoubleTapDestroysFully.create!
|
451
591
|
2.times { ps.destroy }
|
452
|
-
assert_equal 1, ParanoidNoDoubleTapDestroysFully.with_deleted.where(:
|
592
|
+
assert_equal 1, ParanoidNoDoubleTapDestroysFully.with_deleted.where(id: ps).count
|
453
593
|
end
|
454
594
|
|
455
|
-
def
|
456
|
-
paranoid_boolean = ParanoidBoolean.create!
|
457
|
-
paranoid_with_counter_cache = ParanoidWithCounterCache
|
595
|
+
def test_decrement_counters_without_touch
|
596
|
+
paranoid_boolean = ParanoidBoolean.create!
|
597
|
+
paranoid_with_counter_cache = ParanoidWithCounterCache
|
598
|
+
.create!(paranoid_boolean: paranoid_boolean)
|
458
599
|
|
459
600
|
assert_equal 1, paranoid_boolean.paranoid_with_counter_caches_count
|
601
|
+
updated_at = paranoid_boolean.reload.updated_at
|
460
602
|
|
461
603
|
paranoid_with_counter_cache.destroy
|
462
604
|
|
463
605
|
assert_equal 0, paranoid_boolean.reload.paranoid_with_counter_caches_count
|
606
|
+
assert_equal updated_at, paranoid_boolean.reload.updated_at
|
464
607
|
end
|
465
608
|
|
466
609
|
def test_decrement_custom_counters
|
467
|
-
paranoid_boolean = ParanoidBoolean.create!
|
468
|
-
paranoid_with_custom_counter_cache = ParanoidWithCustomCounterCache
|
610
|
+
paranoid_boolean = ParanoidBoolean.create!
|
611
|
+
paranoid_with_custom_counter_cache = ParanoidWithCustomCounterCache
|
612
|
+
.create!(paranoid_boolean: paranoid_boolean)
|
469
613
|
|
470
614
|
assert_equal 1, paranoid_boolean.custom_counter_cache
|
471
615
|
|
@@ -474,15 +618,43 @@ class ParanoidTest < ParanoidBaseTest
|
|
474
618
|
assert_equal 0, paranoid_boolean.reload.custom_counter_cache
|
475
619
|
end
|
476
620
|
|
621
|
+
def test_decrement_counters_with_touch
|
622
|
+
paranoid_boolean = ParanoidBoolean.create!
|
623
|
+
paranoid_with_counter_cache = ParanoidWithTouchAndCounterCache
|
624
|
+
.create!(paranoid_boolean: paranoid_boolean)
|
625
|
+
|
626
|
+
assert_equal 1, paranoid_boolean.paranoid_with_touch_and_counter_caches_count
|
627
|
+
updated_at = paranoid_boolean.reload.updated_at
|
628
|
+
|
629
|
+
paranoid_with_counter_cache.destroy
|
630
|
+
|
631
|
+
assert_equal 0, paranoid_boolean.reload.paranoid_with_touch_and_counter_caches_count
|
632
|
+
assert_not_equal updated_at, paranoid_boolean.reload.updated_at
|
633
|
+
end
|
634
|
+
|
635
|
+
def test_touch_belongs_to
|
636
|
+
paranoid_boolean = ParanoidBoolean.create!
|
637
|
+
paranoid_with_counter_cache = ParanoidWithTouch
|
638
|
+
.create!(paranoid_boolean: paranoid_boolean)
|
639
|
+
|
640
|
+
updated_at = paranoid_boolean.reload.updated_at
|
641
|
+
|
642
|
+
paranoid_with_counter_cache.destroy
|
643
|
+
|
644
|
+
assert_not_equal updated_at, paranoid_boolean.reload.updated_at
|
645
|
+
end
|
646
|
+
|
477
647
|
def test_destroy_with_optional_belongs_to_and_counter_cache
|
478
|
-
ps = ParanoidWithCounterCacheOnOptionalBelognsTo.create!
|
648
|
+
ps = ParanoidWithCounterCacheOnOptionalBelognsTo.create!
|
479
649
|
ps.destroy
|
480
|
-
assert_equal 1, ParanoidWithCounterCacheOnOptionalBelognsTo.only_deleted
|
650
|
+
assert_equal 1, ParanoidWithCounterCacheOnOptionalBelognsTo.only_deleted
|
651
|
+
.where(id: ps).count
|
481
652
|
end
|
482
653
|
|
483
654
|
def test_hard_destroy_decrement_counters
|
484
|
-
paranoid_boolean = ParanoidBoolean.create!
|
485
|
-
paranoid_with_counter_cache = ParanoidWithCounterCache
|
655
|
+
paranoid_boolean = ParanoidBoolean.create!
|
656
|
+
paranoid_with_counter_cache = ParanoidWithCounterCache
|
657
|
+
.create!(paranoid_boolean: paranoid_boolean)
|
486
658
|
|
487
659
|
assert_equal 1, paranoid_boolean.paranoid_with_counter_caches_count
|
488
660
|
|
@@ -492,8 +664,9 @@ class ParanoidTest < ParanoidBaseTest
|
|
492
664
|
end
|
493
665
|
|
494
666
|
def test_hard_destroy_decrement_custom_counters
|
495
|
-
paranoid_boolean = ParanoidBoolean.create!
|
496
|
-
paranoid_with_custom_counter_cache = ParanoidWithCustomCounterCache
|
667
|
+
paranoid_boolean = ParanoidBoolean.create!
|
668
|
+
paranoid_with_custom_counter_cache = ParanoidWithCustomCounterCache
|
669
|
+
.create!(paranoid_boolean: paranoid_boolean)
|
497
670
|
|
498
671
|
assert_equal 1, paranoid_boolean.custom_counter_cache
|
499
672
|
|
@@ -503,8 +676,9 @@ class ParanoidTest < ParanoidBaseTest
|
|
503
676
|
end
|
504
677
|
|
505
678
|
def test_increment_counters
|
506
|
-
paranoid_boolean = ParanoidBoolean.create!
|
507
|
-
paranoid_with_counter_cache = ParanoidWithCounterCache
|
679
|
+
paranoid_boolean = ParanoidBoolean.create!
|
680
|
+
paranoid_with_counter_cache = ParanoidWithCounterCache
|
681
|
+
.create!(paranoid_boolean: paranoid_boolean)
|
508
682
|
|
509
683
|
assert_equal 1, paranoid_boolean.paranoid_with_counter_caches_count
|
510
684
|
|
@@ -518,8 +692,9 @@ class ParanoidTest < ParanoidBaseTest
|
|
518
692
|
end
|
519
693
|
|
520
694
|
def test_increment_custom_counters
|
521
|
-
paranoid_boolean = ParanoidBoolean.create!
|
522
|
-
paranoid_with_custom_counter_cache = ParanoidWithCustomCounterCache
|
695
|
+
paranoid_boolean = ParanoidBoolean.create!
|
696
|
+
paranoid_with_custom_counter_cache = ParanoidWithCustomCounterCache
|
697
|
+
.create!(paranoid_boolean: paranoid_boolean)
|
523
698
|
|
524
699
|
assert_equal 1, paranoid_boolean.custom_counter_cache
|
525
700
|
|
@@ -533,6 +708,29 @@ class ParanoidTest < ParanoidBaseTest
|
|
533
708
|
end
|
534
709
|
|
535
710
|
def test_explicitly_setting_table_name_after_acts_as_paranoid_macro
|
536
|
-
assert_equal "explicit_table.deleted_at", ParanoidWithExplicitTableNameAfterMacro
|
711
|
+
assert_equal "explicit_table.deleted_at", ParanoidWithExplicitTableNameAfterMacro
|
712
|
+
.paranoid_column_reference
|
713
|
+
end
|
714
|
+
|
715
|
+
def test_deleted_after_time
|
716
|
+
ParanoidTime.first.destroy
|
717
|
+
assert_equal 0, ParanoidTime.deleted_after_time(1.hour.from_now).count
|
718
|
+
assert_equal 1, ParanoidTime.deleted_after_time(1.hour.ago).count
|
719
|
+
end
|
720
|
+
|
721
|
+
def test_deleted_before_time
|
722
|
+
ParanoidTime.first.destroy
|
723
|
+
assert_equal 1, ParanoidTime.deleted_before_time(1.hour.from_now).count
|
724
|
+
assert_equal 0, ParanoidTime.deleted_before_time(1.hour.ago).count
|
725
|
+
end
|
726
|
+
|
727
|
+
def test_deleted_inside_time_window
|
728
|
+
ParanoidTime.first.destroy
|
729
|
+
assert_equal 1, ParanoidTime.deleted_inside_time_window(1.minute.ago, 2.minutes).count
|
730
|
+
assert_equal 1,
|
731
|
+
ParanoidTime.deleted_inside_time_window(1.minute.from_now, 2.minutes).count
|
732
|
+
assert_equal 0, ParanoidTime.deleted_inside_time_window(3.minutes.ago, 1.minute).count
|
733
|
+
assert_equal 0,
|
734
|
+
ParanoidTime.deleted_inside_time_window(3.minutes.from_now, 1.minute).count
|
537
735
|
end
|
538
736
|
end
|