make_invoice_test.go raw
1 package transactions
2
3 import (
4 "context"
5 "encoding/json"
6 "fmt"
7 "strings"
8 "testing"
9
10 "github.com/stretchr/testify/assert"
11 "github.com/stretchr/testify/require"
12
13 "github.com/getAlby/hub/constants"
14 "github.com/getAlby/hub/db"
15 "github.com/getAlby/hub/tests"
16 )
17
18 func TestMakeInvoice_NoApp(t *testing.T) {
19 ctx := context.TODO()
20
21 svc, err := tests.CreateTestService(t)
22 require.NoError(t, err)
23 defer svc.Remove()
24
25 txMetadata := make(map[string]interface{})
26 txMetadata["randomkey"] = strings.Repeat("a", constants.INVOICE_METADATA_MAX_LENGTH-16) // json encoding adds 16 characters - {"randomkey":""}
27
28 transactionsService := NewTransactionsService(svc.DB, svc.EventPublisher)
29 transaction, err := transactionsService.MakeInvoice(ctx, 1000, "Hello world", "", 0, txMetadata, svc.LNClient, nil, nil, nil)
30 assert.NoError(t, err)
31
32 var metadata map[string]interface{}
33 err = json.Unmarshal(transaction.Metadata, &metadata)
34 assert.NoError(t, err)
35
36 assert.Equal(t, uint64(tests.MockLNClientTransaction.AmountMsat), transaction.AmountMsat)
37 assert.Equal(t, constants.TRANSACTION_STATE_PENDING, transaction.State)
38 assert.Equal(t, tests.MockLNClientTransaction.Preimage, *transaction.Preimage)
39 assert.Equal(t, txMetadata["randomkey"], metadata["randomkey"])
40 }
41
42 func TestMakeInvoice_MetadataTooLarge(t *testing.T) {
43 ctx := context.TODO()
44
45 svc, err := tests.CreateTestService(t)
46 require.NoError(t, err)
47 defer svc.Remove()
48
49 metadata := make(map[string]interface{})
50 metadata["randomkey"] = strings.Repeat("a", constants.INVOICE_METADATA_MAX_LENGTH-15) // json encoding adds 16 characters
51
52 transactionsService := NewTransactionsService(svc.DB, svc.EventPublisher)
53 transaction, err := transactionsService.MakeInvoice(ctx, 1000, "Hello world", "", 0, metadata, svc.LNClient, nil, nil, nil)
54
55 assert.Error(t, err)
56 assert.Equal(t, fmt.Sprintf("encoded invoice metadata provided is too large. Limit: %d Received: %d", constants.INVOICE_METADATA_MAX_LENGTH, constants.INVOICE_METADATA_MAX_LENGTH+1), err.Error())
57 assert.Nil(t, transaction)
58 }
59
60 func TestMakeInvoice_AmountNotWholeSats(t *testing.T) {
61 ctx := context.TODO()
62
63 svc, err := tests.CreateTestService(t)
64 require.NoError(t, err)
65 defer svc.Remove()
66
67 transactionsService := NewTransactionsService(svc.DB, svc.EventPublisher)
68 transaction, err := transactionsService.MakeInvoice(ctx, 1234, "Hello world", "", 0, nil, svc.LNClient, nil, nil, nil)
69
70 require.Error(t, err)
71 assert.Equal(t, "the amount must be a whole number of satoshis", err.Error())
72 assert.Nil(t, transaction)
73 }
74
75 func TestMakeInvoice_AmountTooLow(t *testing.T) {
76 ctx := context.TODO()
77
78 svc, err := tests.CreateTestService(t)
79 require.NoError(t, err)
80 defer svc.Remove()
81
82 transactionsService := NewTransactionsService(svc.DB, svc.EventPublisher)
83 transaction, err := transactionsService.MakeInvoice(ctx, 0, "Hello world", "", 0, nil, svc.LNClient, nil, nil, nil)
84
85 require.Error(t, err)
86 assert.Equal(t, "the amount must be at least 1 satoshi", err.Error())
87 assert.Nil(t, transaction)
88 }
89
90 func TestMakeInvoice_App(t *testing.T) {
91 ctx := context.TODO()
92
93 svc, err := tests.CreateTestService(t)
94 require.NoError(t, err)
95 defer svc.Remove()
96
97 app, _, err := tests.CreateApp(svc)
98 assert.NoError(t, err)
99
100 dbRequestEvent := &db.RequestEvent{}
101 err = svc.DB.Create(&dbRequestEvent).Error
102 assert.NoError(t, err)
103
104 transactionsService := NewTransactionsService(svc.DB, svc.EventPublisher)
105 transaction, err := transactionsService.MakeInvoice(ctx, 1000, "Hello world", "", 0, nil, svc.LNClient, &app.ID, &dbRequestEvent.ID, nil)
106
107 assert.NoError(t, err)
108 assert.Equal(t, uint64(tests.MockLNClientTransaction.AmountMsat), transaction.AmountMsat)
109 assert.Equal(t, constants.TRANSACTION_STATE_PENDING, transaction.State)
110 assert.Equal(t, tests.MockLNClientTransaction.Preimage, *transaction.Preimage)
111 assert.Equal(t, app.ID, *transaction.AppId)
112 assert.Equal(t, dbRequestEvent.ID, *transaction.RequestEventId)
113 }
114