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