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		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(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(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(:transaction, []) do |&block|
 89			block.call
 90			true
 91		end
 92		Transaction::DB.expect(
 93			:exec,
 94			EMPromise.resolve(nil),
 95			[
 96				String,
 97				["customer", "transaction", Time.at(0), 12]
 98			]
 99		)
100		Transaction.new(FAKE_BRAINTREE_TRANSACTION).insert.sync
101		Transaction::DB.verify
102	end
103	em :test_insert
104
105	def test_insert_with_bonus
106		Transaction::DB.expect(:transaction, []) do |&block|
107			block.call
108			true
109		end
110		Transaction::DB.expect(
111			:exec,
112			EMPromise.resolve(nil),
113			[
114				String,
115				["customer", "transaction", Time.at(0), 100]
116			]
117		)
118		Transaction::DB.expect(
119			:exec,
120			EMPromise.resolve(nil),
121			[
122				String,
123				["customer", "bonus_for_transaction", Time.at(0), 3]
124			]
125		)
126		tx = FAKE_BRAINTREE_TRANSACTION.dup
127		tx.amount = 100
128		Transaction.new(tx).insert.sync
129		Transaction::DB.verify
130	end
131	em :test_insert_with_bonus
132end