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