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
shrike
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
# 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
@ -41,13 +41,16 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
end
forward_activity! if significant_changes? && @status_parser.edited_at.present? && @status_parser.edited_at > last_edit_date
@status
end
private
def update_media_attachments!
previous_media_attachments = @status.media_attachments.to_a
next_media_attachments = []
previous_media_attachments = @status.media_attachments.to_a
previous_media_attachments_ids = @status.ordered_media_attachment_ids || previous_media_attachments.map(&:id)
next_media_attachments = []
as_array(@json['attachment']).each do |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.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
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'
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
before do
subject.call(status, json)