test_transaction.rb

 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