Skip to content

Commit e633805

Browse files
committed
Refactor Payment.risky
Use AR and existing scopes to build the query instead of SQL. Add a spec ensuring failed payments are considered risky.
1 parent ad17b62 commit e633805

File tree

2 files changed

+9
-4
lines changed

2 files changed

+9
-4
lines changed

core/app/models/spree/payment.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class Payment < Spree::Base
5454
scope :processing, -> { with_state('processing') }
5555
scope :failed, -> { with_state('failed') }
5656

57-
scope :risky, -> { where("avs_response IN (?) OR (cvv_response_code IS NOT NULL and cvv_response_code != 'M') OR state = 'failed'", RISKY_AVS_CODES) }
57+
scope :risky, -> { failed.or(where(avs_response: RISKY_AVS_CODES)).or(where.not(cvv_response_code: [nil, '', 'M'])) }
5858
scope :valid, -> { where.not(state: %w(failed invalid void)) }
5959

6060
scope :store_credits, -> { where(source_type: Spree::StoreCredit.to_s) }

core/spec/models/spree/payment_spec.rb

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,19 @@
4646
)
4747
end
4848

49-
context '.risky' do
49+
context 'risk analysis' do
5050
let!(:payment_1) { create(:payment, avs_response: 'Y', cvv_response_code: 'M', cvv_response_message: 'Match') }
5151
let!(:payment_2) { create(:payment, avs_response: 'Y', cvv_response_code: 'M', cvv_response_message: '') }
5252
let!(:payment_3) { create(:payment, avs_response: 'A', cvv_response_code: 'M', cvv_response_message: 'Match') }
5353
let!(:payment_4) { create(:payment, avs_response: 'Y', cvv_response_code: 'N', cvv_response_message: 'No Match') }
54+
let!(:payment_5) { create(:payment, avs_response: 'Y', cvv_response_code: 'M', cvv_response_message: '', state: 'failed') }
55+
56+
describe '.risky' do
57+
it 'fetches only risky payments' do
58+
expect(subject.class.risky.to_a).to match_array([payment_3, payment_4, payment_5])
59+
end
60+
end
5461

55-
it 'should not return successful responses' do
56-
expect(subject.class.risky.to_a).to match_array([payment_3, payment_4])
5762
end
5863
end
5964

0 commit comments

Comments
 (0)