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 | ||||
| 
 | ||||
| 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 a new issue