diff --git a/app/services/reblog_service.rb b/app/services/reblog_service.rb index 76aaf83c04..7e52f82a83 100644 --- a/app/services/reblog_service.rb +++ b/app/services/reblog_service.rb @@ -25,7 +25,10 @@ class ReblogService < BaseService else options[:visibility] || (account.user&.setting_default_reblog_privacy == 'unset' ? account.user&.setting_default_privacy : account.user&.setting_default_reblog_privacy) - end + end.to_s + + visibility = 'public_unlisted' if !Setting.enable_public_visibility && visibility == 'public' + visibility = 'unlisted' if !Setting.enable_public_unlisted_visibility && visibility == 'public_unlisted' reblog = account.statuses.create!(reblog: reblogged_status, text: '', visibility: visibility, rate_limit: options[:with_rate_limit]) diff --git a/spec/services/reblog_service_spec.rb b/spec/services/reblog_service_spec.rb index e5d0a2d6ce..e17a3c5999 100644 --- a/spec/services/reblog_service_spec.rb +++ b/spec/services/reblog_service_spec.rb @@ -16,6 +16,10 @@ RSpec.describe ReblogService, type: :service do subject.call(alice, status, visibility: reblog_visibility) end + it 'a simple case reblogs publicly' do + expect(status.reblogs.first.visibility).to eq 'public' + end + describe 'boosting privately' do let(:reblog_visibility) { :private } @@ -34,6 +38,36 @@ RSpec.describe ReblogService, type: :service do end end + context 'when public visibility is disabled' do + subject { described_class.new } + + let(:status) { Fabricate(:status, account: alice, visibility: :public) } + + before do + Setting.enable_public_visibility = false + subject.call(alice, status, visibility: :public) + end + + it 'reblogs as public unlisted' do + expect(status.reblogs.first.visibility).to eq 'public_unlisted' + end + end + + context 'when public unlisted visibility is disabled' do + subject { described_class.new } + + let(:status) { Fabricate(:status, account: alice, visibility: :public) } + + before do + Setting.enable_public_unlisted_visibility = false + subject.call(alice, status, visibility: :public_unlisted) + end + + it 'reblogs as public unlisted' do + expect(status.reblogs.first.visibility).to eq 'unlisted' + end + end + context 'when the reblogged status is discarded in the meantime' do let(:status) { Fabricate(:status, account: alice, visibility: :public, text: 'discard-status-text') }