From ceb365c41950283f601058e38e779565eca43b31 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 3 Oct 2023 12:21:42 +0200 Subject: [PATCH] Fix boosts of local users being filtered in account timelines (#27204) --- app/lib/account_statuses_filter.rb | 6 +++++- .../account_statuses_filter_spec.rb | 16 +++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) rename spec/{models => lib}/account_statuses_filter_spec.rb (91%) diff --git a/app/lib/account_statuses_filter.rb b/app/lib/account_statuses_filter.rb index a5aca96601..b34ebb4777 100644 --- a/app/lib/account_statuses_filter.rb +++ b/app/lib/account_statuses_filter.rb @@ -60,8 +60,12 @@ class AccountStatusesFilter .where(reblog_of_id: nil) .or( scope + # This is basically `Status.not_domain_blocked_by_account(current_account)` + # and `Status.not_excluded_by_account(current_account)` but on the + # `reblog` association. Unfortunately, there seem to be no clean way + # to re-use those scopes in our case. + .where(reblog: { accounts: { domain: nil } }).or(scope.where.not(reblog: { accounts: { domain: current_account.excluded_from_timeline_domains } })) .where.not(reblog: { account_id: current_account.excluded_from_timeline_account_ids }) - .where.not(reblog: { accounts: { domain: current_account.excluded_from_timeline_domains } }) ) end diff --git a/spec/models/account_statuses_filter_spec.rb b/spec/lib/account_statuses_filter_spec.rb similarity index 91% rename from spec/models/account_statuses_filter_spec.rb rename to spec/lib/account_statuses_filter_spec.rb index 0cf6453fe3..c821eb4bac 100644 --- a/spec/models/account_statuses_filter_spec.rb +++ b/spec/lib/account_statuses_filter_spec.rb @@ -202,7 +202,7 @@ RSpec.describe AccountStatusesFilter do context 'when blocking a reblogged domain' do let(:other_account) { Fabricate(:account, domain: 'example.com') } let(:reblogging_status) { Fabricate(:status, account: other_account) } - let(:reblog) { Fabricate(:status, account: account, visibility: 'public', reblog: reblogging_status) } + let!(:reblog) { Fabricate(:status, account: account, visibility: 'public', reblog: reblogging_status) } before do current_account.block_domain!(other_account.domain) @@ -213,6 +213,20 @@ RSpec.describe AccountStatusesFilter do end end + context 'when blocking an unrelated domain' do + let(:other_account) { Fabricate(:account, domain: nil) } + let(:reblogging_status) { Fabricate(:status, account: other_account, visibility: 'public') } + let!(:reblog) { Fabricate(:status, account: account, visibility: 'public', reblog: reblogging_status) } + + before do + current_account.block_domain!('example.com') + end + + it 'returns the reblog from the non-blocked domain' do + expect(subject.results.pluck(:id)).to include(reblog.id) + end + end + context 'when muting a reblogged account' do let(:reblog) { status_with_reblog!('public') }