Fix issues with processing toot edits (#17748)

* Fix searching for an already-known status by URL not working

* Fix Update processing from statuses prior to 20220302232632

`ordered_media_attachment_ids_changed?` would return `true` when going from
`nil` to anything (including `[]`).

* Add tests
pull/17755/head
Claire 2022-03-12 19:33:10 +01:00 committed by GitHub
parent d3aa9cf774
commit 92a86b958e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 4 deletions

View File

@ -13,7 +13,7 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
@poll_changed = false @poll_changed = false
# Only native types can be updated at the moment # Only native types can be updated at the moment
return if !expected_type? || already_updated_more_recently? return @status if !expected_type? || already_updated_more_recently?
last_edit_date = status.edited_at.presence || status.created_at last_edit_date = status.edited_at.presence || status.created_at
@ -41,13 +41,16 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
end end
forward_activity! if significant_changes? && @status_parser.edited_at.present? && @status_parser.edited_at > last_edit_date forward_activity! if significant_changes? && @status_parser.edited_at.present? && @status_parser.edited_at > last_edit_date
@status
end end
private private
def update_media_attachments! def update_media_attachments!
previous_media_attachments = @status.media_attachments.to_a previous_media_attachments = @status.media_attachments.to_a
next_media_attachments = [] previous_media_attachments_ids = @status.ordered_media_attachment_ids || previous_media_attachments.map(&:id)
next_media_attachments = []
as_array(@json['attachment']).each do |attachment| as_array(@json['attachment']).each do |attachment|
media_attachment_parser = ActivityPub::Parser::MediaAttachmentParser.new(attachment) media_attachment_parser = ActivityPub::Parser::MediaAttachmentParser.new(attachment)
@ -87,7 +90,7 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
@status.ordered_media_attachment_ids = next_media_attachments.map(&:id) @status.ordered_media_attachment_ids = next_media_attachments.map(&:id)
@status.media_attachments.reload @status.media_attachments.reload
@media_attachments_changed = true if @status.ordered_media_attachment_ids_changed? @media_attachments_changed = true if @status.ordered_media_attachment_ids != previous_media_attachments_ids
end end
def update_poll! def update_poll!

View File

@ -46,6 +46,26 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
expect(status.reload.spoiler_text).to eq 'Show more' expect(status.reload.spoiler_text).to eq 'Show more'
end end
context 'with no changes and originally with no ordered_media_attachment_ids' do
let(:payload) do
{
'@context': 'https://www.w3.org/ns/activitystreams',
id: 'foo',
type: 'Note',
content: 'Hello world',
}
end
before do
status.update(ordered_media_attachment_ids: nil)
subject.call(status, json)
end
it 'does not record an update' do
expect(status.reload.edited?).to be false
end
end
context 'originally without tags' do context 'originally without tags' do
before do before do
subject.call(status, json) subject.call(status, json)