From d6c0ae995c45fe5e5e0a8acfc10dff04a774fa75 Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Fri, 15 Sep 2023 19:54:32 +0200
Subject: [PATCH] Fix post edits not being forwarded as expected (#26936)

---
 app/lib/activitypub/activity/update.rb        |  2 +-
 .../activitypub/fetch_remote_poll_service.rb  |  2 +-
 .../process_status_update_service.rb          |  7 ++--
 .../process_status_update_service_spec.rb     | 40 +++++++++----------
 4 files changed, 26 insertions(+), 25 deletions(-)

diff --git a/app/lib/activitypub/activity/update.rb b/app/lib/activitypub/activity/update.rb
index e7c3bc9bf..91ebd3732 100644
--- a/app/lib/activitypub/activity/update.rb
+++ b/app/lib/activitypub/activity/update.rb
@@ -28,6 +28,6 @@ class ActivityPub::Activity::Update < ActivityPub::Activity
 
     return if @status.nil?
 
-    ActivityPub::ProcessStatusUpdateService.new.call(@status, @object, request_id: @options[:request_id])
+    ActivityPub::ProcessStatusUpdateService.new.call(@status, @json, @object, request_id: @options[:request_id])
   end
 end
diff --git a/app/services/activitypub/fetch_remote_poll_service.rb b/app/services/activitypub/fetch_remote_poll_service.rb
index 1829e791c..41b9b2f0c 100644
--- a/app/services/activitypub/fetch_remote_poll_service.rb
+++ b/app/services/activitypub/fetch_remote_poll_service.rb
@@ -8,6 +8,6 @@ class ActivityPub::FetchRemotePollService < BaseService
 
     return unless supported_context?(json)
 
-    ActivityPub::ProcessStatusUpdateService.new.call(poll.status, json)
+    ActivityPub::ProcessStatusUpdateService.new.call(poll.status, json, json)
   end
 end
diff --git a/app/services/activitypub/process_status_update_service.rb b/app/services/activitypub/process_status_update_service.rb
index 1dc393e28..ecb058bf7 100644
--- a/app/services/activitypub/process_status_update_service.rb
+++ b/app/services/activitypub/process_status_update_service.rb
@@ -5,10 +5,11 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
   include Redisable
   include Lockable
 
-  def call(status, json, request_id: nil)
+  def call(status, activity_json, object_json, request_id: nil)
     raise ArgumentError, 'Status has unsaved changes' if status.changed?
 
-    @json                      = json
+    @activity_json             = activity_json
+    @json                      = object_json
     @status_parser             = ActivityPub::Parser::StatusParser.new(@json)
     @uri                       = @status_parser.uri
     @status                    = status
@@ -308,6 +309,6 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
   end
 
   def forwarder
-    @forwarder ||= ActivityPub::Forwarder.new(@account, @json, @status)
+    @forwarder ||= ActivityPub::Forwarder.new(@account, @activity_json, @status)
   end
 end
diff --git a/spec/services/activitypub/process_status_update_service_spec.rb b/spec/services/activitypub/process_status_update_service_spec.rb
index 750369d57..09c7fe94a 100644
--- a/spec/services/activitypub/process_status_update_service_spec.rb
+++ b/spec/services/activitypub/process_status_update_service_spec.rb
@@ -41,12 +41,12 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
 
   describe '#call' do
     it 'updates text' do
-      subject.call(status, json)
+      subject.call(status, json, json)
       expect(status.reload.text).to eq 'Hello universe'
     end
 
     it 'updates content warning' do
-      subject.call(status, json)
+      subject.call(status, json, json)
       expect(status.reload.spoiler_text).to eq 'Show more'
     end
 
@@ -64,7 +64,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
       end
 
       before do
-        subject.call(status, json)
+        subject.call(status, json, json)
       end
 
       it 'does not create any edits' do
@@ -87,7 +87,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
       end
 
       before do
-        subject.call(status, json)
+        subject.call(status, json, json)
       end
 
       it 'does not create any edits' do
@@ -135,7 +135,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
       end
 
       before do
-        subject.call(status, json)
+        subject.call(status, json, json)
       end
 
       it 'does not create any edits' do
@@ -188,7 +188,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
       end
 
       before do
-        subject.call(status, json)
+        subject.call(status, json, json)
       end
 
       it 'does not create any edits' do
@@ -216,11 +216,11 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
       end
 
       it 'does not create any edits' do
-        expect { subject.call(status, json) }.not_to change { status.reload.edits.pluck(&:id) }
+        expect { subject.call(status, json, json) }.to_not(change { status.reload.edits.pluck(&:id) })
       end
 
       it 'does not update the text, spoiler_text or edited_at' do
-        expect { subject.call(status, json) }.not_to change { s = status.reload; [s.text, s.spoiler_text, s.edited_at] }
+        expect { subject.call(status, json, json) }.to_not(change { s = status.reload; [s.text, s.spoiler_text, s.edited_at] })
       end
     end
 
@@ -235,7 +235,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
       end
 
       before do
-        subject.call(status, json)
+        subject.call(status, json, json)
       end
 
       it 'does not create any edits' do
@@ -259,7 +259,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
 
       before do
         status.update(ordered_media_attachment_ids: nil)
-        subject.call(status, json)
+        subject.call(status, json, json)
       end
 
       it 'does not create any edits' do
@@ -273,7 +273,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
 
     context 'originally without tags' do
       before do
-        subject.call(status, json)
+        subject.call(status, json, json)
       end
 
       it 'updates tags' do
@@ -299,7 +299,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
       end
 
       before do
-        subject.call(status, json)
+        subject.call(status, json, json)
       end
 
       it 'updates tags' do
@@ -309,7 +309,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
 
     context 'originally without mentions' do
       before do
-        subject.call(status, json)
+        subject.call(status, json, json)
       end
 
       it 'updates mentions' do
@@ -321,7 +321,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
       let(:mentions) { [alice, bob] }
 
       before do
-        subject.call(status, json)
+        subject.call(status, json, json)
       end
 
       it 'updates mentions' do
@@ -332,7 +332,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
     context 'originally without media attachments' do
       before do
         stub_request(:get, 'https://example.com/foo.png').to_return(body: attachment_fixture('emojo.png'))
-        subject.call(status, json)
+        subject.call(status, json, json)
       end
 
       let(:payload) do
@@ -382,7 +382,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
 
       before do
         allow(RedownloadMediaWorker).to receive(:perform_async)
-        subject.call(status, json)
+        subject.call(status, json, json)
       end
 
       it 'updates the existing media attachment in-place' do
@@ -410,7 +410,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
       before do
         poll = Fabricate(:poll, status: status)
         status.update(preloadable_poll: poll)
-        subject.call(status, json)
+        subject.call(status, json, json)
       end
 
       it 'removes poll' do
@@ -440,7 +440,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
       end
 
       before do
-        subject.call(status, json)
+        subject.call(status, json, json)
       end
 
       it 'creates a poll' do
@@ -456,12 +456,12 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
     end
 
     it 'creates edit history' do
-      subject.call(status, json)
+      subject.call(status, json, json)
       expect(status.edits.reload.map(&:text)).to eq ['Hello world', 'Hello universe']
     end
 
     it 'sets edited timestamp' do
-      subject.call(status, json)
+      subject.call(status, json, json)
       expect(status.reload.edited_at.to_s).to eq '2021-09-08 22:39:25 UTC'
     end
   end