# 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'
ActivityPub::DeviceSerializer
when 'ActivityPub::CollectionPresenter'
ActivityPub::CollectionSerializer
+ when 'String'
+ StringSerializer
else
super
end
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
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
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