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
This commit is contained in:
		| @@ -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,12 +41,15 @@ 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 | ||||||
|  |     previous_media_attachments_ids = @status.ordered_media_attachment_ids || previous_media_attachments.map(&:id) | ||||||
|     next_media_attachments         = [] |     next_media_attachments         = [] | ||||||
|  |  | ||||||
|     as_array(@json['attachment']).each do |attachment| |     as_array(@json['attachment']).each do |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! | ||||||
|   | |||||||
| @@ -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) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user