test_transaction.rb

 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