From 163ffdb19b134d54d446ec0a255994b9cf0f628b Mon Sep 17 00:00:00 2001
From: Benjamin Neff <benjamin@coding4coffee.ch>
Date: Sun, 27 Aug 2017 20:41:56 +0200
Subject: [PATCH] Allow multiple reshares without root

Follow-up for #7578

Fixes #7587
---
 app/models/reshare.rb       |  2 +-
 spec/models/reshare_spec.rb | 42 ++++++++++++++++++++++++++++++-------
 2 files changed, 35 insertions(+), 9 deletions(-)

diff --git a/app/models/reshare.rb b/app/models/reshare.rb
index bc6d8bfa1f..118fca68f9 100644
--- a/app/models/reshare.rb
+++ b/app/models/reshare.rb
@@ -6,7 +6,7 @@ class Reshare < Post
   belongs_to :root, class_name: "Post", foreign_key: :root_guid, primary_key: :guid, optional: true
   validate :root_must_be_public
   validates_presence_of :root, :on => :create
-  validates_uniqueness_of :root_guid, :scope => :author_id
+  validates :root_guid, uniqueness: {scope: :author_id}, allow_nil: true
   delegate :author, to: :root, prefix: true
 
   before_validation do
diff --git a/spec/models/reshare_spec.rb b/spec/models/reshare_spec.rb
index b861065ea1..26b0ca2678 100644
--- a/spec/models/reshare_spec.rb
+++ b/spec/models/reshare_spec.rb
@@ -3,15 +3,41 @@ describe Reshare, type: :model do
     expect(FactoryGirl.build(:reshare)).to be_valid
   end
 
-  it "requires root" do
-    reshare = FactoryGirl.build(:reshare, root: nil)
-    expect(reshare).not_to be_valid
-  end
+  context "validation" do
+    it "requires root" do
+      reshare = FactoryGirl.build(:reshare, root: nil)
+      expect(reshare).not_to be_valid
+    end
+
+    it "require public root" do
+      reshare = FactoryGirl.build(:reshare, root: FactoryGirl.create(:status_message, public: false))
+      expect(reshare).not_to be_valid
+      expect(reshare.errors[:base]).to include("Only posts which are public may be reshared.")
+    end
 
-  it "require public root" do
-    reshare = FactoryGirl.build(:reshare, root: FactoryGirl.create(:status_message, public: false))
-    expect(reshare).not_to be_valid
-    expect(reshare.errors[:base]).to include("Only posts which are public may be reshared.")
+    it "allows two reshares without a root" do
+      reshare1 = FactoryGirl.create(:reshare, author: alice.person)
+      reshare2 = FactoryGirl.create(:reshare, author: alice.person)
+
+      reshare1.update_attributes(root_guid: nil)
+
+      reshare2.root_guid = nil
+      expect(reshare2).to be_valid
+    end
+
+    it "doesn't allow to reshare the same post twice" do
+      post = FactoryGirl.create(:status_message, public: true)
+      FactoryGirl.create(:reshare, author: alice.person, root: post)
+
+      expect(FactoryGirl.build(:reshare, author: alice.person, root: post)).not_to be_valid
+    end
+
+    it "allows to reshare the same post with different people" do
+      post = FactoryGirl.create(:status_message, public: true)
+      FactoryGirl.create(:reshare, author: alice.person, root: post)
+
+      expect(FactoryGirl.build(:reshare, author: bob.person, root: post)).to be_valid
+    end
   end
 
   it "forces public" do
-- 
GitLab