1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/activerecord/test/cases/cache_key_test.rb
Rafael Mendonça França 58ecdd0cf2
Deprecate to_s(format) in favor of to_formatted_s(format)
Ruby 3.1 is going to introduce an [optimization][] that makes interpolation
of some types of objects faster, unless there is a custom implementation
of to_s. Since Rails is overriding `to_s` for a bunch of core classes it
means that this optimization in Rails applications will be disabled.

In order to allow Rails applications to use this optimization in
the future we are deprecating all the reasons we override `to_s` in
those core classes in favor of using `to_formatted_s`.

[optimization]: b08dacfea3
2021-12-06 19:22:05 +00:00

131 lines
4.7 KiB
Ruby

# frozen_string_literal: true
require "cases/helper"
module ActiveRecord
class CacheKeyTest < ActiveRecord::TestCase
self.use_transactional_tests = false
class CacheMe < ActiveRecord::Base
self.cache_versioning = false
end
class CacheMeWithVersion < ActiveRecord::Base
self.cache_versioning = true
end
setup do
@connection = ActiveRecord::Base.connection
@connection.create_table(:cache_mes, force: true) { |t| t.timestamps }
@connection.create_table(:cache_me_with_versions, force: true) { |t| t.timestamps }
end
teardown do
@connection.drop_table :cache_mes, if_exists: true
@connection.drop_table :cache_me_with_versions, if_exists: true
end
test "cache_key format is not too precise" do
record = CacheMe.create
key = record.cache_key
assert_equal key, record.reload.cache_key
end
test "cache_key has no version when versioning is on" do
record = CacheMeWithVersion.create
assert_equal "active_record/cache_key_test/cache_me_with_versions/#{record.id}", record.cache_key
end
test "cache_version is only there when versioning is on" do
assert_predicate CacheMeWithVersion.create.cache_version, :present?
assert_not_predicate CacheMe.create.cache_version, :present?
end
test "cache_key_with_version always has both key and version" do
r1 = CacheMeWithVersion.create
assert_equal "active_record/cache_key_test/cache_me_with_versions/#{r1.id}-#{r1.updated_at.utc.to_formatted_s(:usec)}", r1.cache_key_with_version
r2 = CacheMe.create
assert_equal "active_record/cache_key_test/cache_mes/#{r2.id}-#{r2.updated_at.utc.to_formatted_s(:usec)}", r2.cache_key_with_version
end
test "cache_version is the same when it comes from the DB or from the user" do
skip("Mysql2 and PostgreSQL don't return a string value for updated_at") if current_adapter?(:Mysql2Adapter, :PostgreSQLAdapter)
record = CacheMeWithVersion.create
record_from_db = CacheMeWithVersion.find(record.id)
assert_not_called(record_from_db, :updated_at) do
record_from_db.cache_version
end
assert_equal record.cache_version, record_from_db.cache_version
end
test "cache_version does not truncate zeros when timestamp ends in zeros" do
skip("Mysql2 and PostgreSQL don't return a string value for updated_at") if current_adapter?(:Mysql2Adapter, :PostgreSQLAdapter)
travel_to Time.now.beginning_of_day do
record = CacheMeWithVersion.create
record_from_db = CacheMeWithVersion.find(record.id)
assert_not_called(record_from_db, :updated_at) do
record_from_db.cache_version
end
assert_equal record.cache_version, record_from_db.cache_version
end
end
test "cache_version calls updated_at when the value is generated at create time" do
record = CacheMeWithVersion.create
assert_called(record, :updated_at) do
record.cache_version
end
end
test "cache_version does NOT call updated_at when value is from the database" do
skip("Mysql2 and PostgreSQL don't return a string value for updated_at") if current_adapter?(:Mysql2Adapter, :PostgreSQLAdapter)
record = CacheMeWithVersion.create
record_from_db = CacheMeWithVersion.find(record.id)
assert_not_called(record_from_db, :updated_at) do
record_from_db.cache_version
end
end
test "cache_version does call updated_at when it is assigned via a Time object" do
record = CacheMeWithVersion.create
record_from_db = CacheMeWithVersion.find(record.id)
assert_called(record_from_db, :updated_at) do
record_from_db.updated_at = Time.now
record_from_db.cache_version
end
end
test "cache_version does call updated_at when it is assigned via a string" do
record = CacheMeWithVersion.create
record_from_db = CacheMeWithVersion.find(record.id)
assert_called(record_from_db, :updated_at) do
record_from_db.updated_at = Time.now.to_s
record_from_db.cache_version
end
end
test "cache_version does call updated_at when it is assigned via a hash" do
record = CacheMeWithVersion.create
record_from_db = CacheMeWithVersion.find(record.id)
assert_called(record_from_db, :updated_at) do
record_from_db.updated_at = { 1 => 2016, 2 => 11, 3 => 12, 4 => 1, 5 => 2, 6 => 3, 7 => 22 }
record_from_db.cache_version
end
end
test "updated_at on class but not on instance raises an error" do
record = CacheMeWithVersion.create
record_from_db = CacheMeWithVersion.where(id: record.id).select(:id).first
assert_raises(ActiveModel::MissingAttributeError) do
record_from_db.cache_version
end
end
end
end