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:
		@@ -1,6 +1,15 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
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)
 | 
			
		||||
    case model.class.name
 | 
			
		||||
    when 'Status'
 | 
			
		||||
@@ -9,6 +18,8 @@ class ActivityPub::CollectionSerializer < ActivityPub::Serializer
 | 
			
		||||
      ActivityPub::DeviceSerializer
 | 
			
		||||
    when 'ActivityPub::CollectionPresenter'
 | 
			
		||||
      ActivityPub::CollectionSerializer
 | 
			
		||||
    when 'String'
 | 
			
		||||
      StringSerializer
 | 
			
		||||
    else
 | 
			
		||||
      super
 | 
			
		||||
    end
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@ require 'rails_helper'
 | 
			
		||||
 | 
			
		||||
RSpec.describe ActivityPub::RepliesController, type: :controller do
 | 
			
		||||
  let(:status) { Fabricate(:status, visibility: parent_visibility) }
 | 
			
		||||
  let(:remote_reply_id) { nil }
 | 
			
		||||
  let(:remote_account) { nil }
 | 
			
		||||
 | 
			
		||||
  before do
 | 
			
		||||
@@ -14,6 +15,8 @@ RSpec.describe ActivityPub::RepliesController, type: :controller do
 | 
			
		||||
    Fabricate(:status, thread: status, visibility: :private)
 | 
			
		||||
    Fabricate(:status, account: status.account, thread: status, visibility: :public)
 | 
			
		||||
    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
 | 
			
		||||
 | 
			
		||||
  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].all? { |item| item[:to].include?(ActivityPub::TagManager::COLLECTIONS[:public]) || item[:cc].include?(ActivityPub::TagManager::COLLECTIONS[:public]) }).to be true
 | 
			
		||||
            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
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user