From 9b9b2590cd62190a4a617ac0c9ac5937c16fc6fc Mon Sep 17 00:00:00 2001 From: Aristides Staffieri Date: Tue, 26 Nov 2024 11:57:36 -0700 Subject: [PATCH 1/4] #81: Add test for ingesting strict send path payment --- internal/services/ingest_test.go | 78 ++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/internal/services/ingest_test.go b/internal/services/ingest_test.go index 330464c..447d559 100644 --- a/internal/services/ingest_test.go +++ b/internal/services/ingest_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/stellar/go/keypair" + "github.com/stellar/go/network" "github.com/stellar/go/txnbuild" "github.com/stellar/go/xdr" "github.com/stellar/wallet-backend/internal/apptracker" @@ -215,3 +216,80 @@ func TestIngestPayments(t *testing.T) { assert.Equal(t, payments[0].TransactionHash, "abcd") }) } + +func TestIngestPathPaymentsSend(t *testing.T) { + dbt := dbtest.Open(t) + defer dbt.Close() + + dbConnectionPool, err := db.OpenDBConnectionPool(dbt.DSN) + require.NoError(t, err) + defer dbConnectionPool.Close() + models, _ := data.NewModels(dbConnectionPool) + mockAppTracker := apptracker.MockAppTracker{} + mockRPCService := RPCServiceMock{} + mockRouter := tssrouter.MockRouter{} + tssStore, _ := tssstore.NewStore(dbConnectionPool) + ingestService, _ := NewIngestService(models, "ingestionLedger", &mockAppTracker, &mockRPCService, &mockRouter, tssStore) + srcAccount := keypair.MustRandom().Address() + destAccount := keypair.MustRandom().Address() + usdIssuer := keypair.MustRandom().Address() + eurIssuer := keypair.MustRandom().Address() + + t.Run("test_op_path_payment_send", func(t *testing.T) { + err := models.Account.Insert(context.Background(), srcAccount) + require.NoError(t, err) + + path := []txnbuild.Asset{ + txnbuild.CreditAsset{Code: "USD", Issuer: usdIssuer}, + txnbuild.CreditAsset{Code: "EUR", Issuer: eurIssuer}, + } + + pathPaymentOp := txnbuild.PathPaymentStrictSend{ + SourceAccount: srcAccount, + Destination: destAccount, + DestMin: "9", + SendAmount: "10", + SendAsset: txnbuild.NativeAsset{}, + DestAsset: txnbuild.NativeAsset{}, + Path: path, + } + transaction, err := txnbuild.NewTransaction(txnbuild.TransactionParams{ + SourceAccount: &txnbuild.SimpleAccount{ + AccountID: keypair.MustRandom().Address(), + }, + Operations: []txnbuild.Operation{&pathPaymentOp}, + Preconditions: txnbuild.Preconditions{TimeBounds: txnbuild.NewTimeout(10)}, + }) + require.NoError(t, err) + + signer := keypair.MustRandom() + errSigner := models.Account.Insert(context.Background(), signer.Address()) + require.NoError(t, errSigner) + + signedTx, err := transaction.Sign(network.TestNetworkPassphrase, signer) + require.NoError(t, err) + + txEnvXDR, err := signedTx.Base64() + require.NoError(t, err) + + ledgerTransaction := entities.Transaction{ + Status: entities.SuccessStatus, + Hash: "efgh", + ApplicationOrder: 1, + FeeBump: false, + EnvelopeXDR: txEnvXDR, + ResultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAANAAAAAAAAAAAAAAAAXF0V022EgeGIo6QNVbMVvHdxvvl2MfZcVZUJpfph+0QAAAAAAAAAAAX14QAAAAAA", + Ledger: 1, + } + + ledgerTransactions := []entities.Transaction{ledgerTransaction} + + err = ingestService.ingestPayments(context.Background(), ledgerTransactions) + + payments, _, _, err := models.Payments.GetPaymentsPaginated(context.Background(), srcAccount, "", "", data.ASC, 1) + require.NoError(t, err) + require.NotEmpty(t, payments, "Expected at least one payment") + assert.Equal(t, payments[0].TransactionHash, "efgh") + }) + +} From f4b52572053947babadef514977438889583728d Mon Sep 17 00:00:00 2001 From: Aristides Staffieri Date: Wed, 27 Nov 2024 10:06:42 -0700 Subject: [PATCH 2/4] #81: Expand on pathpayment strict send assertions, add path payment strict receive test --- internal/services/ingest_test.go | 88 +++++++++++++++++++++++++++++++- 1 file changed, 87 insertions(+), 1 deletion(-) diff --git a/internal/services/ingest_test.go b/internal/services/ingest_test.go index 447d559..2417c7b 100644 --- a/internal/services/ingest_test.go +++ b/internal/services/ingest_test.go @@ -289,7 +289,93 @@ func TestIngestPathPaymentsSend(t *testing.T) { payments, _, _, err := models.Payments.GetPaymentsPaginated(context.Background(), srcAccount, "", "", data.ASC, 1) require.NoError(t, err) require.NotEmpty(t, payments, "Expected at least one payment") - assert.Equal(t, payments[0].TransactionHash, "efgh") + assert.Equal(t, payments[0].TransactionHash, *&ledgerTransaction.Hash) + assert.Equal(t, payments[0].SrcAmount, int64(100000000)) + assert.Equal(t, payments[0].SrcAssetType, xdr.AssetTypeAssetTypeNative.String()) + assert.Equal(t, payments[0].ToAddress, destAccount) + assert.Equal(t, payments[0].FromAddress, srcAccount) + assert.Equal(t, payments[0].SrcAssetCode, "XLM") + assert.Equal(t, payments[0].DestAssetCode, "XLM") }) +} + +func TestIngestPathPaymentsReceive(t *testing.T) { + dbt := dbtest.Open(t) + defer dbt.Close() + + dbConnectionPool, err := db.OpenDBConnectionPool(dbt.DSN) + require.NoError(t, err) + defer dbConnectionPool.Close() + models, _ := data.NewModels(dbConnectionPool) + mockAppTracker := apptracker.MockAppTracker{} + mockRPCService := RPCServiceMock{} + mockRouter := tssrouter.MockRouter{} + tssStore, _ := tssstore.NewStore(dbConnectionPool) + ingestService, _ := NewIngestService(models, "ingestionLedger", &mockAppTracker, &mockRPCService, &mockRouter, tssStore) + srcAccount := keypair.MustRandom().Address() + destAccount := keypair.MustRandom().Address() + usdIssuer := keypair.MustRandom().Address() + eurIssuer := keypair.MustRandom().Address() + + t.Run("test_op_path_payment_receive", func(t *testing.T) { + err := models.Account.Insert(context.Background(), srcAccount) + require.NoError(t, err) + + path := []txnbuild.Asset{ + txnbuild.CreditAsset{Code: "USD", Issuer: usdIssuer}, + txnbuild.CreditAsset{Code: "EUR", Issuer: eurIssuer}, + } + + pathPaymentOp := txnbuild.PathPaymentStrictReceive{ + SourceAccount: srcAccount, + Destination: destAccount, + SendMax: "11", + DestAmount: "10", + SendAsset: txnbuild.NativeAsset{}, + DestAsset: txnbuild.NativeAsset{}, + Path: path, + } + transaction, err := txnbuild.NewTransaction(txnbuild.TransactionParams{ + SourceAccount: &txnbuild.SimpleAccount{ + AccountID: keypair.MustRandom().Address(), + }, + Operations: []txnbuild.Operation{&pathPaymentOp}, + Preconditions: txnbuild.Preconditions{TimeBounds: txnbuild.NewTimeout(10)}, + }) + require.NoError(t, err) + + signer := keypair.MustRandom() + errSigner := models.Account.Insert(context.Background(), signer.Address()) + require.NoError(t, errSigner) + + signedTx, err := transaction.Sign(network.TestNetworkPassphrase, signer) + require.NoError(t, err) + + txEnvXDR, err := signedTx.Base64() + require.NoError(t, err) + ledgerTransaction := entities.Transaction{ + Status: entities.SuccessStatus, + Hash: "efgh", + ApplicationOrder: 1, + FeeBump: false, + EnvelopeXDR: txEnvXDR, + ResultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAAAAAAAjOiEfRh4kaFVQDu/CSTZLMtnyg0DbNowZ/G2nLES3KwAAAAAAAAAAAVdSoAAAAAA", + Ledger: 1, + } + + ledgerTransactions := []entities.Transaction{ledgerTransaction} + + err = ingestService.ingestPayments(context.Background(), ledgerTransactions) + + payments, _, _, err := models.Payments.GetPaymentsPaginated(context.Background(), srcAccount, "", "", data.ASC, 1) + require.NoError(t, err) + require.NotEmpty(t, payments, "Expected at least one payment") + assert.Equal(t, payments[0].TransactionHash, *&ledgerTransaction.Hash) + assert.Equal(t, payments[0].SrcAssetType, xdr.AssetTypeAssetTypeNative.String()) + assert.Equal(t, payments[0].ToAddress, destAccount) + assert.Equal(t, payments[0].FromAddress, srcAccount) + assert.Equal(t, payments[0].SrcAssetCode, "XLM") + assert.Equal(t, payments[0].DestAssetCode, "XLM") + }) } From 90f7d322974cd12302b11c2928205bcb0a3d04fa Mon Sep 17 00:00:00 2001 From: Aristides Staffieri Date: Wed, 27 Nov 2024 10:33:47 -0700 Subject: [PATCH 3/4] #81: moves path payments test inside of TestIngestPayments function --- internal/services/ingest_test.go | 47 +++++--------------------------- 1 file changed, 7 insertions(+), 40 deletions(-) diff --git a/internal/services/ingest_test.go b/internal/services/ingest_test.go index 2417c7b..f46738c 100644 --- a/internal/services/ingest_test.go +++ b/internal/services/ingest_test.go @@ -178,6 +178,9 @@ func TestIngestPayments(t *testing.T) { ingestService, _ := NewIngestService(models, "ingestionLedger", &mockAppTracker, &mockRPCService, &mockRouter, tssStore) srcAccount := keypair.MustRandom().Address() destAccount := keypair.MustRandom().Address() + usdIssuer := keypair.MustRandom().Address() + eurIssuer := keypair.MustRandom().Address() + t.Run("test_op_payment", func(t *testing.T) { _ = models.Account.Insert(context.Background(), srcAccount) paymentOp := txnbuild.Payment{ @@ -215,25 +218,6 @@ func TestIngestPayments(t *testing.T) { assert.NoError(t, err) assert.Equal(t, payments[0].TransactionHash, "abcd") }) -} - -func TestIngestPathPaymentsSend(t *testing.T) { - dbt := dbtest.Open(t) - defer dbt.Close() - - dbConnectionPool, err := db.OpenDBConnectionPool(dbt.DSN) - require.NoError(t, err) - defer dbConnectionPool.Close() - models, _ := data.NewModels(dbConnectionPool) - mockAppTracker := apptracker.MockAppTracker{} - mockRPCService := RPCServiceMock{} - mockRouter := tssrouter.MockRouter{} - tssStore, _ := tssstore.NewStore(dbConnectionPool) - ingestService, _ := NewIngestService(models, "ingestionLedger", &mockAppTracker, &mockRPCService, &mockRouter, tssStore) - srcAccount := keypair.MustRandom().Address() - destAccount := keypair.MustRandom().Address() - usdIssuer := keypair.MustRandom().Address() - eurIssuer := keypair.MustRandom().Address() t.Run("test_op_path_payment_send", func(t *testing.T) { err := models.Account.Insert(context.Background(), srcAccount) @@ -285,11 +269,12 @@ func TestIngestPathPaymentsSend(t *testing.T) { ledgerTransactions := []entities.Transaction{ledgerTransaction} err = ingestService.ingestPayments(context.Background(), ledgerTransactions) + require.NoError(t, err) payments, _, _, err := models.Payments.GetPaymentsPaginated(context.Background(), srcAccount, "", "", data.ASC, 1) require.NoError(t, err) require.NotEmpty(t, payments, "Expected at least one payment") - assert.Equal(t, payments[0].TransactionHash, *&ledgerTransaction.Hash) + assert.Equal(t, payments[0].TransactionHash, ledgerTransaction.Hash) assert.Equal(t, payments[0].SrcAmount, int64(100000000)) assert.Equal(t, payments[0].SrcAssetType, xdr.AssetTypeAssetTypeNative.String()) assert.Equal(t, payments[0].ToAddress, destAccount) @@ -297,25 +282,6 @@ func TestIngestPathPaymentsSend(t *testing.T) { assert.Equal(t, payments[0].SrcAssetCode, "XLM") assert.Equal(t, payments[0].DestAssetCode, "XLM") }) -} - -func TestIngestPathPaymentsReceive(t *testing.T) { - dbt := dbtest.Open(t) - defer dbt.Close() - - dbConnectionPool, err := db.OpenDBConnectionPool(dbt.DSN) - require.NoError(t, err) - defer dbConnectionPool.Close() - models, _ := data.NewModels(dbConnectionPool) - mockAppTracker := apptracker.MockAppTracker{} - mockRPCService := RPCServiceMock{} - mockRouter := tssrouter.MockRouter{} - tssStore, _ := tssstore.NewStore(dbConnectionPool) - ingestService, _ := NewIngestService(models, "ingestionLedger", &mockAppTracker, &mockRPCService, &mockRouter, tssStore) - srcAccount := keypair.MustRandom().Address() - destAccount := keypair.MustRandom().Address() - usdIssuer := keypair.MustRandom().Address() - eurIssuer := keypair.MustRandom().Address() t.Run("test_op_path_payment_receive", func(t *testing.T) { err := models.Account.Insert(context.Background(), srcAccount) @@ -367,11 +333,12 @@ func TestIngestPathPaymentsReceive(t *testing.T) { ledgerTransactions := []entities.Transaction{ledgerTransaction} err = ingestService.ingestPayments(context.Background(), ledgerTransactions) + require.NoError(t, err) payments, _, _, err := models.Payments.GetPaymentsPaginated(context.Background(), srcAccount, "", "", data.ASC, 1) require.NoError(t, err) require.NotEmpty(t, payments, "Expected at least one payment") - assert.Equal(t, payments[0].TransactionHash, *&ledgerTransaction.Hash) + assert.Equal(t, payments[0].TransactionHash, ledgerTransaction.Hash) assert.Equal(t, payments[0].SrcAssetType, xdr.AssetTypeAssetTypeNative.String()) assert.Equal(t, payments[0].ToAddress, destAccount) assert.Equal(t, payments[0].FromAddress, srcAccount) From 0b1637c33563664ae43cf0deb152bbdbbc9ba0ea Mon Sep 17 00:00:00 2001 From: Aristides Staffieri Date: Mon, 2 Dec 2024 09:39:48 -0700 Subject: [PATCH 4/4] remove unrelated error assertions --- internal/services/ingest_test.go | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/internal/services/ingest_test.go b/internal/services/ingest_test.go index f46738c..3f00394 100644 --- a/internal/services/ingest_test.go +++ b/internal/services/ingest_test.go @@ -220,8 +220,7 @@ func TestIngestPayments(t *testing.T) { }) t.Run("test_op_path_payment_send", func(t *testing.T) { - err := models.Account.Insert(context.Background(), srcAccount) - require.NoError(t, err) + _ = models.Account.Insert(context.Background(), srcAccount) path := []txnbuild.Asset{ txnbuild.CreditAsset{Code: "USD", Issuer: usdIssuer}, @@ -237,24 +236,20 @@ func TestIngestPayments(t *testing.T) { DestAsset: txnbuild.NativeAsset{}, Path: path, } - transaction, err := txnbuild.NewTransaction(txnbuild.TransactionParams{ + transaction, _ := txnbuild.NewTransaction(txnbuild.TransactionParams{ SourceAccount: &txnbuild.SimpleAccount{ AccountID: keypair.MustRandom().Address(), }, Operations: []txnbuild.Operation{&pathPaymentOp}, Preconditions: txnbuild.Preconditions{TimeBounds: txnbuild.NewTimeout(10)}, }) - require.NoError(t, err) signer := keypair.MustRandom() - errSigner := models.Account.Insert(context.Background(), signer.Address()) - require.NoError(t, errSigner) + _ = models.Account.Insert(context.Background(), signer.Address()) - signedTx, err := transaction.Sign(network.TestNetworkPassphrase, signer) - require.NoError(t, err) + signedTx, _ := transaction.Sign(network.TestNetworkPassphrase, signer) - txEnvXDR, err := signedTx.Base64() - require.NoError(t, err) + txEnvXDR, _ := signedTx.Base64() ledgerTransaction := entities.Transaction{ Status: entities.SuccessStatus, @@ -284,8 +279,7 @@ func TestIngestPayments(t *testing.T) { }) t.Run("test_op_path_payment_receive", func(t *testing.T) { - err := models.Account.Insert(context.Background(), srcAccount) - require.NoError(t, err) + _ = models.Account.Insert(context.Background(), srcAccount) path := []txnbuild.Asset{ txnbuild.CreditAsset{Code: "USD", Issuer: usdIssuer}, @@ -301,24 +295,20 @@ func TestIngestPayments(t *testing.T) { DestAsset: txnbuild.NativeAsset{}, Path: path, } - transaction, err := txnbuild.NewTransaction(txnbuild.TransactionParams{ + transaction, _ := txnbuild.NewTransaction(txnbuild.TransactionParams{ SourceAccount: &txnbuild.SimpleAccount{ AccountID: keypair.MustRandom().Address(), }, Operations: []txnbuild.Operation{&pathPaymentOp}, Preconditions: txnbuild.Preconditions{TimeBounds: txnbuild.NewTimeout(10)}, }) - require.NoError(t, err) signer := keypair.MustRandom() - errSigner := models.Account.Insert(context.Background(), signer.Address()) - require.NoError(t, errSigner) + _ = models.Account.Insert(context.Background(), signer.Address()) - signedTx, err := transaction.Sign(network.TestNetworkPassphrase, signer) - require.NoError(t, err) + signedTx, _ := transaction.Sign(network.TestNetworkPassphrase, signer) - txEnvXDR, err := signedTx.Base64() - require.NoError(t, err) + txEnvXDR, _ := signedTx.Base64() ledgerTransaction := entities.Transaction{ Status: entities.SuccessStatus,