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