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