1# frozen_string_literal: true
2
3require "test_helper"
4require "customer"
5require "transaction"
6
7Transaction::DB = Minitest::Mock.new
8Transaction::BRAINTREE = Minitest::Mock.new
9Transaction::REDIS = Minitest::Mock.new
10ExpiringLock::REDIS = Minitest::Mock.new
11
12class TransactionTest < Minitest::Test
13 FAKE_BRAINTREE_TRANSACTION =
14 OpenStruct.new(
15 customer_details: OpenStruct.new(id: "customer"),
16 id: "transaction",
17 created_at: Time.at(0),
18 amount: 12
19 )
20
21 def test_sale_fails
22 ExpiringLock::REDIS.expect(
23 :set,
24 EMPromise.resolve("OK"),
25 ["jmp_customer_credit_card_lock-test", Time, "EX", 86400, "NX"]
26 )
27 CustomerFinancials::REDIS.expect(
28 :get,
29 EMPromise.resolve("1"),
30 ["jmp_pay_decline-test"]
31 )
32 CustomerFinancials::REDIS.expect(
33 :incr,
34 EMPromise.resolve(nil),
35 ["jmp_pay_decline-test"]
36 )
37 CustomerFinancials::REDIS.expect(
38 :expire,
39 EMPromise.resolve(nil),
40 ["jmp_pay_decline-test", 60 * 60 * 24]
41 )
42 braintree_transaction = Minitest::Mock.new
43 Transaction::BRAINTREE.expect(:transaction, braintree_transaction)
44 braintree_transaction.expect(
45 :sale,
46 EMPromise.resolve(
47 OpenStruct.new(success?: false, message: "declined")
48 ),
49 [Hash]
50 )
51 assert_raises("declined") do
52 Transaction.sale(
53 customer(plan_name: "test_usd"),
54 amount: 123,
55 payment_method: OpenStruct.new(token: "token")
56 ).sync
57 end
58 assert_mock CustomerFinancials::REDIS
59 assert_mock ExpiringLock::REDIS
60 end
61 em :test_sale_fails
62
63 def test_sale
64 ExpiringLock::REDIS.expect(
65 :set,
66 EMPromise.resolve("OK"),
67 ["jmp_customer_credit_card_lock-test", Time, "EX", 86400, "NX"]
68 )
69 CustomerFinancials::REDIS.expect(
70 :get,
71 EMPromise.resolve("1"),
72 ["jmp_pay_decline-test"]
73 )
74 braintree_transaction = Minitest::Mock.new
75 Transaction::BRAINTREE.expect(:transaction, braintree_transaction)
76 braintree_transaction.expect(
77 :sale,
78 EMPromise.resolve(
79 OpenStruct.new(
80 success?: true,
81 transaction: FAKE_BRAINTREE_TRANSACTION
82 )
83 ),
84 [{
85 amount: 123,
86 payment_method_token: "token",
87 merchant_account_id: "merchant_usd",
88 options: { submit_for_settlement: true }
89 }]
90 )
91 result = Transaction.sale(
92 customer(plan_name: "test_usd"),
93 amount: 123,
94 payment_method: OpenStruct.new(token: "token")
95 ).sync
96 assert_kind_of Transaction, result
97 assert_mock CustomerFinancials::REDIS
98 assert_mock ExpiringLock::REDIS
99 end
100 em :test_sale
101
102 def test_insert
103 Transaction::DB.expect(:transaction, []) do |&block|
104 block.call
105 true
106 end
107 Transaction::DB.expect(
108 :exec,
109 EMPromise.resolve(nil),
110 [
111 String,
112 ["customer", "transaction", Time.at(0), Time.at(7776000), 12]
113 ]
114 )
115 Transaction.new(FAKE_BRAINTREE_TRANSACTION).insert.sync
116 Transaction::DB.verify
117 end
118 em :test_insert
119
120 def test_insert_with_bonus
121 Transaction::DB.expect(:transaction, []) do |&block|
122 block.call
123 true
124 end
125 Transaction::DB.expect(
126 :exec,
127 EMPromise.resolve(nil),
128 [
129 String,
130 ["customer", "transaction", Time.at(0), Time.at(7776000), 100]
131 ]
132 )
133 Transaction::DB.expect(
134 :exec,
135 EMPromise.resolve(nil),
136 [
137 String,
138 ["customer", "bonus_for_transaction", Time.at(0), Time.at(7776000), 3]
139 ]
140 )
141 tx = FAKE_BRAINTREE_TRANSACTION.dup
142 tx.amount = 100
143 Transaction.new(tx).insert.sync
144 Transaction::DB.verify
145 end
146 em :test_insert_with_bonus
147end