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
 8CustomerFinancials::REDIS = Minitest::Mock.new
 9
10class LowBalanceTest < Minitest::Test
11	def test_for_locked
12		ExpiringLock::REDIS.expect(
13			:set,
14			EMPromise.resolve(nil),
15			["jmp_customer_low_balance-test", Time, "EX", 604800, "NX"]
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			:set,
24			EMPromise.resolve("OK"),
25			["jmp_customer_low_balance-test", Time, "EX", 604800, "NX"]
26		)
27		CustomerFinancials::REDIS.expect(
28			:smembers,
29			EMPromise.resolve([]),
30			["jmp_customer_btc_addresses-test"]
31		)
32		assert_kind_of(
33			LowBalance,
34			LowBalance.for(customer).sync
35		)
36		assert_mock ExpiringLock::REDIS
37	end
38	em :test_for_no_auto_top_up
39
40	def test_for_auto_top_up
41		ExpiringLock::REDIS.expect(
42			:set,
43			EMPromise.resolve("OK"),
44			["jmp_customer_low_balance-test", Time, "EX", 604800, "NX"]
45		)
46		assert_kind_of(
47			LowBalance::AutoTopUp,
48			LowBalance.for(customer(auto_top_up_amount: 15)).sync
49		)
50		assert_mock ExpiringLock::REDIS
51	end
52	em :test_for_auto_top_up
53
54	class AutoTopUpTest < Minitest::Test
55		LowBalance::AutoTopUp::Transaction = Minitest::Mock.new
56
57		def setup
58			@customer = Minitest::Mock.new(customer(auto_top_up_amount: 100))
59			@auto_top_up = LowBalance::AutoTopUp.new(@customer)
60		end
61
62		def test_notify!
63			tx = PromiseMock.new
64			tx.expect(:insert, EMPromise.resolve(nil))
65			LowBalance::AutoTopUp::Transaction.expect(
66				:sale,
67				tx,
68				[@customer, { amount: 100 }]
69			)
70			@auto_top_up.notify!
71			assert_mock tx
72		end
73		em :test_notify!
74
75		def test_decline_notify!
76			@customer.expect(
77				:stanza_to,
78				nil,
79				[Matching.new { |m|
80					assert_equal(
81						"Automatic top-up transaction for $100 failed: test",
82						m.body
83					)
84				}]
85			)
86			LowBalance::AutoTopUp::Transaction.expect(
87				:sale,
88				EMPromise.reject(RuntimeError.new("test")),
89				[@customer, { amount: 100 }]
90			)
91			@auto_top_up.notify!.sync
92			assert_mock @customer
93		end
94		em :test_decline_notify!
95	end
96end