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