diff --git a/app/forms/gpo_verify_form.rb b/app/forms/gpo_verify_form.rb index a9998f72c8d..891ee80c756 100644 --- a/app/forms/gpo_verify_form.rb +++ b/app/forms/gpo_verify_form.rb @@ -25,11 +25,9 @@ def submit pending_profile&.deactivate(:in_person_verification_pending) elsif fraud_review_checker.fraud_check_failed? && threatmetrix_enabled? bump_fraud_review_pending_timestamps + elsif fraud_review_checker.fraud_check_failed? + pending_profile&.activate_after_fraud_review_unnecessary else - pending_profile&.update!( - fraud_review_pending_at: nil, - fraud_rejection_at: nil, - ) activate_profile end else diff --git a/app/models/profile.rb b/app/models/profile.rb index 0598fdbf489..0dfb29e91fb 100644 --- a/app/models/profile.rb +++ b/app/models/profile.rb @@ -98,6 +98,17 @@ def activate_after_passing_review track_fraud_review_adjudication(decision: 'pass') if active? end + def activate_after_fraud_review_unnecessary + transaction do + update!( + fraud_review_pending_at: nil, + fraud_rejection_at: nil, + fraud_pending_reason: nil, + ) + activate + end + end + def activate_after_passing_in_person transaction do update!( diff --git a/spec/forms/gpo_verify_form_spec.rb b/spec/forms/gpo_verify_form_spec.rb index ae8618710f1..4e9b69843e7 100644 --- a/spec/forms/gpo_verify_form_spec.rb +++ b/spec/forms/gpo_verify_form_spec.rb @@ -13,8 +13,8 @@ let(:pending_profile) do create( :profile, + :verify_by_mail_pending, user: user, - gpo_verification_pending_at: 1.day.ago, proofing_components: proofing_components, ) end @@ -151,12 +151,7 @@ context 'ThreatMetrix rejection' do let(:pending_profile) do - create( - :profile, - user: user, - gpo_verification_pending_at: 1.day.ago, - fraud_review_pending_at: 1.day.ago, - ) + create(:profile, :verify_by_mail_pending, :fraud_review_pending, user: user) end let(:threatmetrix_review_status) { 'reject' } diff --git a/spec/models/profile_spec.rb b/spec/models/profile_spec.rb index 3450ccedcb7..cd023aefc8d 100644 --- a/spec/models/profile_spec.rb +++ b/spec/models/profile_spec.rb @@ -891,6 +891,51 @@ end end + describe '#activate_after_fraud_review_unnecessary' do + it 'activates a profile if fraud review is unnecessary' do + profile = create(:profile, :fraud_review_pending, user: user) + + expect(profile.activated_at).to be_nil # to change + expect(profile.active).to eq(false) # to change + expect(profile.deactivation_reason).to be_nil + expect(profile.fraud_review_pending?).to eq(true) # to change + expect(profile.gpo_verification_pending_at).to be_nil + expect(profile.initiating_service_provider).to be_nil + expect(profile.verified_at).to be_nil # to change + + expect(profile).to_not be_active + expect(profile.fraud_review_pending_at).to_not be_nil + expect(profile.fraud_pending_reason).to_not be_nil + + profile.activate_after_fraud_review_unnecessary + + expect(profile.activated_at).to be_present # changed + expect(profile.active).to eq(true) # changed + expect(profile.deactivation_reason).to be_nil + expect(profile.fraud_review_pending?).to eq(false) # changed + expect(profile.gpo_verification_pending_at).to be_nil + expect(profile.initiating_service_provider).to be_nil + expect(profile.verified_at).to be_present # changed + + expect(profile).to be_active + expect(profile.fraud_review_pending_at).to be_nil + expect(profile.fraud_pending_reason).to be_nil + end + + it 'does not activate a profile if transaction raises an error' do + profile = create(:profile, :fraud_review_pending, user: user) + + allow(profile).to receive(:update!).and_raise(RuntimeError) + + suppress(RuntimeError) do + profile.activate_after_fraud_review_unnecessary + end + + expect(profile.fraud_review_pending_at).to_not eq nil + expect(profile).to_not be_active + end + end + # TODO: does deactivating make sense for a non-active profile? Should we prevent it? # TODO: related: should we test against an active profile here? describe '#deactivate_for_gpo_verification' do @@ -993,7 +1038,7 @@ context 'it notifies the user' do let(:profile) do - profile = user.profiles.create(fraud_review_pending_at: 1.day.ago) + profile = create(:profile, :fraud_review_pending, user: user) profile.reject_for_fraud(notify_user: true) profile end @@ -1013,7 +1058,7 @@ context 'it does not notify the user' do let(:profile) do - profile = user.profiles.create(fraud_review_pending_at: 1.day.ago) + profile = create(:profile, :fraud_review_pending, user: user) profile.reject_for_fraud(notify_user: false) profile end @@ -1028,11 +1073,7 @@ context 'when the SP is the IRS' do let(:sp) { create(:service_provider, :irs) } let(:profile) do - user.profiles.create( - active: false, - fraud_review_pending_at: 1.day.ago, - initiating_service_provider: sp, - ) + create(:profile, :fraud_review_pending, active: false, initiating_service_provider: sp) end context 'and notify_user is true' do