check_unsettled_transaction_test.go raw
1 package transactions
2
3 import (
4 "context"
5 "testing"
6 "time"
7
8 "github.com/stretchr/testify/assert"
9 "github.com/stretchr/testify/require"
10
11 "github.com/getAlby/hub/constants"
12 "github.com/getAlby/hub/db"
13 "github.com/getAlby/hub/lnclient"
14 "github.com/getAlby/hub/tests"
15 )
16
17 func TestCheckUnsettledTransaction(t *testing.T) {
18 svc, err := tests.CreateTestService(t)
19 require.NoError(t, err)
20 defer svc.Remove()
21
22 dbTransaction := db.Transaction{
23 State: constants.TRANSACTION_STATE_PENDING,
24 Type: constants.TRANSACTION_TYPE_OUTGOING,
25 PaymentHash: tests.MockLNClientTransaction.PaymentHash,
26 AmountMsat: 123000,
27 }
28 svc.DB.Create(&dbTransaction)
29
30 mockEventConsumer := tests.NewMockEventConsumer()
31 svc.EventPublisher.RegisterSubscriber(mockEventConsumer)
32 transactionsService := NewTransactionsService(svc.DB, svc.EventPublisher)
33 settledAt := time.Now().Unix()
34 svc.LNClient.(*tests.MockLn).MockTransaction = &lnclient.Transaction{
35 SettledAt: &settledAt,
36 Preimage: "dummy",
37 }
38
39 // do not allow checking unsettled transactions if notifications are supported
40 transactionsService.checkUnsettledTransaction(context.TODO(), &dbTransaction, svc.LNClient)
41 assert.Equal(t, constants.TRANSACTION_STATE_PENDING, dbTransaction.State)
42
43 svc.LNClient.(*tests.MockLn).SupportedNotificationTypes = &[]string{}
44 transactionsService.checkUnsettledTransaction(context.TODO(), &dbTransaction, svc.LNClient)
45
46 assert.NoError(t, err)
47 assert.Equal(t, constants.TRANSACTION_STATE_SETTLED, dbTransaction.State)
48 consumedEvents := mockEventConsumer.WaitForConsumedEvents(1)
49 assert.Equal(t, 1, len(consumedEvents))
50 assert.Equal(t, "nwc_payment_sent", consumedEvents[0].Event)
51 settledTransaction := consumedEvents[0].Properties.(*db.Transaction)
52 assert.Equal(t, &dbTransaction, settledTransaction)
53 }
54
55 func TestCheckUnsettledTransactions(t *testing.T) {
56 svc, err := tests.CreateTestService(t)
57 require.NoError(t, err)
58 defer svc.Remove()
59
60 dbTransaction := db.Transaction{
61 State: constants.TRANSACTION_STATE_PENDING,
62 Type: constants.TRANSACTION_TYPE_OUTGOING,
63 PaymentHash: tests.MockLNClientTransaction.PaymentHash,
64 AmountMsat: 123000,
65 CreatedAt: time.Now(),
66 }
67 svc.DB.Create(&dbTransaction)
68
69 mockEventConsumer := tests.NewMockEventConsumer()
70 svc.EventPublisher.RegisterSubscriber(mockEventConsumer)
71 transactionsService := NewTransactionsService(svc.DB, svc.EventPublisher)
72 settledAt := time.Now().Unix()
73
74 svc.LNClient.(*tests.MockLn).MockTransaction = &lnclient.Transaction{
75 SettledAt: &settledAt,
76 Preimage: "dummy",
77 }
78
79 // do not allow checking unsettled transactions if notifications are supported
80 transactionsService.checkUnsettledTransactions(context.TODO(), svc.LNClient)
81
82 svc.DB.Find(&dbTransaction, db.Transaction{
83 ID: dbTransaction.ID,
84 })
85 assert.Equal(t, constants.TRANSACTION_STATE_PENDING, dbTransaction.State)
86
87 svc.LNClient.(*tests.MockLn).SupportedNotificationTypes = &[]string{}
88 transactionsService.checkUnsettledTransactions(context.TODO(), svc.LNClient)
89
90 svc.DB.Find(&dbTransaction, db.Transaction{
91 ID: dbTransaction.ID,
92 })
93 assert.NoError(t, err)
94 assert.Equal(t, constants.TRANSACTION_STATE_SETTLED, dbTransaction.State)
95 consumedEvents := mockEventConsumer.WaitForConsumedEvents(1)
96 assert.Equal(t, 1, len(consumedEvents))
97 assert.Equal(t, "nwc_payment_sent", consumedEvents[0].Event)
98 settledTransaction := consumedEvents[0].Properties.(*db.Transaction)
99 assert.Equal(t, dbTransaction.ID, settledTransaction.ID)
100 }
101