private
def increment_cache_counters
- status.increment_count!(:favourites_count)
+ status&.increment_count!(:favourites_count)
end
def decrement_cache_counters
return if association(:status).loaded? && (status.marked_for_destruction? || status.marked_for_mass_destruction?)
- status.decrement_count!(:favourites_count)
+ status&.decrement_count!(:favourites_count)
end
end
private
def update_status_stat!(attrs)
+ return if marked_for_destruction? || destroyed?
+
record = status_stat || build_status_stat
record.update(attrs)
end
Account.where(id: account_id).update_all('statuses_count = COALESCE(statuses_count, 0) + 1')
end
- reblog.increment_count!(:reblogs_count) if reblog?
- thread.increment_count!(:replies_count) if in_reply_to_id.present? && (public_visibility? || unlisted_visibility?)
+ reblog&.increment_count!(:reblogs_count) if reblog?
+ thread&.increment_count!(:replies_count) if in_reply_to_id.present? && (public_visibility? || unlisted_visibility?)
end
def decrement_counter_caches
Account.where(id: account_id).update_all('statuses_count = GREATEST(COALESCE(statuses_count, 0) - 1, 0)')
end
- reblog.decrement_count!(:reblogs_count) if reblog?
- thread.decrement_count!(:replies_count) if in_reply_to_id.present? && (public_visibility? || unlisted_visibility?)
+ reblog&.decrement_count!(:reblogs_count) if reblog?
+ thread&.decrement_count!(:replies_count) if in_reply_to_id.present? && (public_visibility? || unlisted_visibility?)
end
end
reblog.destroy
expect(subject.reblogs_count).to eq 0
end
+
+ it 'does not fail when original is deleted before reblog' do
+ reblog = Fabricate(:status, account: bob, reblog: subject)
+ expect(subject.reblogs_count).to eq 1
+ expect { subject.destroy }.to_not raise_error
+ expect(Status.find_by(id: reblog.id)).to be_nil
+ end
+ end
+
+ describe '#replies_count' do
+ it 'is the number of replies' do
+ reply = Fabricate(:status, account: bob, thread: subject)
+ expect(subject.replies_count).to eq 1
+ end
+
+ it 'is decremented when reply is removed' do
+ reply = Fabricate(:status, account: bob, thread: subject)
+ expect(subject.replies_count).to eq 1
+ reply.destroy
+ expect(subject.replies_count).to eq 0
+ end
end
describe '#favourites_count' do