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 CustomerFinancials::REDIS.expect(
22 :get,
23 EMPromise.resolve("1"),
24 ["jmp_pay_decline-test"]
25 )
26 CustomerFinancials::REDIS.expect(
27 :incr,
28 EMPromise.resolve(nil),
29 ["jmp_pay_decline-test"]
30 )
31 CustomerFinancials::REDIS.expect(
32 :expire,
33 EMPromise.resolve(nil),
34 ["jmp_pay_decline-test", 60 * 60 * 24]
35 )
36 braintree_transaction = Minitest::Mock.new
37 Transaction::BRAINTREE.expect(:transaction, braintree_transaction)
38 braintree_transaction.expect(
39 :sale,
40 EMPromise.resolve(
41 OpenStruct.new(success?: false, message: "declined")
42 ),
43 [Hash]
44 )
45 assert_raises("declined") do
46 Transaction.sale(
47 customer(plan_name: "test_usd"),
48 amount: 123,
49 payment_method: OpenStruct.new(token: "token")
50 ).sync
51 end
52 assert_mock CustomerFinancials::REDIS
53 end
54 em :test_sale_fails
55
56 def test_sale
57 CustomerFinancials::REDIS.expect(
58 :get,
59 EMPromise.resolve("1"),
60 ["jmp_pay_decline-test"]
61 )
62 braintree_transaction = Minitest::Mock.new
63 Transaction::BRAINTREE.expect(:transaction, braintree_transaction)
64 braintree_transaction.expect(
65 :sale,
66 EMPromise.resolve(
67 OpenStruct.new(
68 success?: true,
69 transaction: FAKE_BRAINTREE_TRANSACTION
70 )
71 ),
72 [{
73 amount: 123,
74 payment_method_token: "token",
75 merchant_account_id: "merchant_usd",
76 options: { submit_for_settlement: true }
77 }]
78 )
79 result = Transaction.sale(
80 customer(plan_name: "test_usd"),
81 amount: 123,
82 payment_method: OpenStruct.new(token: "token")
83 ).sync
84 assert_kind_of Transaction, result
85 assert_mock CustomerFinancials::REDIS
86 end
87 em :test_sale
88
89 def test_insert
90 Transaction::DB.expect(:transaction, []) do |&block|
91 block.call
92 true
93 end
94 Transaction::DB.expect(
95 :exec,
96 EMPromise.resolve(nil),
97 [
98 String,
99 ["customer", "transaction", Time.at(0), 12]
100 ]
101 )
102 Transaction.new(FAKE_BRAINTREE_TRANSACTION).insert.sync
103 Transaction::DB.verify
104 end
105 em :test_insert
106
107 def test_insert_with_bonus
108 Transaction::DB.expect(:transaction, []) do |&block|
109 block.call
110 true
111 end
112 Transaction::DB.expect(
113 :exec,
114 EMPromise.resolve(nil),
115 [
116 String,
117 ["customer", "transaction", Time.at(0), 100]
118 ]
119 )
120 Transaction::DB.expect(
121 :exec,
122 EMPromise.resolve(nil),
123 [
124 String,
125 ["customer", "bonus_for_transaction", Time.at(0), 3]
126 ]
127 )
128 tx = FAKE_BRAINTREE_TRANSACTION.dup
129 tx.amount = 100
130 Transaction.new(tx).insert.sync
131 Transaction::DB.verify
132 end
133 em :test_insert_with_bonus
134end