mirror of https://github.com/mastodon/mastodon
Fix scheduled statuses decreasing statuses counts (#16791)
* Add tests * Fix scheduled statuses decreasing statuses counts Fixes #16774
This commit is contained in:
parent
5159ba26e4
commit
216570ad98
|
@ -426,7 +426,7 @@ class Status < ApplicationRecord
|
||||||
end
|
end
|
||||||
|
|
||||||
def decrement_counter_caches
|
def decrement_counter_caches
|
||||||
return if direct_visibility?
|
return if direct_visibility? || new_record?
|
||||||
|
|
||||||
account&.decrement_count!(:statuses_count)
|
account&.decrement_count!(:statuses_count)
|
||||||
reblog&.decrement_count!(:reblogs_count) if reblog?
|
reblog&.decrement_count!(:reblogs_count) if reblog?
|
||||||
|
|
|
@ -74,6 +74,9 @@ class PostStatusService < BaseService
|
||||||
status_for_validation = @account.statuses.build(status_attributes)
|
status_for_validation = @account.statuses.build(status_attributes)
|
||||||
|
|
||||||
if status_for_validation.valid?
|
if status_for_validation.valid?
|
||||||
|
# Marking the status as destroyed is necessary to prevent the status from being
|
||||||
|
# persisted when the associated media attachments get updated when creating the
|
||||||
|
# scheduled status.
|
||||||
status_for_validation.destroy
|
status_for_validation.destroy
|
||||||
|
|
||||||
# The following transaction block is needed to wrap the UPDATEs to
|
# The following transaction block is needed to wrap the UPDATEs to
|
||||||
|
|
|
@ -25,31 +25,35 @@ RSpec.describe PostStatusService, type: :service do
|
||||||
expect(status.thread).to eq in_reply_to_status
|
expect(status.thread).to eq in_reply_to_status
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'when scheduling a status' do
|
||||||
|
let!(:account) { Fabricate(:account) }
|
||||||
|
let!(:future) { Time.now.utc + 2.hours }
|
||||||
|
let!(:previous_status) { Fabricate(:status, account: account) }
|
||||||
|
|
||||||
it 'schedules a status' do
|
it 'schedules a status' do
|
||||||
account = Fabricate(:account)
|
|
||||||
future = Time.now.utc + 2.hours
|
|
||||||
|
|
||||||
status = subject.call(account, text: 'Hi future!', scheduled_at: future)
|
status = subject.call(account, text: 'Hi future!', scheduled_at: future)
|
||||||
|
|
||||||
expect(status).to be_a ScheduledStatus
|
expect(status).to be_a ScheduledStatus
|
||||||
expect(status.scheduled_at).to eq future
|
expect(status.scheduled_at).to eq future
|
||||||
expect(status.params['text']).to eq 'Hi future!'
|
expect(status.params['text']).to eq 'Hi future!'
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'does not immediately create a status when scheduling a status' do
|
it 'does not immediately create a status' do
|
||||||
account = Fabricate(:account)
|
media = Fabricate(:media_attachment, account: account)
|
||||||
media = Fabricate(:media_attachment)
|
|
||||||
future = Time.now.utc + 2.hours
|
|
||||||
|
|
||||||
status = subject.call(account, text: 'Hi future!', media_ids: [media.id], scheduled_at: future)
|
status = subject.call(account, text: 'Hi future!', media_ids: [media.id], scheduled_at: future)
|
||||||
|
|
||||||
expect(status).to be_a ScheduledStatus
|
expect(status).to be_a ScheduledStatus
|
||||||
expect(status.scheduled_at).to eq future
|
expect(status.scheduled_at).to eq future
|
||||||
expect(status.params['text']).to eq 'Hi future!'
|
expect(status.params['text']).to eq 'Hi future!'
|
||||||
|
expect(status.params['media_ids']).to eq [media.id]
|
||||||
expect(media.reload.status).to be_nil
|
expect(media.reload.status).to be_nil
|
||||||
expect(Status.where(text: 'Hi future!').exists?).to be_falsey
|
expect(Status.where(text: 'Hi future!').exists?).to be_falsey
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'does not change statuses count' do
|
||||||
|
expect { subject.call(account, text: 'Hi future!', scheduled_at: future, thread: previous_status) }.not_to change { [account.statuses_count, previous_status.replies_count] }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
it 'creates response to the original status of boost' do
|
it 'creates response to the original status of boost' do
|
||||||
boosted_status = Fabricate(:status)
|
boosted_status = Fabricate(:status)
|
||||||
in_reply_to_status = Fabricate(:status, reblog: boosted_status)
|
in_reply_to_status = Fabricate(:status, reblog: boosted_status)
|
||||||
|
|
Loading…
Reference in New Issue