def perform(target_account_id)
target_account = Account.find(target_account_id)
- return unless target_account.protocol == :activitypub
+ return unless target_account.activitypub?
+
+ target_account.passive_relationships.where(account: Account.where(domain: nil)).includes(:account).reorder(nil).find_each do |follow|
+ reblogs = follow.show_reblogs?
- target_account.followers.where(domain: nil).reorder(nil).find_each do |follower|
# Locally unfollow remote account
+ follower = follow.account
follower.unfollow!(target_account)
# Schedule re-follow
begin
- FollowService.new.call(follower, target_account)
+ FollowService.new.call(follower, target_account, reblogs: reblogs)
rescue Mastodon::NotPermittedError, ActiveRecord::RecordNotFound, Mastodon::UnexpectedResponseError, HTTP::Error, OpenSSL::SSL::SSLError
next
end
--- /dev/null
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe RefollowWorker do
+ subject { described_class.new }
+ let(:account) { Fabricate(:account, domain: 'example.org', protocol: :activitypub) }
+ let(:alice) { Fabricate(:account, domain: nil, username: 'alice') }
+ let(:bob) { Fabricate(:account, domain: nil, username: 'bob') }
+
+ describe 'perform' do
+ let(:service) { double }
+
+ before do
+ allow(FollowService).to receive(:new).and_return(service)
+ allow(service).to receive(:call)
+
+ alice.follow!(account, reblogs: true)
+ bob.follow!(account, reblogs: false)
+ end
+
+ it 'calls FollowService for local followers' do
+ result = subject.perform(account.id)
+
+ expect(result).to be_nil
+ expect(service).to have_received(:call).with(alice, account, reblogs: true)
+ expect(service).to have_received(:call).with(bob, account, reblogs: false)
+ end
+ end
+end