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