From a78c64db351431bae1e74d03c097c25b23fa4af8 Mon Sep 17 00:00:00 2001
From: Arpit Jalan <arpit@techapj.com>
Date: Wed, 2 Dec 2020 18:38:26 +0530
Subject: [PATCH] FIX: on invite redemption only update pending ReviewableUser
 record (#11394)

When the invite was being redeemed and the ReviewableUser record status
for the invited user was not pending an error was being raised.

This commit makes sure that we are only looking for ReviewableUser
record with status pending and updates that to approved.
---
 app/models/invite_redeemer.rb       |  2 +-
 spec/models/invite_redeemer_spec.rb | 22 ++++++++++++++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/app/models/invite_redeemer.rb b/app/models/invite_redeemer.rb
index 997d970711f..a2d436a5e71 100644
--- a/app/models/invite_redeemer.rb
+++ b/app/models/invite_redeemer.rb
@@ -145,7 +145,7 @@ InviteRedeemer = Struct.new(:invite, :email, :username, :name, :password, :user_
   end
 
   def approve_account_if_needed
-    if invited_user.present? && reviewable_user = ReviewableUser.find_by(target: invited_user)
+    if invited_user.present? && reviewable_user = ReviewableUser.find_by(target: invited_user, status: Reviewable.statuses[:pending])
       reviewable_user.perform(
         invite.invited_by,
         :approve_user,
diff --git a/spec/models/invite_redeemer_spec.rb b/spec/models/invite_redeemer_spec.rb
index fd3d52cf2b6..79b5fc066a3 100644
--- a/spec/models/invite_redeemer_spec.rb
+++ b/spec/models/invite_redeemer_spec.rb
@@ -189,6 +189,28 @@ describe InviteRedeemer do
       expect(invite.invited_users.first).to be_present
     end
 
+    context "ReviewableUser" do
+      it "approves pending record" do
+        reviewable = ReviewableUser.needs_review!(target: Fabricate(:user, email: invite.email), created_by: invite.invited_by)
+        reviewable.status = Reviewable.statuses[:pending]
+        reviewable.save!
+        invite_redeemer.redeem
+
+        reviewable.reload
+        expect(reviewable.status).to eq(Reviewable.statuses[:approved])
+      end
+
+      it "does not raise error if record is not pending" do
+        reviewable = ReviewableUser.needs_review!(target: Fabricate(:user, email: invite.email), created_by: invite.invited_by)
+        reviewable.status = Reviewable.statuses[:ignored]
+        reviewable.save!
+        invite_redeemer.redeem
+
+        reviewable.reload
+        expect(reviewable.status).to eq(Reviewable.statuses[:ignored])
+      end
+    end
+
     context 'invite_link' do
       fab!(:invite_link) { Fabricate(:invite, max_redemptions_allowed: 5, expires_at: 1.month.from_now, emailed_status: Invite.emailed_status_types[:not_required]) }
       let(:invite_redeemer) { InviteRedeemer.new(invite: invite_link, email: 'foo@example.com') }