123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- # frozen_string_literal: true
- require 'rails_helper'
- RSpec.describe BulkImportRowService do
- subject { described_class.new }
- let(:account) { Fabricate(:account) }
- let(:import) { Fabricate(:bulk_import, account: account, type: import_type) }
- let(:import_row) { Fabricate(:bulk_import_row, bulk_import: import, data: data) }
- describe '#call' do
- context 'when importing a follow' do
- let(:import_type) { 'following' }
- let(:target_account) { Fabricate(:account) }
- let(:service_double) { instance_double(FollowService, call: nil) }
- let(:data) do
- { 'acct' => target_account.acct }
- end
- before do
- allow(FollowService).to receive(:new).and_return(service_double)
- end
- it 'calls FollowService with the expected arguments and returns true' do
- expect(subject.call(import_row)).to be true
- expect(service_double).to have_received(:call).with(account, target_account, { reblogs: nil, notify: nil, languages: nil })
- end
- end
- context 'when importing a block' do
- let(:import_type) { 'blocking' }
- let(:target_account) { Fabricate(:account) }
- let(:service_double) { instance_double(BlockService, call: nil) }
- let(:data) do
- { 'acct' => target_account.acct }
- end
- before do
- allow(BlockService).to receive(:new).and_return(service_double)
- end
- it 'calls BlockService with the expected arguments and returns true' do
- expect(subject.call(import_row)).to be true
- expect(service_double).to have_received(:call).with(account, target_account)
- end
- end
- context 'when importing a mute' do
- let(:import_type) { 'muting' }
- let(:target_account) { Fabricate(:account) }
- let(:service_double) { instance_double(MuteService, call: nil) }
- let(:data) do
- { 'acct' => target_account.acct }
- end
- before do
- allow(MuteService).to receive(:new).and_return(service_double)
- end
- it 'calls MuteService with the expected arguments and returns true' do
- expect(subject.call(import_row)).to be true
- expect(service_double).to have_received(:call).with(account, target_account, { notifications: nil })
- end
- end
- context 'when importing a bookmark' do
- let(:import_type) { 'bookmarks' }
- let(:data) do
- { 'uri' => ActivityPub::TagManager.instance.uri_for(target_status) }
- end
- context 'when the status is public' do
- let(:target_status) { Fabricate(:status) }
- it 'bookmarks the status and returns true' do
- expect(subject.call(import_row)).to be true
- expect(account.bookmarked?(target_status)).to be true
- end
- end
- context 'when the status is not accessible to the user' do
- let(:target_status) { Fabricate(:status, visibility: :direct) }
- it 'does not bookmark the status and returns false' do
- expect(subject.call(import_row)).to be false
- expect(account.bookmarked?(target_status)).to be false
- end
- end
- end
- context 'when importing a list row' do
- let(:import_type) { 'lists' }
- let(:target_account) { Fabricate(:account) }
- let(:list_name) { 'my list' }
- let(:data) do
- { 'acct' => target_account.acct, 'list_name' => list_name }
- end
- shared_examples 'common behavior' do
- shared_examples 'row import success and list addition' do
- it 'returns true and adds the target account to the list' do
- result = nil
- expect { result = subject.call(import_row) }
- .to change { result }.from(nil).to(true)
- .and add_target_account_to_list
- end
- end
- context 'when the target account is already followed' do
- before do
- account.follow!(target_account)
- end
- include_examples 'row import success and list addition'
- end
- context 'when the user already requested to follow the target account' do
- before do
- account.request_follow!(target_account)
- end
- include_examples 'row import success and list addition'
- end
- context 'when the target account is neither followed nor requested' do
- include_examples 'row import success and list addition'
- end
- context 'when the target account is the user themself' do
- let(:target_account) { account }
- include_examples 'row import success and list addition'
- end
- def add_target_account_to_list
- change { target_account_on_list? }
- .from(false)
- .to(true)
- end
- def target_account_on_list?
- ListAccount
- .joins(:list)
- .exists?(
- account_id: target_account.id,
- list: { title: list_name }
- )
- end
- end
- context 'when the list does not exist yet' do
- include_examples 'common behavior'
- end
- context 'when the list exists' do
- before do
- Fabricate(:list, account: account, title: list_name)
- end
- include_examples 'common behavior'
- it 'does not create a new list' do
- account.follow!(target_account)
- expect { subject.call(import_row) }.to_not(change { List.where(title: list_name).count })
- end
- end
- end
- end
- end
|