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: 12
 18		)
 19
 20	def test_sale_fails
 21		CustomerFinancials::REDIS.expect(
 22			:get,
 23			EMPromise.resolve("1"),
 24			["jmp_pay_decline-test"]
 25		)
 26		CustomerFinancials::REDIS.expect(
 27			:incr,
 28			EMPromise.resolve(nil),
 29			["jmp_pay_decline-test"]
 30		)
 31		CustomerFinancials::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(plan_name: "test_usd"),
 48				amount: 123,
 49				payment_method: OpenStruct.new(token: "token")
 50			).sync
 51		end
 52		assert_mock CustomerFinancials::REDIS
 53	end
 54	em :test_sale_fails
 55
 56	def test_sale
 57		CustomerFinancials::REDIS.expect(
 58			:get,
 59			EMPromise.resolve("1"),
 60			["jmp_pay_decline-test"]
 61		)
 62		braintree_transaction = Minitest::Mock.new
 63		Transaction::BRAINTREE.expect(:transaction, braintree_transaction)
 64		braintree_transaction.expect(
 65			:sale,
 66			EMPromise.resolve(
 67				OpenStruct.new(
 68					success?: true,
 69					transaction: FAKE_BRAINTREE_TRANSACTION
 70				)
 71			),
 72			[{
 73				amount: 123,
 74				payment_method_token: "token",
 75				merchant_account_id: "merchant_usd",
 76				options: { submit_for_settlement: true }
 77			}]
 78		)
 79		result = Transaction.sale(
 80			customer(plan_name: "test_usd"),
 81			amount: 123,
 82			payment_method: OpenStruct.new(token: "token")
 83		).sync
 84		assert_kind_of Transaction, result
 85		assert_mock CustomerFinancials::REDIS
 86	end
 87	em :test_sale
 88
 89	def test_insert
 90		Transaction::DB.expect(:transaction, []) do |&block|
 91			block.call
 92			true
 93		end
 94		Transaction::DB.expect(
 95			:exec,
 96			EMPromise.resolve(nil),
 97			[
 98				String,
 99				["customer", "transaction", Time.at(0), 12]
100			]
101		)
102		Transaction.new(FAKE_BRAINTREE_TRANSACTION).insert.sync
103		Transaction::DB.verify
104	end
105	em :test_insert
106
107	def test_insert_with_bonus
108		Transaction::DB.expect(:transaction, []) do |&block|
109			block.call
110			true
111		end
112		Transaction::DB.expect(
113			:exec,
114			EMPromise.resolve(nil),
115			[
116				String,
117				["customer", "transaction", Time.at(0), 100]
118			]
119		)
120		Transaction::DB.expect(
121			:exec,
122			EMPromise.resolve(nil),
123			[
124				String,
125				["customer", "bonus_for_transaction", Time.at(0), 3]
126			]
127		)
128		tx = FAKE_BRAINTREE_TRANSACTION.dup
129		tx.amount = 100
130		Transaction.new(tx).insert.sync
131		Transaction::DB.verify
132	end
133	em :test_insert_with_bonus
134end