permissions_test.go raw
1 package permissions
2
3 import (
4 "testing"
5 "time"
6
7 "github.com/stretchr/testify/assert"
8 "github.com/stretchr/testify/require"
9
10 "github.com/getAlby/hub/constants"
11 "github.com/getAlby/hub/db"
12 "github.com/getAlby/hub/nip47/models"
13 "github.com/getAlby/hub/tests"
14 )
15
16 func TestHasPermission_NoPermission(t *testing.T) {
17 svc, err := tests.CreateTestService(t)
18 require.NoError(t, err)
19 defer svc.Remove()
20
21 app, _, err := tests.CreateApp(svc)
22 assert.NoError(t, err)
23
24 permissionsSvc := NewPermissionsService(svc.DB, svc.EventPublisher)
25 result, code, message := permissionsSvc.HasPermission(app, constants.PAY_INVOICE_SCOPE)
26 assert.False(t, result)
27 assert.Equal(t, constants.ERROR_RESTRICTED, code)
28 assert.Equal(t, "This app does not have the pay_invoice scope", message)
29 }
30
31 func TestHasPermission_Expired(t *testing.T) {
32 svc, err := tests.CreateTestService(t)
33 require.NoError(t, err)
34 defer svc.Remove()
35
36 app, _, err := tests.CreateApp(svc)
37 assert.NoError(t, err)
38
39 budgetRenewal := "never"
40 expiresAt := time.Now().Add(-24 * time.Hour)
41 appPermission := &db.AppPermission{
42 AppId: app.ID,
43 App: *app,
44 Scope: constants.PAY_INVOICE_SCOPE,
45 MaxAmountSat: 100,
46 BudgetRenewal: budgetRenewal,
47 ExpiresAt: &expiresAt,
48 }
49 err = svc.DB.Create(appPermission).Error
50 assert.NoError(t, err)
51
52 permissionsSvc := NewPermissionsService(svc.DB, svc.EventPublisher)
53 result, code, message := permissionsSvc.HasPermission(app, constants.PAY_INVOICE_SCOPE)
54 assert.False(t, result)
55 assert.Equal(t, constants.ERROR_EXPIRED, code)
56 assert.Equal(t, "This app has expired", message)
57 }
58
59 func TestHasPermission_OK(t *testing.T) {
60 svc, err := tests.CreateTestService(t)
61 require.NoError(t, err)
62 defer svc.Remove()
63
64 app, _, err := tests.CreateApp(svc)
65 assert.NoError(t, err)
66
67 budgetRenewal := "never"
68 expiresAt := time.Now().Add(24 * time.Hour)
69 appPermission := &db.AppPermission{
70 AppId: app.ID,
71 App: *app,
72 Scope: constants.PAY_INVOICE_SCOPE,
73 MaxAmountSat: 10,
74 BudgetRenewal: budgetRenewal,
75 ExpiresAt: &expiresAt,
76 }
77 err = svc.DB.Create(appPermission).Error
78 assert.NoError(t, err)
79
80 permissionsSvc := NewPermissionsService(svc.DB, svc.EventPublisher)
81 result, code, message := permissionsSvc.HasPermission(app, constants.PAY_INVOICE_SCOPE)
82 assert.True(t, result)
83 assert.Empty(t, code)
84 assert.Empty(t, message)
85 }
86
87 func TestRequestMethodToScope_GetBudget(t *testing.T) {
88 svc, err := tests.CreateTestService(t)
89 assert.NoError(t, err)
90 defer svc.Remove()
91
92 scope, err := RequestMethodToScope(models.GET_BUDGET_METHOD)
93 assert.NoError(t, err)
94 assert.Equal(t, "", scope)
95 }
96
97 func TestRequestMethodsToScopes_GetBudget(t *testing.T) {
98 svc, err := tests.CreateTestService(t)
99 assert.NoError(t, err)
100 defer svc.Remove()
101
102 scopes, err := RequestMethodsToScopes([]string{models.GET_BUDGET_METHOD})
103 assert.NoError(t, err)
104 assert.Equal(t, []string{}, scopes)
105 }
106
107 func TestRequestMethodToScope_GetInfo(t *testing.T) {
108 scope, err := RequestMethodToScope(models.GET_INFO_METHOD)
109 assert.NoError(t, err)
110 assert.Equal(t, constants.GET_INFO_SCOPE, scope)
111 }
112
113 func TestRequestMethodsToScopes_GetInfo(t *testing.T) {
114 scopes, err := RequestMethodsToScopes([]string{models.GET_INFO_METHOD})
115 assert.NoError(t, err)
116 assert.Equal(t, []string{constants.GET_INFO_SCOPE}, scopes)
117 }
118
119 func TestRequestMethodToScope_CreateConnection(t *testing.T) {
120 scope, err := RequestMethodToScope(models.CREATE_CONNECTION_METHOD)
121 assert.NoError(t, err)
122 assert.Equal(t, constants.SUPERUSER_SCOPE, scope)
123 }
124 func TestScopeToRequestMethods_Superuser(t *testing.T) {
125 methods := scopeToRequestMethods(constants.SUPERUSER_SCOPE)
126 assert.Equal(t, []string{models.CREATE_CONNECTION_METHOD}, methods)
127 }
128
129 func TestGetPermittedMethods_AlwaysGranted(t *testing.T) {
130 svc, err := tests.CreateTestService(t)
131 require.NoError(t, err)
132 defer svc.Remove()
133
134 app, _, err := tests.CreateApp(svc)
135 assert.NoError(t, err)
136
137 permissionsSvc := NewPermissionsService(svc.DB, svc.EventPublisher)
138 result := permissionsSvc.GetPermittedMethods(app, svc.LNClient)
139 assert.Equal(t, GetAlwaysGrantedMethods(), result)
140 }
141
142 func TestGetPermittedMethods_PayInvoiceScopeGivesAllPaymentMethods(t *testing.T) {
143 svc, err := tests.CreateTestService(t)
144 require.NoError(t, err)
145 defer svc.Remove()
146
147 app, _, err := tests.CreateApp(svc)
148 assert.NoError(t, err)
149
150 appPermission := &db.AppPermission{
151 AppId: app.ID,
152 App: *app,
153 Scope: constants.PAY_INVOICE_SCOPE,
154 }
155 err = svc.DB.Create(appPermission).Error
156 assert.NoError(t, err)
157
158 permissionsSvc := NewPermissionsService(svc.DB, svc.EventPublisher)
159 result := permissionsSvc.GetPermittedMethods(app, svc.LNClient)
160 assert.Contains(t, result, models.PAY_INVOICE_METHOD)
161 assert.Contains(t, result, models.PAY_KEYSEND_METHOD)
162 assert.Contains(t, result, models.MULTI_PAY_INVOICE_METHOD)
163 assert.Contains(t, result, models.MULTI_PAY_KEYSEND_METHOD)
164 }
165