From 66925918b124dced2648cfc13629d0503fdc8636 Mon Sep 17 00:00:00 2001
From: Jason Robinson <mail@jasonrobinson.me>
Date: Sat, 21 Nov 2015 21:44:32 +0200
Subject: [PATCH] Send comment to reshare author when commenting on reshare

As posts are always delivered also to reshare root, comments should also be delivered to reshare root, for concistency.
---
 lib/federated/generator.rb                    |  9 +++++++
 spec/lib/diaspora/federated/generator_spec.rb | 25 +++++++++++++++++++
 2 files changed, 34 insertions(+)
 create mode 100644 spec/lib/diaspora/federated/generator_spec.rb

diff --git a/lib/federated/generator.rb b/lib/federated/generator.rb
index da3a8390e4..062d13168d 100644
--- a/lib/federated/generator.rb
+++ b/lib/federated/generator.rb
@@ -12,11 +12,20 @@ module Federated
       relayable = build(options)
       if relayable.save!
         logger.info "user:#{@user.id} dispatching #{relayable.class}:#{relayable.guid}"
+        add_root_author(relayable)
         Postzord::Dispatcher.defer_build_and_post(@user, relayable, @dispatcher_opts)
         relayable
       end
     end
 
+    def add_root_author(relayable)
+      return unless relayable.parent.respond_to?(:root) && relayable.parent.root
+      # Comment post is a reshare, include original author in subscribers
+      root_post = relayable.parent.root
+      @dispatcher_opts[:additional_subscribers] ||= []
+      @dispatcher_opts[:additional_subscribers] << root_post.author
+    end
+
     def build(options={})
       options.merge!(relayable_options)
       relayable = self.class.federated_class.new(options.merge(:author_id => @user.person.id))
diff --git a/spec/lib/diaspora/federated/generator_spec.rb b/spec/lib/diaspora/federated/generator_spec.rb
new file mode 100644
index 0000000000..a7859efc61
--- /dev/null
+++ b/spec/lib/diaspora/federated/generator_spec.rb
@@ -0,0 +1,25 @@
+require "spec_helper"
+
+describe "adds root author on reshare" do
+  before do
+    @generator = Federated::Generator.new(double("user", id: 1), double)
+    @root_author = double("root_author")
+    root = double("root", author: @root_author)
+    parent = double("parent", root: root)
+    @relayable = double("relayable", parent: parent, class: "foo", guid: "123")
+  end
+
+  it "adds root to additional subscribers" do
+    @generator.add_root_author(@relayable)
+    additional_subscribers = @generator.instance_variable_get(:@dispatcher_opts)[:additional_subscribers]
+    expect(additional_subscribers).to include(@root_author)
+  end
+
+  it "calls add_root_author" do
+    allow(Postzord::Dispatcher).to receive(:defer_build_and_post).and_return(true)
+    allow(@generator).to receive(:build).and_return(@relayable)
+    allow(@relayable).to receive(:save!).and_return(true)
+    expect(@generator).to receive(:add_root_author)
+    @generator.create!
+  end
+end
-- 
GitLab