check_unsettled_transaction_test.go raw

   1  package transactions
   2  
   3  import (
   4  	"context"
   5  	"testing"
   6  	"time"
   7  
   8  	"github.com/stretchr/testify/assert"
   9  	"github.com/stretchr/testify/require"
  10  
  11  	"github.com/getAlby/hub/constants"
  12  	"github.com/getAlby/hub/db"
  13  	"github.com/getAlby/hub/lnclient"
  14  	"github.com/getAlby/hub/tests"
  15  )
  16  
  17  func TestCheckUnsettledTransaction(t *testing.T) {
  18  	svc, err := tests.CreateTestService(t)
  19  	require.NoError(t, err)
  20  	defer svc.Remove()
  21  
  22  	dbTransaction := db.Transaction{
  23  		State:       constants.TRANSACTION_STATE_PENDING,
  24  		Type:        constants.TRANSACTION_TYPE_OUTGOING,
  25  		PaymentHash: tests.MockLNClientTransaction.PaymentHash,
  26  		AmountMsat:  123000,
  27  	}
  28  	svc.DB.Create(&dbTransaction)
  29  
  30  	mockEventConsumer := tests.NewMockEventConsumer()
  31  	svc.EventPublisher.RegisterSubscriber(mockEventConsumer)
  32  	transactionsService := NewTransactionsService(svc.DB, svc.EventPublisher)
  33  	settledAt := time.Now().Unix()
  34  	svc.LNClient.(*tests.MockLn).MockTransaction = &lnclient.Transaction{
  35  		SettledAt: &settledAt,
  36  		Preimage:  "dummy",
  37  	}
  38  
  39  	// do not allow checking unsettled transactions if notifications are supported
  40  	transactionsService.checkUnsettledTransaction(context.TODO(), &dbTransaction, svc.LNClient)
  41  	assert.Equal(t, constants.TRANSACTION_STATE_PENDING, dbTransaction.State)
  42  
  43  	svc.LNClient.(*tests.MockLn).SupportedNotificationTypes = &[]string{}
  44  	transactionsService.checkUnsettledTransaction(context.TODO(), &dbTransaction, svc.LNClient)
  45  
  46  	assert.NoError(t, err)
  47  	assert.Equal(t, constants.TRANSACTION_STATE_SETTLED, dbTransaction.State)
  48  	consumedEvents := mockEventConsumer.WaitForConsumedEvents(1)
  49  	assert.Equal(t, 1, len(consumedEvents))
  50  	assert.Equal(t, "nwc_payment_sent", consumedEvents[0].Event)
  51  	settledTransaction := consumedEvents[0].Properties.(*db.Transaction)
  52  	assert.Equal(t, &dbTransaction, settledTransaction)
  53  }
  54  
  55  func TestCheckUnsettledTransactions(t *testing.T) {
  56  	svc, err := tests.CreateTestService(t)
  57  	require.NoError(t, err)
  58  	defer svc.Remove()
  59  
  60  	dbTransaction := db.Transaction{
  61  		State:       constants.TRANSACTION_STATE_PENDING,
  62  		Type:        constants.TRANSACTION_TYPE_OUTGOING,
  63  		PaymentHash: tests.MockLNClientTransaction.PaymentHash,
  64  		AmountMsat:  123000,
  65  		CreatedAt:   time.Now(),
  66  	}
  67  	svc.DB.Create(&dbTransaction)
  68  
  69  	mockEventConsumer := tests.NewMockEventConsumer()
  70  	svc.EventPublisher.RegisterSubscriber(mockEventConsumer)
  71  	transactionsService := NewTransactionsService(svc.DB, svc.EventPublisher)
  72  	settledAt := time.Now().Unix()
  73  
  74  	svc.LNClient.(*tests.MockLn).MockTransaction = &lnclient.Transaction{
  75  		SettledAt: &settledAt,
  76  		Preimage:  "dummy",
  77  	}
  78  
  79  	// do not allow checking unsettled transactions if notifications are supported
  80  	transactionsService.checkUnsettledTransactions(context.TODO(), svc.LNClient)
  81  
  82  	svc.DB.Find(&dbTransaction, db.Transaction{
  83  		ID: dbTransaction.ID,
  84  	})
  85  	assert.Equal(t, constants.TRANSACTION_STATE_PENDING, dbTransaction.State)
  86  
  87  	svc.LNClient.(*tests.MockLn).SupportedNotificationTypes = &[]string{}
  88  	transactionsService.checkUnsettledTransactions(context.TODO(), svc.LNClient)
  89  
  90  	svc.DB.Find(&dbTransaction, db.Transaction{
  91  		ID: dbTransaction.ID,
  92  	})
  93  	assert.NoError(t, err)
  94  	assert.Equal(t, constants.TRANSACTION_STATE_SETTLED, dbTransaction.State)
  95  	consumedEvents := mockEventConsumer.WaitForConsumedEvents(1)
  96  	assert.Equal(t, 1, len(consumedEvents))
  97  	assert.Equal(t, "nwc_payment_sent", consumedEvents[0].Event)
  98  	settledTransaction := consumedEvents[0].Properties.(*db.Transaction)
  99  	assert.Equal(t, dbTransaction.ID, settledTransaction.ID)
 100  }
 101