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 :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 CustomerFinancials::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