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: 123
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.new("test", 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.new("test", 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(
89 :exec_defer,
90 EMPromise.resolve(nil),
91 [
92 String,
93 ["customer", "transaction", Time.at(0), 123]
94 ]
95 )
96 Transaction.new(FAKE_BRAINTREE_TRANSACTION).insert.sync
97 end
98 em :test_insert
99end