diff --git a/app/models/public_feed.rb b/app/models/public_feed.rb index c87b9361b6..f73f639006 100644 --- a/app/models/public_feed.rb +++ b/app/models/public_feed.rb @@ -19,13 +19,12 @@ class PublicFeed # @param [Integer] min_id # @return [Array] def get(limit, max_id = nil, since_id = nil, min_id = nil) - scope = public_scope + scope = local_only? ? public_scope : global_timeline_only_scope scope.merge!(without_replies_scope) unless with_replies? scope.merge!(without_reblogs_scope) unless with_reblogs? scope.merge!(local_only_scope) if local_only? scope.merge!(remote_only_scope) if remote_only? || hide_local_users? - scope.merge!(global_timeline_only_scope) if global_timeline? scope.merge!(account_filters_scope) if account? scope.merge!(media_only_scope) if media_only? scope.merge!(language_scope) if account&.chosen_languages.present? @@ -58,10 +57,6 @@ class PublicFeed @account.nil? && Setting.hide_local_users_for_anonymous end - def global_timeline? - !options[:remote] && !options[:local] - end - def account? account.present? end @@ -74,6 +69,10 @@ class PublicFeed Status.with_public_visibility.joins(:account).merge(Account.without_suspended.without_silenced) end + def global_timeline_only_scope + Status.with_global_timeline_visibility.joins(:account).merge(Account.without_suspended.without_silenced) + end + def public_search_scope Status.with_public_search_visibility.joins(:account).merge(Account.without_suspended.without_silenced) end @@ -86,10 +85,6 @@ class PublicFeed Status.remote end - def global_timeline_only_scope - Status.with_global_timeline_visibility.joins(:account).merge(Account.without_suspended.without_silenced) - end - def without_replies_scope Status.without_replies end @@ -107,7 +102,7 @@ class PublicFeed end def anonymous_scope - Status.where(visibility: [:public, :public_unlisted]) + local_only? ? Status.where(visibility: [:public, :public_unlisted]) : Status.where(visibility: :public) end def account_filters_scope diff --git a/spec/models/public_feed_spec.rb b/spec/models/public_feed_spec.rb index 53e01cafd3..6107bc3ed0 100644 --- a/spec/models/public_feed_spec.rb +++ b/spec/models/public_feed_spec.rb @@ -6,14 +6,36 @@ RSpec.describe PublicFeed do let(:account) { Fabricate(:account) } describe '#get' do - subject { described_class.new(nil).get(20).map(&:id) } + subject { described_class.new(viewer).get(20).map(&:id) } - it 'only includes statuses with public visibility' do - public_status = Fabricate(:status, visibility: :public) - private_status = Fabricate(:status, visibility: :private) + let(:viewer) { nil } - expect(subject).to include(public_status.id) - expect(subject).to_not include(private_status.id) + context 'with only includes statuses with public visibility' do + let!(:public_status) { Fabricate(:status, visibility: :public) } + let!(:login_status) { Fabricate(:status, visibility: :login) } + let!(:unlisted_status) { Fabricate(:status, visibility: :unlisted) } + let!(:private_status) { Fabricate(:status, visibility: :private) } + let!(:direct_status) { Fabricate(:status, visibility: :direct) } + + it 'without user' do + expect(subject).to include(public_status.id) + expect(subject).to_not include(login_status.id) + expect(subject).to_not include(unlisted_status.id) + expect(subject).to_not include(private_status.id) + expect(subject).to_not include(direct_status.id) + end + + context 'with user' do + let(:viewer) { account } + + it 'on global timeline' do + expect(subject).to include(public_status.id) + expect(subject).to include(login_status.id) + expect(subject).to_not include(unlisted_status.id) + expect(subject).to_not include(private_status.id) + expect(subject).to_not include(direct_status.id) + end + end end it 'does not include replies' do @@ -50,6 +72,7 @@ RSpec.describe PublicFeed do let!(:remote_account) { Fabricate(:account, domain: 'test.com') } let!(:local_status) { Fabricate(:status, account: local_account) } let!(:remote_status) { Fabricate(:status, account: remote_account) } + let!(:public_unlisted_status) { Fabricate(:status, account: local_account, visibility: :public_unlisted) } context 'without a viewer' do let(:viewer) { nil } @@ -61,6 +84,10 @@ RSpec.describe PublicFeed do it 'includes local statuses' do expect(subject).to include(local_status.id) end + + it 'excludes public_unlisted statuses' do + expect(subject).to_not include(public_unlisted_status.id) + end end context 'with a viewer' do @@ -73,6 +100,10 @@ RSpec.describe PublicFeed do it 'includes local statuses' do expect(subject).to include(local_status.id) end + + it 'excludes public_unlisted statuses' do + expect(subject).to_not include(public_unlisted_status.id) + end end end @@ -83,6 +114,7 @@ RSpec.describe PublicFeed do let!(:remote_account) { Fabricate(:account, domain: 'test.com') } let!(:local_status) { Fabricate(:status, account: local_account) } let!(:remote_status) { Fabricate(:status, account: remote_account) } + let!(:public_unlisted_status) { Fabricate(:status, account: local_account, visibility: :public_unlisted) } context 'without a viewer' do let(:viewer) { nil } @@ -91,6 +123,10 @@ RSpec.describe PublicFeed do expect(subject).to include(local_status.id) expect(subject).to_not include(remote_status.id) end + + it 'includes public_unlisted statuses' do + expect(subject).to include(public_unlisted_status.id) + end end context 'with a viewer' do @@ -106,6 +142,10 @@ RSpec.describe PublicFeed do expect(subject).to include(local_status.id) expect(subject).to_not include(remote_status.id) end + + it 'includes public_unlisted statuses' do + expect(subject).to include(public_unlisted_status.id) + end end end @@ -116,6 +156,7 @@ RSpec.describe PublicFeed do let!(:remote_account) { Fabricate(:account, domain: 'test.com') } let!(:local_status) { Fabricate(:status, account: local_account) } let!(:remote_status) { Fabricate(:status, account: remote_account) } + let!(:public_unlisted_status) { Fabricate(:status, account: local_account, visibility: :public_unlisted) } context 'without a viewer' do let(:viewer) { nil } @@ -124,6 +165,10 @@ RSpec.describe PublicFeed do expect(subject).to_not include(local_status.id) expect(subject).to include(remote_status.id) end + + it 'excludes public_unlisted statuses' do + expect(subject).to_not include(public_unlisted_status.id) + end end context 'with a viewer' do @@ -133,6 +178,10 @@ RSpec.describe PublicFeed do expect(subject).to_not include(local_status.id) expect(subject).to include(remote_status.id) end + + it 'excludes public_unlisted statuses' do + expect(subject).to_not include(public_unlisted_status.id) + end end end