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