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