Skip to content
This repository has been archived by the owner on Dec 21, 2023. It is now read-only.

Commit

Permalink
Fix serialization of replies when some of them are URIs (mastodon#13957)
Browse files Browse the repository at this point in the history
* Fix serialization of replies when some of them are URIs

Fixes mastodon#13956

* Add test
  • Loading branch information
ClearlyClaire authored Jun 4, 2020
1 parent f669b8b commit aed3a43
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 0 deletions.
11 changes: 11 additions & 0 deletions app/serializers/activitypub/collection_serializer.rb
Original file line number Diff line number Diff line change
@@ -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'
Expand All @@ -9,6 +18,8 @@ def self.serializer_for(model, options)
ActivityPub::DeviceSerializer
when 'ActivityPub::CollectionPresenter'
ActivityPub::CollectionSerializer
when 'String'
StringSerializer
else
super
end
Expand Down
17 changes: 17 additions & 0 deletions spec/controllers/activitypub/replies_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

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
Expand All @@ -14,6 +15,8 @@
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
Expand Down Expand Up @@ -110,6 +113,20 @@
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

Expand Down

0 comments on commit aed3a43

Please sign in to comment.