| 
									
										
										
										
											2017-08-08 21:52:15 +02:00
										 |  |  | require 'rails_helper' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | RSpec.describe ActivityPub::Activity::Announce do | 
					
						
							| 
									
										
										
										
											2019-02-17 15:16:36 +01:00
										 |  |  |   let(:sender)    { Fabricate(:account, followers_url: 'http://example.com/followers', uri: 'https://example.com/actor') } | 
					
						
							| 
									
										
										
										
											2017-08-08 21:52:15 +02:00
										 |  |  |   let(:recipient) { Fabricate(:account) } | 
					
						
							|  |  |  |   let(:status)    { Fabricate(:status, account: recipient) } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   let(:json) do | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       '@context': 'https://www.w3.org/ns/activitystreams', | 
					
						
							|  |  |  |       id: 'foo', | 
					
						
							|  |  |  |       type: 'Announce', | 
					
						
							| 
									
										
										
										
											2019-02-17 15:16:36 +01:00
										 |  |  |       actor: 'https://example.com/actor', | 
					
						
							| 
									
										
										
										
											2019-02-13 18:36:23 +01:00
										 |  |  |       object: object_json, | 
					
						
							| 
									
										
										
										
											2019-03-17 14:54:09 +01:00
										 |  |  |       to: 'http://example.com/followers', | 
					
						
							| 
									
										
										
										
											2017-08-08 21:52:15 +02:00
										 |  |  |     }.with_indifferent_access | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-17 15:16:36 +01:00
										 |  |  |   let(:unknown_object_json) do | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       '@context': 'https://www.w3.org/ns/activitystreams', | 
					
						
							|  |  |  |       id: 'https://example.com/actor/hello-world', | 
					
						
							|  |  |  |       type: 'Note', | 
					
						
							|  |  |  |       attributedTo: 'https://example.com/actor', | 
					
						
							|  |  |  |       content: 'Hello world', | 
					
						
							|  |  |  |       to: 'http://example.com/followers', | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-02-13 18:36:23 +01:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2017-08-08 21:52:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-17 15:16:36 +01:00
										 |  |  |   subject { described_class.new(json, sender) } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-13 18:36:23 +01:00
										 |  |  |   describe '#perform' do | 
					
						
							| 
									
										
										
										
											2019-02-17 03:38:25 +01:00
										 |  |  |     context 'when sender is followed by a local account' do | 
					
						
							|  |  |  |       before do | 
					
						
							|  |  |  |         Fabricate(:account).follow!(sender) | 
					
						
							| 
									
										
										
										
											2019-02-17 15:16:36 +01:00
										 |  |  |         stub_request(:get, 'https://example.com/actor/hello-world').to_return(body: Oj.dump(unknown_object_json)) | 
					
						
							| 
									
										
										
										
											2019-02-17 03:38:25 +01:00
										 |  |  |         subject.perform | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context 'a known status' do | 
					
						
							|  |  |  |         let(:object_json) do | 
					
						
							|  |  |  |           ActivityPub::TagManager.instance.uri_for(status) | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it 'creates a reblog by sender of status' do | 
					
						
							|  |  |  |           expect(sender.reblogged?(status)).to be true | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-17 15:16:36 +01:00
										 |  |  |       context 'an unknown status' do | 
					
						
							|  |  |  |         let(:object_json) { 'https://example.com/actor/hello-world' } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it 'creates a reblog by sender of status' do | 
					
						
							|  |  |  |           reblog = sender.statuses.first | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           expect(reblog).to_not be_nil | 
					
						
							|  |  |  |           expect(reblog.reblog.text).to eq 'Hello world' | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-17 03:38:25 +01:00
										 |  |  |       context 'self-boost of a previously unknown status with correct attributedTo' do | 
					
						
							|  |  |  |         let(:object_json) do | 
					
						
							|  |  |  |           { | 
					
						
							| 
									
										
										
										
											2019-02-17 15:16:36 +01:00
										 |  |  |             id: 'https://example.com/actor#bar', | 
					
						
							| 
									
										
										
										
											2019-02-17 03:38:25 +01:00
										 |  |  |             type: 'Note', | 
					
						
							|  |  |  |             content: 'Lorem ipsum', | 
					
						
							| 
									
										
										
										
											2019-02-17 15:16:36 +01:00
										 |  |  |             attributedTo: 'https://example.com/actor', | 
					
						
							| 
									
										
										
										
											2019-02-17 03:38:25 +01:00
										 |  |  |             to: 'http://example.com/followers', | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it 'creates a reblog by sender of status' do | 
					
						
							|  |  |  |           expect(sender.reblogged?(sender.statuses.first)).to be true | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2017-08-08 21:52:15 +02:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-17 03:38:25 +01:00
										 |  |  |     context 'when the status belongs to a local user' do | 
					
						
							|  |  |  |       before do | 
					
						
							|  |  |  |         subject.perform | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-13 18:36:23 +01:00
										 |  |  |       let(:object_json) do | 
					
						
							|  |  |  |         ActivityPub::TagManager.instance.uri_for(status) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it 'creates a reblog by sender of status' do | 
					
						
							|  |  |  |         expect(sender.reblogged?(status)).to be true | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-17 03:38:25 +01:00
										 |  |  |     context 'when the sender is relayed' do | 
					
						
							|  |  |  |       let!(:relay_account) { Fabricate(:account, inbox_url: 'https://relay.example.com/inbox') } | 
					
						
							|  |  |  |       let!(:relay) { Fabricate(:relay, inbox_url: 'https://relay.example.com/inbox') } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       subject { described_class.new(json, sender, relayed_through_account: relay_account) } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context 'and the relay is enabled' do | 
					
						
							|  |  |  |         before do | 
					
						
							|  |  |  |           relay.update(state: :accepted) | 
					
						
							|  |  |  |           subject.perform | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let(:object_json) do | 
					
						
							|  |  |  |           { | 
					
						
							| 
									
										
										
										
											2019-02-17 15:16:36 +01:00
										 |  |  |             id: 'https://example.com/actor#bar', | 
					
						
							| 
									
										
										
										
											2019-02-17 03:38:25 +01:00
										 |  |  |             type: 'Note', | 
					
						
							|  |  |  |             content: 'Lorem ipsum', | 
					
						
							|  |  |  |             to: 'http://example.com/followers', | 
					
						
							| 
									
										
										
										
											2019-06-04 23:24:31 +02:00
										 |  |  |             attributedTo: 'https://example.com/actor', | 
					
						
							| 
									
										
										
										
											2019-02-17 03:38:25 +01:00
										 |  |  |           } | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it 'creates a reblog by sender of status' do | 
					
						
							|  |  |  |           expect(sender.statuses.count).to eq 2
 | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2019-02-13 18:36:23 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-17 03:38:25 +01:00
										 |  |  |       context 'and the relay is disabled' do | 
					
						
							|  |  |  |         before do | 
					
						
							|  |  |  |           subject.perform | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let(:object_json) do | 
					
						
							|  |  |  |           { | 
					
						
							| 
									
										
										
										
											2019-02-17 15:16:36 +01:00
										 |  |  |             id: 'https://example.com/actor#bar', | 
					
						
							| 
									
										
										
										
											2019-02-17 03:38:25 +01:00
										 |  |  |             type: 'Note', | 
					
						
							|  |  |  |             content: 'Lorem ipsum', | 
					
						
							|  |  |  |             to: 'http://example.com/followers', | 
					
						
							| 
									
										
										
										
											2019-06-04 23:24:31 +02:00
										 |  |  |             attributedTo: 'https://example.com/actor', | 
					
						
							| 
									
										
										
										
											2019-02-17 03:38:25 +01:00
										 |  |  |           } | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it 'does not create anything' do | 
					
						
							|  |  |  |           expect(sender.statuses.count).to eq 0
 | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2019-02-13 18:36:23 +01:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-17 03:38:25 +01:00
										 |  |  |     context 'when the sender has no relevance to local activity' do | 
					
						
							|  |  |  |       before do | 
					
						
							|  |  |  |         subject.perform | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-13 18:36:23 +01:00
										 |  |  |       let(:object_json) do | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2019-02-17 15:16:36 +01:00
										 |  |  |           id: 'https://example.com/actor#bar', | 
					
						
							| 
									
										
										
										
											2019-02-13 18:36:23 +01:00
										 |  |  |           type: 'Note', | 
					
						
							|  |  |  |           content: 'Lorem ipsum', | 
					
						
							|  |  |  |           to: 'http://example.com/followers', | 
					
						
							| 
									
										
										
										
											2019-06-04 23:24:31 +02:00
										 |  |  |           attributedTo: 'https://example.com/actor', | 
					
						
							| 
									
										
										
										
											2019-02-13 18:36:23 +01:00
										 |  |  |         } | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-17 03:38:25 +01:00
										 |  |  |       it 'does not create anything' do | 
					
						
							|  |  |  |         expect(sender.statuses.count).to eq 0
 | 
					
						
							| 
									
										
										
										
											2019-02-13 18:36:23 +01:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2017-08-08 21:52:15 +02:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |