From c15babdc9ff7e2842e22e1c2b380219d34b39919 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Tue, 14 Jun 2016 17:15:15 +0200 Subject: [PATCH] allow to dispatch to specific subscribers --- lib/diaspora/federation/dispatcher.rb | 10 +++++++++- .../federation/dispatcher/private_spec.rb | 20 +++++++++++++++++-- .../federation/dispatcher/public_spec.rb | 17 ++++++++++++++-- spec/shared_behaviors/dispatcher.rb | 10 ++++++++++ 4 files changed, 52 insertions(+), 5 deletions(-) diff --git a/lib/diaspora/federation/dispatcher.rb b/lib/diaspora/federation/dispatcher.rb index 21ec82c3e..6190c6e73 100644 --- a/lib/diaspora/federation/dispatcher.rb +++ b/lib/diaspora/federation/dispatcher.rb @@ -35,7 +35,7 @@ module Diaspora end def deliver_to_subscribers - local_people, remote_people = object.subscribers.partition(&:local?) + local_people, remote_people = subscribers.partition(&:local?) deliver_to_local(local_people) unless local_people.empty? deliver_to_remote(remote_people) @@ -63,6 +63,14 @@ module Diaspora def each_service sender.services.where(type: opts[:service_types]).each {|service| yield(service) } end + + def subscribers + opts[:subscribers] || subscribers_from_ids || object.subscribers + end + + def subscribers_from_ids + Person.where(id: opts[:subscriber_ids]) if opts[:subscriber_ids] + end end end end diff --git a/spec/lib/diaspora/federation/dispatcher/private_spec.rb b/spec/lib/diaspora/federation/dispatcher/private_spec.rb index db9ed9682..5ef6c108e 100644 --- a/spec/lib/diaspora/federation/dispatcher/private_spec.rb +++ b/spec/lib/diaspora/federation/dispatcher/private_spec.rb @@ -11,9 +11,8 @@ describe Diaspora::Federation::Dispatcher::Private do describe "#dispatch" do context "deliver to remote user" do + let(:xml) { "" } it "queues a private send job" do - xml = "" - expect(Workers::SendPrivate).to receive(:perform_async) do |user_id, _entity_string, targets| expect(user_id).to eq(alice.id) expect(targets.size).to eq(1) @@ -36,6 +35,23 @@ describe Diaspora::Federation::Dispatcher::Private do Diaspora::Federation::Dispatcher.build(bob, bobs_post).dispatch end + + it "queues private send job for a specific subscriber" do + remote_person = FactoryGirl.create(:person) + + expect(Workers::SendPrivate).to receive(:perform_async) do |user_id, _entity_string, targets| + expect(user_id).to eq(alice.id) + expect(targets.size).to eq(1) + expect(targets).to have_key(remote_person.receive_url) + expect(targets[remote_person.receive_url]).to eq(xml) + end + + salmon = double + expect(DiasporaFederation::Salmon::EncryptedSlap).to receive(:prepare).and_return(salmon) + expect(salmon).to receive(:generate_xml).and_return(xml) + + Diaspora::Federation::Dispatcher.build(alice, post, subscribers: [remote_person]).dispatch + end end end diff --git a/spec/lib/diaspora/federation/dispatcher/public_spec.rb b/spec/lib/diaspora/federation/dispatcher/public_spec.rb index c8abf6d67..5fb654f02 100644 --- a/spec/lib/diaspora/federation/dispatcher/public_spec.rb +++ b/spec/lib/diaspora/federation/dispatcher/public_spec.rb @@ -50,11 +50,11 @@ describe Diaspora::Federation::Dispatcher::Public do end context "deliver to remote user" do + let(:salmon_xml) { "" } + it "queues a public send job" do alice.share_with(remote_raphael, alice.aspects.first) - salmon_xml = "" - expect(Workers::SendPublic).to receive(:perform_async) do |user_id, _entity_string, urls, xml| expect(user_id).to eq(alice.id) expect(urls.size).to eq(1) @@ -72,6 +72,19 @@ describe Diaspora::Federation::Dispatcher::Public do Diaspora::Federation::Dispatcher.build(alice, post).dispatch end + + it "queues public send job for a specific subscriber" do + expect(Workers::SendPublic).to receive(:perform_async) do |user_id, _entity_string, urls, xml| + expect(user_id).to eq(alice.id) + expect(urls.size).to eq(1) + expect(urls[0]).to eq(remote_raphael.pod.url_to("/receive/public")) + expect(xml).to eq(salmon_xml) + end + + expect(DiasporaFederation::Salmon::Slap).to receive(:generate_xml).and_return(salmon_xml) + + Diaspora::Federation::Dispatcher.build(alice, post, subscribers: [remote_raphael]).dispatch + end end end diff --git a/spec/shared_behaviors/dispatcher.rb b/spec/shared_behaviors/dispatcher.rb index 44f71ba33..8527ccfc1 100644 --- a/spec/shared_behaviors/dispatcher.rb +++ b/spec/shared_behaviors/dispatcher.rb @@ -69,6 +69,16 @@ shared_examples "a dispatcher" do Diaspora::Federation::Dispatcher.build(alice, object).dispatch end + + it "queues receive local job for a specific subscriber" do + expect(Workers::ReceiveLocal).to receive(:perform_async).with("StatusMessage", post.id, [eve.id]) + Diaspora::Federation::Dispatcher.build(alice, post, subscribers: [eve.person]).dispatch + end + + it "queues receive local job for a specific subscriber id" do + expect(Workers::ReceiveLocal).to receive(:perform_async).with("StatusMessage", post.id, [eve.id]) + Diaspora::Federation::Dispatcher.build(alice, post, subscriber_ids: [eve.person.id]).dispatch + end end end end