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