# frozen_string_literal: true require "test_helper" require "customer" require "transaction" Transaction::DB = Minitest::Mock.new Transaction::BRAINTREE = Minitest::Mock.new Transaction::REDIS = Minitest::Mock.new class TransactionTest < Minitest::Test FAKE_BRAINTREE_TRANSACTION = OpenStruct.new( customer_details: OpenStruct.new(id: "customer"), id: "transaction", created_at: Time.at(0), amount: 12 ) def test_sale_fails Transaction::REDIS.expect( :get, EMPromise.resolve("1"), ["jmp_pay_decline-test"] ) Transaction::REDIS.expect( :incr, EMPromise.resolve(nil), ["jmp_pay_decline-test"] ) Transaction::REDIS.expect( :expire, EMPromise.resolve(nil), ["jmp_pay_decline-test", 60 * 60 * 24] ) braintree_transaction = Minitest::Mock.new Transaction::BRAINTREE.expect(:transaction, braintree_transaction) braintree_transaction.expect( :sale, EMPromise.resolve( OpenStruct.new(success?: false, message: "declined") ), [Hash] ) assert_raises("declined") do Transaction.sale( Customer.new("test", plan_name: "test_usd"), amount: 123, payment_method: OpenStruct.new(token: "token") ).sync end end em :test_sale_fails def test_sale Transaction::REDIS.expect( :get, EMPromise.resolve("1"), ["jmp_pay_decline-test"] ) braintree_transaction = Minitest::Mock.new Transaction::BRAINTREE.expect(:transaction, braintree_transaction) braintree_transaction.expect( :sale, EMPromise.resolve( OpenStruct.new( success?: true, transaction: FAKE_BRAINTREE_TRANSACTION ) ), [{ amount: 123, payment_method_token: "token", merchant_account_id: "merchant_usd", options: { submit_for_settlement: true } }] ) result = Transaction.sale( Customer.new("test", plan_name: "test_usd"), amount: 123, payment_method: OpenStruct.new(token: "token") ).sync assert_kind_of Transaction, result end em :test_sale def test_insert Transaction::DB.expect(:transaction, []) do |&block| block.call true end Transaction::DB.expect( :exec, EMPromise.resolve(nil), [ String, ["customer", "transaction", Time.at(0), 12] ] ) Transaction.new(FAKE_BRAINTREE_TRANSACTION).insert.sync Transaction::DB.verify end em :test_insert def test_insert_with_bonus Transaction::DB.expect(:transaction, []) do |&block| block.call true end Transaction::DB.expect( :exec, EMPromise.resolve(nil), [ String, ["customer", "transaction", Time.at(0), 100] ] ) Transaction::DB.expect( :exec, EMPromise.resolve(nil), [ String, ["customer", "bonus_for_transaction", Time.at(0), 3] ] ) tx = FAKE_BRAINTREE_TRANSACTION.dup tx.amount = 100 Transaction.new(tx).insert.sync Transaction::DB.verify end em :test_insert_with_bonus end