get_balance_controller_test.go raw
1 package controllers
2
3 import (
4 "context"
5 "encoding/json"
6 "testing"
7
8 "github.com/getAlby/go-nostr"
9 "github.com/stretchr/testify/assert"
10 "github.com/stretchr/testify/require"
11
12 "github.com/getAlby/hub/constants"
13 "github.com/getAlby/hub/db"
14 "github.com/getAlby/hub/nip47/models"
15 "github.com/getAlby/hub/tests"
16 )
17
18 const nip47GetBalanceJson = `
19 {
20 "method": "get_balance"
21 }
22 `
23
24 func TestHandleGetBalanceEvent(t *testing.T) {
25 ctx := context.TODO()
26 svc, err := tests.CreateTestService(t)
27 require.NoError(t, err)
28 defer svc.Remove()
29
30 nip47Request := &models.Request{}
31 err = json.Unmarshal([]byte(nip47GetBalanceJson), nip47Request)
32 assert.NoError(t, err)
33
34 app, _, err := tests.CreateApp(svc)
35 assert.NoError(t, err)
36
37 dbRequestEvent := &db.RequestEvent{}
38 err = svc.DB.Create(&dbRequestEvent).Error
39 assert.NoError(t, err)
40
41 var publishedResponse *models.Response
42
43 publishResponse := func(response *models.Response, tags nostr.Tags) {
44 publishedResponse = response
45 }
46
47 NewTestNip47Controller(svc).
48 HandleGetBalanceEvent(ctx, nip47Request, dbRequestEvent.ID, app, publishResponse)
49
50 assert.Equal(t, int64(21000), publishedResponse.Result.(*getBalanceResponse).Balance)
51 assert.Nil(t, publishedResponse.Error)
52 }
53
54 func TestHandleGetBalanceEvent_IsolatedApp_NoTransactions(t *testing.T) {
55 ctx := context.TODO()
56 svc, err := tests.CreateTestService(t)
57 require.NoError(t, err)
58 defer svc.Remove()
59
60 nip47Request := &models.Request{}
61 err = json.Unmarshal([]byte(nip47GetBalanceJson), nip47Request)
62 assert.NoError(t, err)
63
64 app, _, err := tests.CreateApp(svc)
65 assert.NoError(t, err)
66 app.Isolated = true
67 svc.DB.Save(&app)
68
69 dbRequestEvent := &db.RequestEvent{}
70 err = svc.DB.Create(&dbRequestEvent).Error
71 assert.NoError(t, err)
72
73 var publishedResponse *models.Response
74
75 publishResponse := func(response *models.Response, tags nostr.Tags) {
76 publishedResponse = response
77 }
78
79 NewTestNip47Controller(svc).
80 HandleGetBalanceEvent(ctx, nip47Request, dbRequestEvent.ID, app, publishResponse)
81
82 assert.Equal(t, int64(0), publishedResponse.Result.(*getBalanceResponse).Balance)
83 assert.Nil(t, publishedResponse.Error)
84 }
85 func TestHandleGetBalanceEvent_IsolatedApp_Transactions(t *testing.T) {
86 ctx := context.TODO()
87 svc, err := tests.CreateTestService(t)
88 require.NoError(t, err)
89 defer svc.Remove()
90
91 nip47Request := &models.Request{}
92 err = json.Unmarshal([]byte(nip47GetBalanceJson), nip47Request)
93 assert.NoError(t, err)
94
95 app, _, err := tests.CreateApp(svc)
96 assert.NoError(t, err)
97 app.Isolated = true
98 svc.DB.Save(&app)
99
100 svc.DB.Create(&db.Transaction{
101 AppId: &app.ID,
102 State: constants.TRANSACTION_STATE_SETTLED,
103 Type: constants.TRANSACTION_TYPE_INCOMING,
104 AmountMsat: 1000,
105 })
106 // create an unrelated transaction, should not count
107 svc.DB.Create(&db.Transaction{
108 AppId: nil,
109 State: constants.TRANSACTION_STATE_SETTLED,
110 Type: constants.TRANSACTION_TYPE_INCOMING,
111 AmountMsat: 1000,
112 })
113
114 dbRequestEvent := &db.RequestEvent{}
115 err = svc.DB.Create(&dbRequestEvent).Error
116 assert.NoError(t, err)
117
118 var publishedResponse *models.Response
119
120 publishResponse := func(response *models.Response, tags nostr.Tags) {
121 publishedResponse = response
122 }
123
124 NewTestNip47Controller(svc).
125 HandleGetBalanceEvent(ctx, nip47Request, dbRequestEvent.ID, app, publishResponse)
126
127 assert.Equal(t, int64(1000), publishedResponse.Result.(*getBalanceResponse).Balance)
128 assert.Nil(t, publishedResponse.Error)
129 }
130