rails--rails/activerecord/test/cases/touch_later_test.rb

124 lines
3.8 KiB
Ruby

# frozen_string_literal: true
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_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
end