Fix possible race conditions when suspending/unsuspending accounts (#22363)
* Fix possible race conditions when suspending/unsuspending accounts * Fix tests Tests were assuming SuspensionWorker and UnsuspensionWorker would do the suspending/unsuspending themselves, but this has changed.
This commit is contained in:
		| @@ -3,10 +3,13 @@ | ||||
| class SuspendAccountService < BaseService | ||||
|   include Payloadable | ||||
|  | ||||
|   # Carry out the suspension of a recently-suspended account | ||||
|   # @param [Account] account Account to suspend | ||||
|   def call(account) | ||||
|     return unless account.suspended? | ||||
|  | ||||
|     @account = account | ||||
|  | ||||
|     suspend! | ||||
|     reject_remote_follows! | ||||
|     distribute_update_actor! | ||||
|     unmerge_from_home_timelines! | ||||
| @@ -16,10 +19,6 @@ class SuspendAccountService < BaseService | ||||
|  | ||||
|   private | ||||
|  | ||||
|   def suspend! | ||||
|     @account.suspend! unless @account.suspended? | ||||
|   end | ||||
|  | ||||
|   def reject_remote_follows! | ||||
|     return if @account.local? || !@account.activitypub? | ||||
|  | ||||
|   | ||||
| @@ -2,10 +2,12 @@ | ||||
|  | ||||
| class UnsuspendAccountService < BaseService | ||||
|   include Payloadable | ||||
|  | ||||
|   # Restores a recently-unsuspended account | ||||
|   # @param [Account] account Account to restore | ||||
|   def call(account) | ||||
|     @account = account | ||||
|  | ||||
|     unsuspend! | ||||
|     refresh_remote_account! | ||||
|  | ||||
|     return if @account.nil? || @account.suspended? | ||||
| @@ -18,10 +20,6 @@ class UnsuspendAccountService < BaseService | ||||
|  | ||||
|   private | ||||
|  | ||||
|   def unsuspend! | ||||
|     @account.unsuspend! if @account.suspended? | ||||
|   end | ||||
|  | ||||
|   def refresh_remote_account! | ||||
|     return if @account.local? | ||||
|  | ||||
|   | ||||
| @@ -13,6 +13,8 @@ RSpec.describe SuspendAccountService, type: :service do | ||||
|  | ||||
|       local_follower.follow!(account) | ||||
|       list.accounts << account | ||||
|  | ||||
|       account.suspend! | ||||
|     end | ||||
|  | ||||
|     it "unmerges from local followers' feeds" do | ||||
| @@ -21,8 +23,8 @@ RSpec.describe SuspendAccountService, type: :service do | ||||
|       expect(FeedManager.instance).to have_received(:unmerge_from_list).with(account, list) | ||||
|     end | ||||
|  | ||||
|     it 'marks account as suspended' do | ||||
|       expect { subject }.to change { account.suspended? }.from(false).to(true) | ||||
|     it 'does not change the “suspended” flag' do | ||||
|       expect { subject }.to_not change { account.suspended? } | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   | ||||
| @@ -14,7 +14,7 @@ RSpec.describe UnsuspendAccountService, type: :service do | ||||
|       local_follower.follow!(account) | ||||
|       list.accounts << account | ||||
|  | ||||
|       account.suspend!(origin: :local) | ||||
|       account.unsuspend! | ||||
|     end | ||||
|   end | ||||
|  | ||||
| @@ -30,8 +30,8 @@ RSpec.describe UnsuspendAccountService, type: :service do | ||||
|       stub_request(:post, 'https://bob.com/inbox').to_return(status: 201) | ||||
|     end | ||||
|  | ||||
|     it 'marks account as unsuspended' do | ||||
|       expect { subject }.to change { account.suspended? }.from(true).to(false) | ||||
|     it 'does not change the “suspended” flag' do | ||||
|       expect { subject }.to_not change { account.suspended? } | ||||
|     end | ||||
|  | ||||
|     include_examples 'common behavior' do | ||||
| @@ -83,8 +83,8 @@ RSpec.describe UnsuspendAccountService, type: :service do | ||||
|           expect(FeedManager.instance).to have_received(:merge_into_list).with(account, list) | ||||
|         end | ||||
|  | ||||
|         it 'marks account as unsuspended' do | ||||
|           expect { subject }.to change { account.suspended? }.from(true).to(false) | ||||
|         it 'does not change the “suspended” flag' do | ||||
|           expect { subject }.to_not change { account.suspended? } | ||||
|         end | ||||
|       end | ||||
|  | ||||
| @@ -107,8 +107,8 @@ RSpec.describe UnsuspendAccountService, type: :service do | ||||
|           expect(FeedManager.instance).to_not have_received(:merge_into_list).with(account, list) | ||||
|         end | ||||
|  | ||||
|         it 'does not mark the account as unsuspended' do | ||||
|           expect { subject }.not_to change { account.suspended? } | ||||
|         it 'marks account as suspended' do | ||||
|           expect { subject }.to change { account.suspended? }.from(false).to(true) | ||||
|         end | ||||
|       end | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user