FIX: Notify on Reviewable update. (#7980)

FIX: Notify on Reviewable update. (#7980)

If a post is flagged after an action was already performed on it, it will update the previous Reviable instance and not create a new one. The notification logic was implemented in the :create callback which was completely skipped in this case.

diff --git a/app/models/reviewable.rb b/app/models/reviewable.rb
index af23f15..b0142d1 100644
--- a/app/models/reviewable.rb
+++ b/app/models/reviewable.rb
@@ -38,6 +38,9 @@ class Reviewable < ActiveRecord::Base
 
   after_commit(on: :create) do
     DiscourseEvent.trigger(:reviewable_created, self)
+  end
+
+  after_commit(on: [:create, :update]) do
     Jobs.enqueue(:notify_reviewable, reviewable_id: self.id) if pending?
   end
 
diff --git a/spec/models/reviewable_spec.rb b/spec/models/reviewable_spec.rb
index 6d4c5e3..08d36bf 100644
--- a/spec/models/reviewable_spec.rb
+++ b/spec/models/reviewable_spec.rb
@@ -237,6 +237,7 @@ RSpec.describe Reviewable, type: :model do
 
   context "message bus notifications" do
     fab!(:moderator) { Fabricate(:moderator) }
+    let(:post) { Fabricate(:post) }
 
     it "triggers a notification on create" do
       reviewable = Fabricate(:reviewable_queued_post)
@@ -245,6 +246,18 @@ RSpec.describe Reviewable, type: :model do
       expect(job["args"].first["reviewable_id"]).to eq(reviewable.id)
     end
 
+    it "triggers a notification on update" do
+      reviewable = PostActionCreator.spam(moderator, post).reviewable
+      reviewable.perform(moderator, :disagree)
+
+      expect { PostActionCreator.spam(Fabricate(:user), post) }
+        .to change { reviewable.reload.status }
+        .from(Reviewable.statuses[:rejected])
+        .to(Reviewable.statuses[:pending])
+        .and change { Jobs::NotifyReviewable.jobs.size }
+        .by(1)
+    end
+
     it "triggers a notification on pending -> approve" do
       reviewable = Fabricate(:reviewable_queued_post)

GitHub sha: 3008eccc