diff options
author | Matt Jankowski <matt@jankowski.online> | 2023-04-14 08:42:10 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-14 14:42:10 +0200 |
commit | 10f0de42129d17fd28fc6ff92b77d49156b0185b (patch) | |
tree | b204f0fbc6bf581d78e98e91dab22f0d7fc90e9d /spec | |
parent | b0800d602e69892f93d72880a642c9b5274aa84b (diff) |
Refactor race condition reblog service spec (#24526)
Diffstat (limited to 'spec')
-rw-r--r-- | spec/services/reblog_service_spec.rb | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/spec/services/reblog_service_spec.rb b/spec/services/reblog_service_spec.rb index fdf5ec923..2ad6d30f6 100644 --- a/spec/services/reblog_service_spec.rb +++ b/spec/services/reblog_service_spec.rb @@ -35,13 +35,25 @@ RSpec.describe ReblogService, type: :service do end context 'when the reblogged status is discarded in the meantime' do - let(:status) { Fabricate(:status, account: alice, visibility: :public) } + let(:status) { Fabricate(:status, account: alice, visibility: :public, text: 'discard-status-text') } + # Add a callback to discard the status being reblogged after the + # validations pass but before the database commit is executed. before do - # Update the in-database attribute without reflecting the change in - # the object. This cannot simulate all race conditions, but it is - # pretty close. - Status.where(id: status.id).update_all(deleted_at: Time.now.utc) # rubocop:disable Rails/SkipsModelValidations + Status.class_eval do + before_save :discard_status + def discard_status + Status + .where(id: reblog_of_id) + .where(text: 'discard-status-text') + .update_all(deleted_at: Time.now.utc) # rubocop:disable Rails/SkipsModelValidations + end + end + end + + # Remove race condition simulating `discard_status` callback. + after do + Status._save_callbacks.delete(:discard_status) end it 'raises an exception' do |