github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/pkg/neorpc/result/invoke_test.go (about)

     1  package result
     2  
     3  import (
     4  	"encoding/base64"
     5  	"encoding/json"
     6  	"errors"
     7  	"math/big"
     8  	"testing"
     9  
    10  	"github.com/google/uuid"
    11  	"github.com/nspcc-dev/neo-go/pkg/core/state"
    12  	"github.com/nspcc-dev/neo-go/pkg/core/transaction"
    13  	"github.com/nspcc-dev/neo-go/pkg/smartcontract/trigger"
    14  	"github.com/nspcc-dev/neo-go/pkg/util"
    15  	"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
    16  	"github.com/nspcc-dev/neo-go/pkg/vm/vmstate"
    17  	"github.com/stretchr/testify/require"
    18  )
    19  
    20  func TestInvoke_MarshalJSON(t *testing.T) {
    21  	tx := transaction.New([]byte{1, 2, 3, 4}, 0)
    22  	tx.Signers = []transaction.Signer{{Account: util.Uint160{1, 2, 3}}}
    23  	tx.Scripts = []transaction.Witness{{InvocationScript: []byte{}, VerificationScript: []byte{}}}
    24  	_ = tx.Size()
    25  	tx.Hash()
    26  
    27  	result := &Invoke{
    28  		State:          "HALT",
    29  		GasConsumed:    237626000,
    30  		Script:         []byte{10},
    31  		Stack:          []stackitem.Item{stackitem.NewBigInteger(big.NewInt(1))},
    32  		FaultException: "",
    33  		Notifications:  []state.NotificationEvent{},
    34  		Transaction:    tx,
    35  	}
    36  
    37  	data, err := json.Marshal(result)
    38  	require.NoError(t, err)
    39  	expected := `{
    40  		"state":"HALT",
    41  		"gasconsumed":"237626000",
    42  		"script":"` + base64.StdEncoding.EncodeToString(result.Script) + `",
    43  		"stack":[
    44  			{"type":"Integer","value":"1"}
    45  		],
    46  		"notifications":[],
    47  		"exception": null,
    48  		"tx":"` + base64.StdEncoding.EncodeToString(tx.Bytes()) + `"
    49  }`
    50  	require.JSONEq(t, expected, string(data))
    51  
    52  	actual := new(Invoke)
    53  	require.NoError(t, json.Unmarshal(data, actual))
    54  	require.Equal(t, result, actual)
    55  }
    56  
    57  func TestAppExecToInvocation(t *testing.T) {
    58  	// With error.
    59  	someErr := errors.New("some err")
    60  	_, err := AppExecToInvocation(nil, someErr)
    61  	require.ErrorIs(t, err, someErr)
    62  
    63  	// Good.
    64  	h := util.Uint256{1, 2, 3}
    65  	ex := state.Execution{
    66  		Trigger:     trigger.Application,
    67  		VMState:     vmstate.Fault,
    68  		GasConsumed: 123,
    69  		Stack:       []stackitem.Item{stackitem.NewBigInteger(big.NewInt(123))},
    70  		Events: []state.NotificationEvent{{
    71  			ScriptHash: util.Uint160{3, 2, 1},
    72  			Name:       "Notification",
    73  			Item:       stackitem.NewArray([]stackitem.Item{stackitem.Null{}}),
    74  		}},
    75  		FaultException: "some fault exception",
    76  	}
    77  	inv, err := AppExecToInvocation(&state.AppExecResult{
    78  		Container: h,
    79  		Execution: ex,
    80  	}, nil)
    81  	require.NoError(t, err)
    82  	require.Equal(t, ex.VMState.String(), inv.State)
    83  	require.Equal(t, ex.GasConsumed, inv.GasConsumed)
    84  	require.Nil(t, inv.Script)
    85  	require.Equal(t, ex.Stack, inv.Stack)
    86  	require.Equal(t, ex.FaultException, inv.FaultException)
    87  	require.Equal(t, ex.Events, inv.Notifications)
    88  	require.Nil(t, inv.Transaction)
    89  	require.Nil(t, inv.Diagnostics)
    90  	require.Equal(t, uuid.UUID{}, inv.Session)
    91  }