From ad284da8fb10cea62660c3c066fcf1c74f9ece1e Mon Sep 17 00:00:00 2001 From: Alex Bradley Date: Tue, 20 Dec 2022 14:36:36 -0500 Subject: [PATCH 1/6] initial steps for rake script to review profile --- lib/tasks/review_profile.rake | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 lib/tasks/review_profile.rake diff --git a/lib/tasks/review_profile.rake b/lib/tasks/review_profile.rake new file mode 100644 index 00000000000..2233175c70e --- /dev/null +++ b/lib/tasks/review_profile.rake @@ -0,0 +1,25 @@ +namespace :users do + desc 'Review a user profile and pass them' + task review_user: :environment do |_task, args| + require 'io/console' + user_uuid = STDIN.getpass('Enter the UUID of the user to look up(input will be hidden): ') + user = User.find_by(uuid: user_uuid) + + if user.present? + review_status = ProofingComponent.find_by(user: user) + puts('Do you want to pass or reject this user? [PASS/REJECT]:') + pass_or_reject = STDIN.gets.strip.downcase + if pass_or_reject == 'pass' + review_status.update(threatmetrix_review_status: 'pass') + puts "User's review state is updated to #{review_status.threatmetrix_review_status}" + elsif pass_or_reject == 'reject' + review_status.update(threatmetrix_review_status: 'reject') + puts "User's review state is updated to #{review_status.threatmetrix_review_status}" + else + puts "User's review status has not changed" + end + else + puts 'No user found' + end + end +end From 0f924afddaa063fdea3f6ff3b54bc344c10da3d7 Mon Sep 17 00:00:00 2001 From: Alex Bradley Date: Thu, 22 Dec 2022 11:58:13 -0500 Subject: [PATCH 2/6] rewrite tasks for passing and rejecting --- lib/tasks/review_profile.rake | 44 +++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/lib/tasks/review_profile.rake b/lib/tasks/review_profile.rake index 2233175c70e..e3e1d32db02 100644 --- a/lib/tasks/review_profile.rake +++ b/lib/tasks/review_profile.rake @@ -1,25 +1,33 @@ +require 'io/console' + namespace :users do - desc 'Review a user profile and pass them' - task review_user: :environment do |_task, args| - require 'io/console' - user_uuid = STDIN.getpass('Enter the UUID of the user to look up(input will be hidden): ') - user = User.find_by(uuid: user_uuid) + namespace :review do + desc 'Pass a user that has a pending review' + task pass: :environment do |_task, args| + user_uuid = STDIN.getpass('Enter the User UUID to pass (input will be hidden):') + user = User.find_by(uuid: user_uuid) + + if user.decorate.threatmetrix_review_pending? + result = ProofingComponent.find_by(user: user) + result.update(threatmetrix_review_status: 'pass') + puts "User's review state has been updated to #{result.threatmetrix_review_status}." + else + puts 'User was not found pending a review' + end + end + + desc 'Reject a user that has a pending review' + task reject: :environment do |_task, args| + user_uuid = STDIN.getpass('Enter the User UUID to reject (input will be hidden):') + user = User.find_by(uuid: user_uuid) - if user.present? - review_status = ProofingComponent.find_by(user: user) - puts('Do you want to pass or reject this user? [PASS/REJECT]:') - pass_or_reject = STDIN.gets.strip.downcase - if pass_or_reject == 'pass' - review_status.update(threatmetrix_review_status: 'pass') - puts "User's review state is updated to #{review_status.threatmetrix_review_status}" - elsif pass_or_reject == 'reject' - review_status.update(threatmetrix_review_status: 'reject') - puts "User's review state is updated to #{review_status.threatmetrix_review_status}" + if user.decorate.threatmetrix_review_pending? + result = ProofingComponent.find_by(user: user) + result.update(threatmetrix_review_status: 'reject') + puts "User's review state has been updated to #{result.threatmetrix_review_status}." else - puts "User's review status has not changed" + puts 'User was not found pending a review' end - else - puts 'No user found' end end end From 9f265eca98fb660e6b19fb3f22e2f4003cfdb1a2 Mon Sep 17 00:00:00 2001 From: Alex Bradley Date: Thu, 22 Dec 2022 16:16:48 -0500 Subject: [PATCH 3/6] add tests for review_profile rake task --- app/models/proofing_component.rb | 4 ++++ lib/tasks/review_profile.rake | 8 +++++-- spec/factories/profiles.rb | 5 +++++ spec/factories/proofing_components.rb | 10 +++++++++ spec/factories/users.rb | 9 ++++++++ spec/lib/tasks/review_profile_spec.rb | 31 +++++++++++++++++++++++++++ 6 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 spec/factories/proofing_components.rb create mode 100644 spec/lib/tasks/review_profile_spec.rb diff --git a/app/models/proofing_component.rb b/app/models/proofing_component.rb index 011ca97381a..59e45dd725b 100644 --- a/app/models/proofing_component.rb +++ b/app/models/proofing_component.rb @@ -1,3 +1,7 @@ class ProofingComponent < ApplicationRecord belongs_to :user + + def review_eligible? + verified_at.after?(30.days.ago) + end end diff --git a/lib/tasks/review_profile.rake b/lib/tasks/review_profile.rake index e3e1d32db02..5f76e390efc 100644 --- a/lib/tasks/review_profile.rake +++ b/lib/tasks/review_profile.rake @@ -7,10 +7,12 @@ namespace :users do user_uuid = STDIN.getpass('Enter the User UUID to pass (input will be hidden):') user = User.find_by(uuid: user_uuid) - if user.decorate.threatmetrix_review_pending? + if user.decorate.threatmetrix_review_pending? && user.proofing_component.review_eligible? result = ProofingComponent.find_by(user: user) result.update(threatmetrix_review_status: 'pass') puts "User's review state has been updated to #{result.threatmetrix_review_status}." + elsif !user.proofing_component.review_eligible? + puts 'User is past the 30 day review eligibility' else puts 'User was not found pending a review' end @@ -21,10 +23,12 @@ namespace :users do user_uuid = STDIN.getpass('Enter the User UUID to reject (input will be hidden):') user = User.find_by(uuid: user_uuid) - if user.decorate.threatmetrix_review_pending? + if user.decorate.threatmetrix_review_pending? && user.proofing_component.review_eligible? result = ProofingComponent.find_by(user: user) result.update(threatmetrix_review_status: 'reject') puts "User's review state has been updated to #{result.threatmetrix_review_status}." + elsif !user.proofing_component.review_eligible? + puts 'User is past the 30 day review eligibility' else puts 'User was not found pending a review' end diff --git a/spec/factories/profiles.rb b/spec/factories/profiles.rb index a8152e138e4..0a7730a6b4b 100644 --- a/spec/factories/profiles.rb +++ b/spec/factories/profiles.rb @@ -21,6 +21,11 @@ deactivation_reason { :password_reset } end + trait :threatmetrix_review_pending do + deactivation_reason { :threatmetrix_review_pending } + proofing_components { { threatmetrix_review_status: 'review' } } + end + trait :verification_cancelled do deactivation_reason { :verification_cancelled } end diff --git a/spec/factories/proofing_components.rb b/spec/factories/proofing_components.rb new file mode 100644 index 00000000000..da20ba72b2f --- /dev/null +++ b/spec/factories/proofing_components.rb @@ -0,0 +1,10 @@ +FactoryBot.define do + factory :proofing_component do + association :user, factory: %i[user signed_up] + + trait :eligible_for_review do + verified_at { Time.zone.now } + threatmetrix_review_status { 'review' } + end + end +end diff --git a/spec/factories/users.rb b/spec/factories/users.rb index ac5a86c69fb..9c0598db224 100644 --- a/spec/factories/users.rb +++ b/spec/factories/users.rb @@ -210,6 +210,15 @@ end end + trait :deactivated_threatmetrix_profile do + signed_up + + after :build do |user| + create(:profile, :threatmetrix_review_pending, :with_pii, user: user) + create(:proofing_component, :eligible_for_review, user: user) + end + end + trait :deactivated_password_reset_profile do signed_up diff --git a/spec/lib/tasks/review_profile_spec.rb b/spec/lib/tasks/review_profile_spec.rb new file mode 100644 index 00000000000..be9cec50028 --- /dev/null +++ b/spec/lib/tasks/review_profile_spec.rb @@ -0,0 +1,31 @@ +require 'rails_helper' +require 'rake' + +describe 'review_profile' do + before do + Rake.application.rake_require('lib/tasks/review_profile', [Rails.root.to_s]) + Rake::Task.define_task(:environment) + end + + describe 'users:review:pass' do + it 'sets threatmetrix_review_status to pass' do + user = create(:user, :deactivated_threatmetrix_profile) + + allow(STDIN).to receive(:getpass) { user.uuid } + + Rake::Task['users:review:pass'].invoke + expect(user.reload.proofing_component.threatmetrix_review_status).to eq('pass') + end + end + + describe 'users:review:reject' do + it 'sets threatmetrix_review_status to reject' do + user = create(:user, :deactivated_threatmetrix_profile) + + allow(STDIN).to receive(:getpass) { user.uuid } + + Rake::Task['users:review:reject'].invoke + expect(user.reload.proofing_component.threatmetrix_review_status).to eq('reject') + end + end +end From c09150aad7bd09f6de35c18aa0456b93a1bae75b Mon Sep 17 00:00:00 2001 From: Alex Bradley Date: Thu, 22 Dec 2022 16:18:29 -0500 Subject: [PATCH 4/6] add changelog changelog: Internal, IdV, Make script to pass or reject TMX review From 00d847670d664b9662dc42f7c1fa1124ea38a66e Mon Sep 17 00:00:00 2001 From: Alex Bradley Date: Fri, 23 Dec 2022 14:05:27 -0500 Subject: [PATCH 5/6] activate profile upon passing review also changed the deactivation reason upon rejection to :threatmetrix_review_rejected --- app/models/profile.rb | 1 + lib/tasks/review_profile.rake | 5 +++++ spec/lib/tasks/review_profile_spec.rb | 2 ++ 3 files changed, 8 insertions(+) diff --git a/app/models/profile.rb b/app/models/profile.rb index 7af8707d628..8ae293b453d 100644 --- a/app/models/profile.rb +++ b/app/models/profile.rb @@ -24,6 +24,7 @@ class Profile < ApplicationRecord verification_cancelled: 4, in_person_verification_pending: 5, threatmetrix_review_pending: 6, + threatmetrix_review_rejected: 7, } attr_reader :personal_key diff --git a/lib/tasks/review_profile.rake b/lib/tasks/review_profile.rake index 5f76e390efc..1c3dba87725 100644 --- a/lib/tasks/review_profile.rake +++ b/lib/tasks/review_profile.rake @@ -10,6 +10,7 @@ namespace :users do if user.decorate.threatmetrix_review_pending? && user.proofing_component.review_eligible? result = ProofingComponent.find_by(user: user) result.update(threatmetrix_review_status: 'pass') + user.profiles.first.activate puts "User's review state has been updated to #{result.threatmetrix_review_status}." elsif !user.proofing_component.review_eligible? puts 'User is past the 30 day review eligibility' @@ -26,6 +27,10 @@ namespace :users do if user.decorate.threatmetrix_review_pending? && user.proofing_component.review_eligible? result = ProofingComponent.find_by(user: user) result.update(threatmetrix_review_status: 'reject') + user.profiles. + where(deactivation_reason: 'threatmetrix_review_pending'). + first. + deactivate(:threatmetrix_review_rejected) puts "User's review state has been updated to #{result.threatmetrix_review_status}." elsif !user.proofing_component.review_eligible? puts 'User is past the 30 day review eligibility' diff --git a/spec/lib/tasks/review_profile_spec.rb b/spec/lib/tasks/review_profile_spec.rb index be9cec50028..9af26481232 100644 --- a/spec/lib/tasks/review_profile_spec.rb +++ b/spec/lib/tasks/review_profile_spec.rb @@ -15,6 +15,7 @@ Rake::Task['users:review:pass'].invoke expect(user.reload.proofing_component.threatmetrix_review_status).to eq('pass') + expect(user.reload.profiles.first.active).to eq(true) end end @@ -26,6 +27,7 @@ Rake::Task['users:review:reject'].invoke expect(user.reload.proofing_component.threatmetrix_review_status).to eq('reject') + expect(user.reload.profiles.first.deactivation_reason).to eq('threatmetrix_review_rejected') end end end From fe6f77394b419dcd9fe1dde0e50b9d2bd12ac166 Mon Sep 17 00:00:00 2001 From: Alex Bradley Date: Fri, 23 Dec 2022 15:47:46 -0500 Subject: [PATCH 6/6] check for deactivation reason in passing --- lib/tasks/review_profile.rake | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/tasks/review_profile.rake b/lib/tasks/review_profile.rake index 1c3dba87725..a296aab4d64 100644 --- a/lib/tasks/review_profile.rake +++ b/lib/tasks/review_profile.rake @@ -10,7 +10,10 @@ namespace :users do if user.decorate.threatmetrix_review_pending? && user.proofing_component.review_eligible? result = ProofingComponent.find_by(user: user) result.update(threatmetrix_review_status: 'pass') - user.profiles.first.activate + user.profiles. + where(deactivation_reason: 'threatmetrix_review_pending'). + first. + activate puts "User's review state has been updated to #{result.threatmetrix_review_status}." elsif !user.proofing_component.review_eligible? puts 'User is past the 30 day review eligibility'