FIX: Update category tag stats with new or deleted (#21531)

The old method updated only existing records, without considering that
new tags might have been created or some tags might not exist anymore.
This was usually not a problem because the stats were also updated by
other code paths.

However, the ensure consistency job should be more solid and help when
other code paths fail or after importing data.

Also, update category tag stats too should happen when updating other
category stats as well.
This commit is contained in:
Bianca Nenciu
2023-05-18 11:46:44 +02:00
committed by GitHub
parent 809bab5782
commit f0ec1fad8c
3 changed files with 65 additions and 10 deletions

View File

@ -0,0 +1,39 @@
# frozen_string_literal: true
describe CategoryTagStat do
fab!(:category) { Fabricate(:category) }
fab!(:tag) { Fabricate(:tag) }
fab!(:topic) { Fabricate(:topic, category: category, tags: [tag]) }
describe "#update_topic_counts" do
it "creates new records" do
CategoryTagStat.destroy_all
expect { CategoryTagStat.update_topic_counts }.to change { CategoryTagStat.count }.by(1)
category_tag_stat = CategoryTagStat.last
expect(category_tag_stat.category_id).to eq(category.id)
expect(category_tag_stat.tag_id).to eq(tag.id)
expect(category_tag_stat.topic_count).to eq(1)
end
it "updates existing records" do
CategoryTagStat.last.update(topic_count: 10)
expect { CategoryTagStat.update_topic_counts }.not_to change { CategoryTagStat.count }
category_tag_stat = CategoryTagStat.last
expect(category_tag_stat.category_id).to eq(category.id)
expect(category_tag_stat.tag_id).to eq(tag.id)
expect(category_tag_stat.topic_count).to eq(1)
end
it "deletes old records" do
CategoryTagStat.last.update(tag_id: Fabricate(:tag).id)
expect { CategoryTagStat.update_topic_counts }.not_to change { CategoryTagStat.count }
category_tag_stat = CategoryTagStat.last
expect(category_tag_stat.category_id).to eq(category.id)
expect(category_tag_stat.tag_id).to eq(tag.id)
expect(category_tag_stat.topic_count).to eq(1)
end
end
end