test_low_balance.rb

  1# frozen_string_literal: true
  2
  3require "test_helper"
  4require "low_balance"
  5
  6ExpiringLock::REDIS = Minitest::Mock.new
  7CustomerPlan::REDIS = Minitest::Mock.new
  8Customer::REDIS = Minitest::Mock.new
  9
 10class LowBalanceTest < Minitest::Test
 11	def test_for_locked
 12		ExpiringLock::REDIS.expect(
 13			:exists,
 14			EMPromise.resolve(1),
 15			["jmp_customer_low_balance-test"]
 16		)
 17		assert_kind_of LowBalance::Locked, LowBalance.for(customer).sync
 18	end
 19	em :test_for_locked
 20
 21	def test_for_no_auto_top_up
 22		ExpiringLock::REDIS.expect(
 23			:exists,
 24			EMPromise.resolve(0),
 25			["jmp_customer_low_balance-test"]
 26		)
 27		Customer::REDIS.expect(
 28			:smembers,
 29			EMPromise.resolve([]),
 30			["jmp_customer_btc_addresses-test"]
 31		)
 32		ExpiringLock::REDIS.expect(
 33			:setex,
 34			EMPromise.resolve(nil),
 35			["jmp_customer_low_balance-test", 60 * 60 * 24 * 7, Time]
 36		)
 37		assert_kind_of(
 38			LowBalance,
 39			LowBalance.for(customer).sync
 40		)
 41		assert_mock ExpiringLock::REDIS
 42	end
 43	em :test_for_no_auto_top_up
 44
 45	def test_for_auto_top_up
 46		ExpiringLock::REDIS.expect(
 47			:exists,
 48			EMPromise.resolve(0),
 49			["jmp_customer_low_balance-test"]
 50		)
 51		ExpiringLock::REDIS.expect(
 52			:setex,
 53			EMPromise.resolve(nil),
 54			["jmp_customer_low_balance-test", 60 * 60 * 24 * 7, Time]
 55		)
 56		assert_kind_of(
 57			LowBalance::AutoTopUp,
 58			LowBalance.for(customer(auto_top_up_amount: 15)).sync
 59		)
 60		assert_mock ExpiringLock::REDIS
 61	end
 62	em :test_for_auto_top_up
 63
 64	class AutoTopUpTest < Minitest::Test
 65		LowBalance::AutoTopUp::Transaction = Minitest::Mock.new
 66
 67		def setup
 68			@customer = Minitest::Mock.new(customer(auto_top_up_amount: 100))
 69			@auto_top_up = LowBalance::AutoTopUp.new(@customer)
 70		end
 71
 72		def test_notify!
 73			tx = PromiseMock.new
 74			tx.expect(:insert, EMPromise.resolve(nil))
 75			LowBalance::AutoTopUp::Transaction.expect(
 76				:sale,
 77				tx,
 78				[@customer, { amount: 100 }]
 79			)
 80			@auto_top_up.notify!
 81			assert_mock tx
 82		end
 83		em :test_notify!
 84
 85		def test_decline_notify!
 86			@customer.expect(
 87				:stanza_to,
 88				nil,
 89				[Matching.new { |m|
 90					assert_equal(
 91						"Automatic top-up transaction for $100 failed: test",
 92						m.body
 93					)
 94				}]
 95			)
 96			LowBalance::AutoTopUp::Transaction.expect(
 97				:sale,
 98				EMPromise.reject(RuntimeError.new("test")),
 99				[@customer, { amount: 100 }]
100			)
101			@auto_top_up.notify!.sync
102			assert_mock @customer
103		end
104		em :test_decline_notify!
105	end
106end