Select Git revision
tangle_test.go 52.90 KiB
package tangle
import (
"container/list"
"math"
"testing"
"github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/address"
"github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/balance"
"github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/branchmanager"
"github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/payload"
"github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/transaction"
"github.com/iotaledger/hive.go/kvstore/mapdb"
"github.com/iotaledger/hive.go/types"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
)
func TestSetTransactionPreferred(t *testing.T) {
tangle := New(mapdb.NewMapDB())
event := newEventTangle(t, tangle)
defer event.DetachAll()
tx := createDummyTransaction()
valueObject := payload.New(payload.GenesisID, payload.GenesisID, tx)
tangle.storeTransactionModels(valueObject)
event.Expect("TransactionPreferred", tx, mock.Anything)
modified, err := tangle.SetTransactionPreferred(tx.ID(), true)
require.NoError(t, err)
assert.True(t, modified)
event.AssertExpectations(t)
}
// TestBookTransaction tests the following cases:
// - missing output
// - transaction already booked by another process
// - booking first spend
// - booking double spend
func TestBookTransaction(t *testing.T) {
// CASE: missing output
t.Run("CASE: missing output", func(t *testing.T) {
tangle := New(mapdb.NewMapDB())
event := newEventTangle(t, tangle)
defer event.DetachAll()
tx := createDummyTransaction()
valueObject := payload.New(payload.GenesisID, payload.GenesisID, tx)
cachedTransaction, cachedTransactionMetadata, _, transactionIsNew := tangle.storeTransactionModels(valueObject)
assert.True(t, transactionIsNew)
event.Expect("TransactionSolid", tx, mock.Anything)
// manually trigger a booking: tx will be marked solid, but it cannot be book as its inputs are unavailable
transactionBooked, decisionPending, err := tangle.bookTransaction(cachedTransaction, cachedTransactionMetadata)
assert.False(t, transactionBooked)
assert.False(t, decisionPending)
assert.Error(t, err)
event.AssertExpectations(t)
})
// CASE: transaction already booked by another process
t.Run("CASE: transaction already booked by another process", func(t *testing.T) {
tangle := New(mapdb.NewMapDB())