119 lines
4.1 KiB
Ruby
119 lines
4.1 KiB
Ruby
# Copyright (c) 2010, Diaspora Inc. This file is
|
|
# licensed under the Affero General Public License version 3 or later. See
|
|
# the COPYRIGHT file.
|
|
|
|
require 'spec_helper'
|
|
require File.join(Rails.root, "spec", "shared_behaviors", "relayable")
|
|
|
|
describe RelayableRetraction do
|
|
before do
|
|
@local_luke, @local_leia, @remote_raphael = set_up_friends
|
|
@remote_parent = Factory.create(:status_message, :author => @remote_raphael)
|
|
@local_parent = @local_luke.post :status_message, :text => "hi", :to => @local_luke.aspects.first
|
|
end
|
|
|
|
describe '#subscribers' do
|
|
before do
|
|
@comment= @local_luke.comment("yo", :post => @local_parent)
|
|
@retraction= @local_luke.retract(@comment)
|
|
end
|
|
it 'delegates it to target' do
|
|
arg = mock()
|
|
@retraction.target.should_receive(:subscribers).with(arg)
|
|
@retraction.subscribers(arg)
|
|
end
|
|
end
|
|
|
|
describe '#receive' do
|
|
it 'discards a retraction with a nil target' do
|
|
@comment= @local_luke.comment("yo", :post => @local_parent)
|
|
@retraction= @local_luke.retract(@comment)
|
|
|
|
@retraction.instance_variable_set(:@target, nil)
|
|
@retraction.target_guid = '135245'
|
|
@retraction.should_not_receive(:perform)
|
|
@retraction.receive(@local_luke, @remote_raphael)
|
|
end
|
|
context 'from the downstream author' do
|
|
before do
|
|
@comment = @local_leia.comment("yo", :post => @local_parent)
|
|
@retraction = @local_leia.retract(@comment)
|
|
@recipient = @local_luke
|
|
end
|
|
it 'signs' do
|
|
@retraction.should_receive(:sign_with_key) do |key|
|
|
key.to_s.should == @recipient.encryption_key.to_s
|
|
end
|
|
@retraction.receive(@recipient, @comment.author)
|
|
end
|
|
it 'dispatches' do
|
|
zord = mock()
|
|
zord.should_receive(:post)
|
|
Postzord::Dispatcher.should_receive(:new).with(@local_luke, @retraction).and_return zord
|
|
@retraction.receive(@recipient, @comment.author)
|
|
end
|
|
it 'performs' do
|
|
@retraction.should_receive(:perform).with(@local_luke)
|
|
@retraction.receive(@recipient, @comment.author)
|
|
end
|
|
end
|
|
context 'from the upstream owner' do
|
|
before do
|
|
@comment = @local_luke.comment("Yeah, it was great", :post => @remote_parent)
|
|
@retraction = RelayableRetraction.allocate
|
|
@retraction.sender = @remote_raphael
|
|
@retraction.target = @comment
|
|
@retraction.stub!(:parent_author_signature_valid?).and_return(true)
|
|
@recipient = @local_luke
|
|
end
|
|
it 'performs' do
|
|
@retraction.should_receive(:perform).with(@recipient)
|
|
@retraction.receive(@recipient, @remote_raphael)
|
|
end
|
|
it 'does not dispatch' do
|
|
Postzord::Dispatcher.should_not_receive(:new)
|
|
@retraction.receive(@recipient, @remote_raphael)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe 'xml' do
|
|
before do
|
|
@comment = @local_leia.comment("yo", :post => @local_parent)
|
|
@retraction = RelayableRetraction.build(@local_leia, @comment)
|
|
@retraction.parent_author_signature = 'PARENTSIGNATURE'
|
|
@retraction.target_author_signature = 'TARGETSIGNATURE'
|
|
@xml = @retraction.to_xml.to_s
|
|
end
|
|
describe '#to_xml' do
|
|
it 'serializes target_guid' do
|
|
@xml.should include(@comment.guid)
|
|
end
|
|
it 'serializes target_type' do
|
|
@xml.should include(@comment.class.to_s)
|
|
end
|
|
it 'serializes sender_handle' do
|
|
@xml.should include(@local_leia.diaspora_handle)
|
|
end
|
|
it 'serializes signatures' do
|
|
@xml.should include('TARGETSIGNATURE')
|
|
@xml.should include('PARENTSIGNATURE')
|
|
end
|
|
end
|
|
describe '.from_xml' do
|
|
before do
|
|
@marshalled = RelayableRetraction.from_xml(@xml)
|
|
end
|
|
it 'marshals the target' do
|
|
@marshalled.target.should == @comment
|
|
end
|
|
it 'marshals the sender' do
|
|
@marshalled.sender.should == @local_leia.person
|
|
end
|
|
it 'marshals the signature' do
|
|
@marshalled.target_author_signature.should == 'TARGETSIGNATURE'
|
|
@marshalled.parent_author_signature.should == 'PARENTSIGNATURE'
|
|
end
|
|
end
|
|
end
|
|
end
|