1# frozen_string_literal: true
2
3require "test_helper"
4require "transaction"
5
6Transaction::DB = Minitest::Mock.new
7Transaction::BRAINTREE = Minitest::Mock.new
8Transaction::REDIS = Minitest::Mock.new
9
10class TransactionTest < Minitest::Test
11 FAKE_BRAINTREE_TRANSACTION =
12 OpenStruct.new(
13 customer_details: OpenStruct.new(id: "customer"),
14 id: "transaction",
15 created_at: Time.at(0),
16 amount: 123
17 )
18
19 def test_sale_fails
20 Transaction::REDIS.expect(
21 :get,
22 EMPromise.resolve("1"),
23 ["jmp_pay_decline-test"]
24 )
25 Transaction::REDIS.expect(
26 :incr,
27 EMPromise.resolve(nil),
28 ["jmp_pay_decline-test"]
29 )
30 Transaction::REDIS.expect(
31 :expire,
32 EMPromise.resolve(nil),
33 ["jmp_pay_decline-test", 60 * 60 * 24]
34 )
35 braintree_transaction = Minitest::Mock.new
36 Transaction::BRAINTREE.expect(:transaction, braintree_transaction)
37 braintree_transaction.expect(
38 :sale,
39 EMPromise.resolve(
40 OpenStruct.new(success?: false, message: "declined")
41 ),
42 [Hash]
43 )
44 assert_raises("declined") do
45 Transaction.sale(
46 Customer.new("test", plan_name: "test_usd"),
47 amount: 123,
48 payment_method: OpenStruct.new(token: "token")
49 ).sync
50 end
51 end
52 em :test_sale_fails
53
54 def test_sale
55 Transaction::REDIS.expect(
56 :get,
57 EMPromise.resolve("1"),
58 ["jmp_pay_decline-test"]
59 )
60 braintree_transaction = Minitest::Mock.new
61 Transaction::BRAINTREE.expect(:transaction, braintree_transaction)
62 braintree_transaction.expect(
63 :sale,
64 EMPromise.resolve(
65 OpenStruct.new(
66 success?: true,
67 transaction: FAKE_BRAINTREE_TRANSACTION
68 )
69 ),
70 [{
71 amount: 123,
72 payment_method_token: "token",
73 merchant_account_id: "merchant_usd",
74 options: { submit_for_settlement: true }
75 }]
76 )
77 result = Transaction.sale(
78 Customer.new("test", plan_name: "test_usd"),
79 amount: 123,
80 payment_method: OpenStruct.new(token: "token")
81 ).sync
82 assert_kind_of Transaction, result
83 end
84 em :test_sale
85
86 def test_insert
87 Transaction::DB.expect(
88 :exec_defer,
89 EMPromise.resolve(nil),
90 [
91 String,
92 ["customer", "transaction", Time.at(0), 123]
93 ]
94 )
95 Transaction.new(FAKE_BRAINTREE_TRANSACTION).insert.sync
96 end
97 em :test_insert
98end