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 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
|
# frozen_string_literal: true
require "cases/helper"
require "models/invoice"
require "models/line_item"
require "models/topic"
require "models/node"
require "models/tree"
require "models/owner"
require "models/pet"
class TouchLaterTest < ActiveRecord::TestCase
fixtures :nodes, :trees, :owners, :pets
def test_touch_later_raise_if_non_persisted
invoice = Invoice.new
Invoice.transaction do
assert_not_predicate 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_predicate 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_no_queries 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
def test_touching_through_nested_attributes_without_before_committed_on_all_records
original = ActiveRecord.before_committed_on_all_records
ActiveRecord.before_committed_on_all_records = false
time = Time.now.utc - 25.days
owner = owners(:blackbeard)
owner.touch(time: time)
assert_equal time.to_i, owner.reload.updated_at.to_i
owner.update pets_attributes: { "0" => { id: "1", name: "Alfred" } }
# The second copy of the record is not touched, so the owner's updated_at
# remains the same.
assert_equal time.to_i, owner.reload.updated_at.to_i
ensure
ActiveRecord.before_committed_on_all_records = original
end
def test_touching_through_nested_attributes_with_before_committed_on_all_records
original = ActiveRecord.before_committed_on_all_records
ActiveRecord.before_committed_on_all_records = true
time = Time.now.utc - 25.days
owner = owners(:blackbeard)
owner.touch(time: time)
assert_equal time.to_i, owner.reload.updated_at.to_i
owner.update pets_attributes: { "0" => { id: "1", name: "Alfred" } }
assert_not_equal time.to_i, owner.reload.updated_at.to_i
ensure
ActiveRecord.before_committed_on_all_records = original
end
end
|