test_transaction.rb

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