Skip to content

Commit 136c43a

Browse files
author
Hector Mendoza Jacobo
committed
Add testing for update, delete and insert cache expirations
1 parent 5465c74 commit 136c43a

File tree

2 files changed

+93
-2
lines changed

2 files changed

+93
-2
lines changed

lib/identity_cache/without_primary_index.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def expire_cache_for_update(old_indexed_values, changes)
6161
check_for_unsupported_parent_expiration_entries
6262
end
6363

64-
private def expire_cache_for_insert_or_delete(indexed_values)
64+
def expire_cache_for_insert_or_delete(indexed_values)
6565
if primary_cache_index_enabled
6666
id = indexed_values.fetch(primary_key.to_sym)
6767
expire_primary_key_cache_index(id)
@@ -76,13 +76,15 @@ def expire_cache_for_update(old_indexed_values, changes)
7676

7777
alias_method :expire_cache_for_delete, :expire_cache_for_insert_or_delete
7878

79+
private :expire_cache_for_insert_or_delete
80+
7981
private
8082

8183
def check_for_unsupported_parent_expiration_entries
8284
return unless parent_expiration_entries.any?
8385
msg = +"Unsupported manual expiration of #{name} record that is embedded in parent associations:\n"
8486
parent_expiration_entries.each do |association_name, cached_associations|
85-
cached_associations.each do |parent_class, _only_on_foreign_key_change|
87+
cached_associations.each do |_parent_class, _only_on_foreign_key_change|
8688
msg << "- #{association_name}"
8789
end
8890
end

test/cache_manual_expire_test.rb

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
# frozen_string_literal: true
2+
require "test_helper"
3+
4+
module IdentityCache
5+
class CacheManualExpireTest < IdentityCache::TestCase
6+
def setup
7+
super
8+
AssociatedRecord.cache_attribute(:name)
9+
10+
@parent = Item.create!(title: "bob")
11+
@record = @parent.associated_records.create!(name: "foo")
12+
IdentityCache.cache.clear
13+
end
14+
15+
def test_cache_indexed_columns_returns_the_correct_columns_for_expiration
16+
AssociatedRecord.cache_attribute(:name, by: :item_id)
17+
expected_result = [:id, :item_id]
18+
assert_equal(expected_result, AssociatedRecord.cache_indexed_columns)
19+
end
20+
21+
def test_expire_cache_for_udate
22+
id = 1
23+
item_id = 1
24+
AssociatedRecord.cache_attribute(:item_id, by: :name)
25+
26+
assert_queries(1) do
27+
assert_equal(item_id, AssociatedRecord.fetch_item_id_by_name("foo"))
28+
end
29+
30+
AssociatedRecord.where(id: 1).update_all(name: "bar")
31+
old_values = {
32+
name: "foo",
33+
id: id,
34+
}
35+
new_values = {
36+
name: "bar",
37+
id: id,
38+
}
39+
40+
AssociatedRecord.expire_cache_for_update(old_values, new_values)
41+
assert_queries(2) do
42+
assert_equal(item_id, AssociatedRecord.fetch_item_id_by_name("bar"))
43+
assert_nil(AssociatedRecord.fetch_item_id_by_name("foo"))
44+
end
45+
end
46+
47+
def test_expire_cache_for_udate_raises_when_a_hash_is_missing_an_index_key
48+
expected_error_message = "key not found: :id"
49+
old_values = {
50+
name: "foo",
51+
}
52+
new_values = {
53+
name: "bar",
54+
}
55+
56+
error = assert_raises do
57+
AssociatedRecord.expire_cache_for_update(old_values, new_values)
58+
end
59+
60+
assert_equal(expected_error_message, error.message)
61+
end
62+
63+
def test_expire_cache_for_insert
64+
id = 1
65+
AssociatedRecord.fetch_name_by_id(id)
66+
expire_hash_keys = {
67+
id: id,
68+
}
69+
70+
AssociatedRecord.expire_cache_for_insert(expire_hash_keys)
71+
assert_queries(1) do
72+
assert_equal("foo", AssociatedRecord.fetch_name_by_id(id))
73+
end
74+
end
75+
76+
def test_expire_cache_for_delete
77+
id = 1
78+
AssociatedRecord.fetch_name_by_id(1)
79+
expire_hash_keys = {
80+
id: id,
81+
}
82+
83+
AssociatedRecord.expire_cache_for_delete(expire_hash_keys)
84+
assert_queries(1) do
85+
assert_equal("foo", AssociatedRecord.fetch_name_by_id(id))
86+
end
87+
end
88+
end
89+
end

0 commit comments

Comments
 (0)