diff --git a/lib/action_account.rb b/lib/action_account.rb index 48e97155da6..3a9afbbf34a 100644 --- a/lib/action_account.rb +++ b/lib/action_account.rb @@ -1,5 +1,6 @@ require_relative './script_base' +# rubocop:disable Metrics/BlockLength class ActionAccount attr_reader :argv, :stdout, :stderr @@ -149,13 +150,18 @@ def run(args:, config:) messages = [] users.each do |user| + profile_fraud_review_pending_at = nil + success = false + log_texts = [] if !user.fraud_review_pending? log_texts << log_text[:no_pending] elsif FraudReviewChecker.new(user).fraud_review_eligible? profile = user.fraud_review_pending_profile + profile_fraud_review_pending_at = profile.fraud_review_pending_at profile.reject_for_fraud(notify_user: true) + success = true log_texts << log_text[:rejected_for_fraud] else @@ -170,6 +176,19 @@ def run(args:, config:) messages:, ) end + ensure + if !success + analytics_error_hash = { message: log_texts.last } + end + + Analytics.new( + user: user, request: nil, session: {}, sp: nil, + ).fraud_review_rejected( + success:, + errors: analytics_error_hash, + exception: nil, + profile_fraud_review_pending_at: profile_fraud_review_pending_at, + ) end if config.include_missing? @@ -181,6 +200,14 @@ def run(args:, config:) messages:, ) end + Analytics.new( + user: AnonymousUser.new, request: nil, session: {}, sp: nil, + ).fraud_review_rejected( + success: false, + errors: { message: log_text[:missing_uuid] }, + exception: nil, + profile_fraud_review_pending_at: nil, + ) end ScriptBase::Result.new( @@ -213,12 +240,17 @@ def run(args:, config:) messages = [] users.each do |user| + profile_fraud_review_pending_at = nil + success = false + log_texts = [] if !user.fraud_review_pending? log_texts << log_text[:no_pending] elsif FraudReviewChecker.new(user).fraud_review_eligible? profile = user.fraud_review_pending_profile + profile_fraud_review_pending_at = profile.fraud_review_pending_at profile.activate_after_passing_review + success = true if profile.active? event, _disavowal_token = UserEventCreator.new(current_user: user). @@ -242,6 +274,19 @@ def run(args:, config:) messages:, ) end + ensure + if !success + analytics_error_hash = { message: log_texts.last } + end + + Analytics.new( + user: user, request: nil, session: {}, sp: nil, + ).fraud_review_passed( + success:, + errors: analytics_error_hash, + exception: nil, + profile_fraud_review_pending_at: profile_fraud_review_pending_at, + ) end if config.include_missing? @@ -253,6 +298,14 @@ def run(args:, config:) messages:, ) end + Analytics.new( + user: AnonymousUser.new, request: nil, session: {}, sp: nil, + ).fraud_review_passed( + success: false, + errors: { message: log_text[:missing_uuid] }, + exception: nil, + profile_fraud_review_pending_at: nil, + ) end ScriptBase::Result.new( @@ -288,3 +341,4 @@ def run(args:, config:) end end end +# rubocop:enable Metrics/BlockLength diff --git a/spec/lib/action_account_spec.rb b/spec/lib/action_account_spec.rb index f34e98f0573..e35f71204d1 100644 --- a/spec/lib/action_account_spec.rb +++ b/spec/lib/action_account_spec.rb @@ -135,12 +135,20 @@ let(:user) { create(:profile, :fraud_review_pending).user } let(:user_without_profile) { create(:user) } + let(:analytics) { FakeAnalytics.new } + + before do + allow(Analytics).to receive(:new).and_return(analytics) + end + let(:args) { [user.uuid, user_without_profile.uuid, 'uuid-does-not-exist'] } let(:include_missing) { true } let(:config) { ScriptBase::Config.new(include_missing:) } subject(:result) { subtask.run(args:, config:) } it 'Reject a user that has a pending review', aggregate_failures: true do + profile_fraud_review_pending_at = user.pending_profile.fraud_review_pending_at + expect(result.table).to match_array( [ ['uuid', 'status'], @@ -152,6 +160,28 @@ expect(result.subtask).to eq('review-reject') expect(result.uuids).to match_array([user.uuid, user_without_profile.uuid]) + + expect(analytics).to have_logged_event( + 'Fraud: Profile review rejected', + success: true, + errors: nil, + exception: nil, + profile_fraud_review_pending_at: profile_fraud_review_pending_at, + ) + expect(analytics).to have_logged_event( + 'Fraud: Profile review rejected', + success: false, + errors: { message: 'Error: User does not have a pending fraud review' }, + exception: nil, + profile_fraud_review_pending_at: nil, + ) + expect(analytics).to have_logged_event( + 'Fraud: Profile review rejected', + success: false, + errors: { message: 'Error: Could not find user with that UUID' }, + exception: nil, + profile_fraud_review_pending_at: nil, + ) end end end @@ -163,12 +193,20 @@ let(:user) { create(:profile, :fraud_review_pending).user } let(:user_without_profile) { create(:user) } + let(:analytics) { FakeAnalytics.new } + + before do + allow(Analytics).to receive(:new).and_return(analytics) + end + let(:args) { [user.uuid, user_without_profile.uuid, 'uuid-does-not-exist'] } let(:include_missing) { true } let(:config) { ScriptBase::Config.new(include_missing:) } subject(:result) { subtask.run(args:, config:) } it 'Pass a user that has a pending review', aggregate_failures: true do + profile_fraud_review_pending_at = user.pending_profile.fraud_review_pending_at + expect(result.table).to match_array( [ ['uuid', 'status'], @@ -180,6 +218,28 @@ expect(result.subtask).to eq('review-pass') expect(result.uuids).to match_array([user.uuid, user_without_profile.uuid]) + + expect(analytics).to have_logged_event( + 'Fraud: Profile review passed', + success: true, + errors: nil, + exception: nil, + profile_fraud_review_pending_at: profile_fraud_review_pending_at, + ) + expect(analytics).to have_logged_event( + 'Fraud: Profile review passed', + success: false, + errors: { message: 'Error: User does not have a pending fraud review' }, + exception: nil, + profile_fraud_review_pending_at: nil, + ) + expect(analytics).to have_logged_event( + 'Fraud: Profile review passed', + success: false, + errors: { message: 'Error: Could not find user with that UUID' }, + exception: nil, + profile_fraud_review_pending_at: nil, + ) end end end