Fix serialization of replies when some of them are URIs (#13957)
* Fix serialization of replies when some of them are URIs Fixes #13956 * Add test
This commit is contained in:
		
							parent
							
								
									f669b8bcce
								
							
						
					
					
						commit
						aed3a436a2
					
				
					 2 changed files with 28 additions and 0 deletions
				
			
		| 
						 | 
					@ -1,6 +1,15 @@
 | 
				
			||||||
# frozen_string_literal: true
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ActivityPub::CollectionSerializer < ActivityPub::Serializer
 | 
					class ActivityPub::CollectionSerializer < ActivityPub::Serializer
 | 
				
			||||||
 | 
					  class StringSerializer < ActiveModel::Serializer
 | 
				
			||||||
 | 
					    # Despite the name, it does not return a hash, but the same can be said of
 | 
				
			||||||
 | 
					    # the ActiveModel::Serializer::CollectionSerializer class which handles
 | 
				
			||||||
 | 
					    # arrays.
 | 
				
			||||||
 | 
					    def serializable_hash(*_args)
 | 
				
			||||||
 | 
					      object
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def self.serializer_for(model, options)
 | 
					  def self.serializer_for(model, options)
 | 
				
			||||||
    case model.class.name
 | 
					    case model.class.name
 | 
				
			||||||
    when 'Status'
 | 
					    when 'Status'
 | 
				
			||||||
| 
						 | 
					@ -9,6 +18,8 @@ class ActivityPub::CollectionSerializer < ActivityPub::Serializer
 | 
				
			||||||
      ActivityPub::DeviceSerializer
 | 
					      ActivityPub::DeviceSerializer
 | 
				
			||||||
    when 'ActivityPub::CollectionPresenter'
 | 
					    when 'ActivityPub::CollectionPresenter'
 | 
				
			||||||
      ActivityPub::CollectionSerializer
 | 
					      ActivityPub::CollectionSerializer
 | 
				
			||||||
 | 
					    when 'String'
 | 
				
			||||||
 | 
					      StringSerializer
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      super
 | 
					      super
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,6 +4,7 @@ require 'rails_helper'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RSpec.describe ActivityPub::RepliesController, type: :controller do
 | 
					RSpec.describe ActivityPub::RepliesController, type: :controller do
 | 
				
			||||||
  let(:status) { Fabricate(:status, visibility: parent_visibility) }
 | 
					  let(:status) { Fabricate(:status, visibility: parent_visibility) }
 | 
				
			||||||
 | 
					  let(:remote_reply_id) { nil }
 | 
				
			||||||
  let(:remote_account) { nil }
 | 
					  let(:remote_account) { nil }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  before do
 | 
					  before do
 | 
				
			||||||
| 
						 | 
					@ -14,6 +15,8 @@ RSpec.describe ActivityPub::RepliesController, type: :controller do
 | 
				
			||||||
    Fabricate(:status, thread: status, visibility: :private)
 | 
					    Fabricate(:status, thread: status, visibility: :private)
 | 
				
			||||||
    Fabricate(:status, account: status.account, thread: status, visibility: :public)
 | 
					    Fabricate(:status, account: status.account, thread: status, visibility: :public)
 | 
				
			||||||
    Fabricate(:status, account: status.account, thread: status, visibility: :private)
 | 
					    Fabricate(:status, account: status.account, thread: status, visibility: :private)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Fabricate(:status, account: remote_account, thread: status, visibility: :public, uri: remote_reply_id) if remote_reply_id
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  describe 'GET #index' do
 | 
					  describe 'GET #index' do
 | 
				
			||||||
| 
						 | 
					@ -110,6 +113,20 @@ RSpec.describe ActivityPub::RepliesController, type: :controller do
 | 
				
			||||||
              expect(json[:first][:items].size).to eq 2
 | 
					              expect(json[:first][:items].size).to eq 2
 | 
				
			||||||
              expect(json[:first][:items].all? { |item| item[:to].include?(ActivityPub::TagManager::COLLECTIONS[:public]) || item[:cc].include?(ActivityPub::TagManager::COLLECTIONS[:public]) }).to be true
 | 
					              expect(json[:first][:items].all? { |item| item[:to].include?(ActivityPub::TagManager::COLLECTIONS[:public]) || item[:cc].include?(ActivityPub::TagManager::COLLECTIONS[:public]) }).to be true
 | 
				
			||||||
            end
 | 
					            end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            context 'with remote responses' do
 | 
				
			||||||
 | 
					              let(:remote_reply_id) { 'foo' }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              it 'returned items are all inlined local toots or are ids' do
 | 
				
			||||||
 | 
					                json = body_as_json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                expect(json[:first]).to be_a Hash
 | 
				
			||||||
 | 
					                expect(json[:first][:items]).to be_an Array
 | 
				
			||||||
 | 
					                expect(json[:first][:items].size).to eq 3
 | 
				
			||||||
 | 
					                expect(json[:first][:items].all? { |item| item.is_a?(Hash) ? ActivityPub::TagManager.instance.local_uri?(item[:id]) : item.is_a?(String) }).to be true
 | 
				
			||||||
 | 
					                expect(json[:first][:items]).to include remote_reply_id
 | 
				
			||||||
 | 
					              end
 | 
				
			||||||
 | 
					            end
 | 
				
			||||||
          end
 | 
					          end
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue