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