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
remotes/1727458204337373841/tmp_refs/heads/signup-info-prompt
ThibG 2020-06-04 19:03:31 +02:00 committed by GitHub
parent f669b8bcce
commit aed3a436a2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 28 additions and 0 deletions

View File

@ -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

View File

@ -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