diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index e6d0c40730..c55a54df37 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -69,7 +69,7 @@ class PostStatusService < BaseService @text = @options.delete(:spoiler_text) if @text.blank? && @options[:spoiler_text].present? && @quoted_status.blank? @visibility = @options[:visibility] || @account.user&.setting_default_privacy @visibility = :unlisted if @visibility&.to_sym == :public && @account.silenced? - @visibility = :private if @quoted_status&.private_visibility? + @visibility = :private if @quoted_status&.private_visibility? && %i(public unlisted).include?(@visibility&.to_sym) @scheduled_at = @options[:scheduled_at]&.to_datetime @scheduled_at = nil if scheduled_in_the_past? rescue ArgumentError diff --git a/spec/services/post_status_service_spec.rb b/spec/services/post_status_service_spec.rb index c434d0cb6e..96289cdeee 100644 --- a/spec/services/post_status_service_spec.rb +++ b/spec/services/post_status_service_spec.rb @@ -321,6 +321,14 @@ RSpec.describe PostStatusService do expect(status).to be_private_visibility end + it 'correctly preserves visibility for private mentions self-quoting private posts' do + account = Fabricate(:account) + quoted_status = Fabricate(:status, account: account, visibility: :private) + + status = subject.call(account, text: 'test', quoted_status: quoted_status, visibility: 'direct') + expect(status).to be_direct_visibility + end + it 'returns existing status when used twice with idempotency key' do account = Fabricate(:account) status1 = subject.call(account, text: 'test', idempotency: 'meepmeep')