1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
require "cases/helper"
require "models/invoice"
require "models/line_item"
require "models/topic"
require "models/node"
require "models/tree"
class TouchLaterTest < ActiveRecord::TestCase
fixtures :nodes, :trees
def test_touch_laster_raise_if_non_persisted
invoice = Invoice.new
Invoice.transaction do
assert_not invoice.persisted?
assert_raises(ActiveRecord::ActiveRecordError) do
invoice.touch_later
end
end
end
def test_touch_later_dont_set_dirty_attributes
invoice = Invoice.create!
invoice.touch_later
assert_not invoice.changed?
end
def test_touch_later_respects_no_touching_policy
time = Time.now.utc - 25.days
topic = Topic.create!(updated_at: time, created_at: time)
Topic.no_touching do
topic.touch_later
end
assert_equal time.to_i, topic.updated_at.to_i
end
def test_touch_later_update_the_attributes
time = Time.now.utc - 25.days
topic = Topic.create!(updated_at: time, created_at: time)
assert_equal time.to_i, topic.updated_at.to_i
assert_equal time.to_i, topic.created_at.to_i
Topic.transaction do
topic.touch_later(:created_at)
assert_not_equal time.to_i, topic.updated_at.to_i
assert_not_equal time.to_i, topic.created_at.to_i
assert_equal time.to_i, topic.reload.updated_at.to_i
assert_equal time.to_i, topic.reload.created_at.to_i
end
assert_not_equal time.to_i, topic.reload.updated_at.to_i
assert_not_equal time.to_i, topic.reload.created_at.to_i
end
def test_touch_touches_immediately
time = Time.now.utc - 25.days
topic = Topic.create!(updated_at: time, created_at: time)
assert_equal time.to_i, topic.updated_at.to_i
assert_equal time.to_i, topic.created_at.to_i
Topic.transaction do
topic.touch_later(:created_at)
topic.touch
assert_not_equal time, topic.reload.updated_at
assert_not_equal time, topic.reload.created_at
end
end
def test_touch_later_an_association_dont_autosave_parent
time = Time.now.utc - 25.days
line_item = LineItem.create!(amount: 1)
invoice = Invoice.create!(line_items: [line_item])
invoice.touch(time: time)
Invoice.transaction do
line_item.update(amount: 2)
assert_equal time.to_i, invoice.reload.updated_at.to_i
end
assert_not_equal time.to_i, invoice.updated_at.to_i
end
def test_touch_touches_immediately_with_a_custom_time
time = (Time.now.utc - 25.days).change(nsec: 0)
topic = Topic.create!(updated_at: time, created_at: time)
assert_equal time, topic.updated_at
assert_equal time, topic.created_at
Topic.transaction do
topic.touch_later(:created_at)
time = Time.now.utc - 2.days
topic.touch(time: time)
assert_equal time.to_i, topic.reload.updated_at.to_i
assert_equal time.to_i, topic.reload.created_at.to_i
end
end
def test_touch_later_dont_hit_the_db
invoice = Invoice.create!
assert_queries(0) do
invoice.touch_later
end
end
def test_touching_three_deep
previous_tree_updated_at = trees(:root).updated_at
previous_grandparent_updated_at = nodes(:grandparent).updated_at
previous_parent_updated_at = nodes(:parent_a).updated_at
previous_child_updated_at = nodes(:child_one_of_a).updated_at
travel 5.seconds do
Node.create! parent: nodes(:child_one_of_a), tree: trees(:root)
end
assert_not_equal nodes(:child_one_of_a).reload.updated_at, previous_child_updated_at
assert_not_equal nodes(:parent_a).reload.updated_at, previous_parent_updated_at
assert_not_equal nodes(:grandparent).reload.updated_at, previous_grandparent_updated_at
assert_not_equal trees(:root).reload.updated_at, previous_tree_updated_at
end
end
|