github.com/iotexproject/iotex-core@v1.14.1-rc1/ioctl/newcmd/contract/contracttestbytecode_test.go (about)

     1  // Copyright (c) 2022 IoTeX Foundation
     2  // This source code is provided 'as is' and no warranties are given as to title or non-infringement, merchantability
     3  // or fitness for purpose and, to the extent permitted by law, all liability for your use of the code is disclaimed.
     4  // This source code is governed by Apache License 2.0 that can be found in the LICENSE file.
     5  
     6  package contract
     7  
     8  import (
     9  	"encoding/hex"
    10  	"testing"
    11  
    12  	"github.com/ethereum/go-ethereum/accounts/keystore"
    13  	"github.com/golang/mock/gomock"
    14  	"github.com/pkg/errors"
    15  	"github.com/stretchr/testify/require"
    16  
    17  	"github.com/iotexproject/iotex-address/address"
    18  	"github.com/iotexproject/iotex-proto/golang/iotexapi"
    19  	"github.com/iotexproject/iotex-proto/golang/iotexapi/mock_iotexapi"
    20  
    21  	"github.com/iotexproject/iotex-core/ioctl/config"
    22  	"github.com/iotexproject/iotex-core/ioctl/util"
    23  	"github.com/iotexproject/iotex-core/test/identityset"
    24  	"github.com/iotexproject/iotex-core/test/mock/mock_ioctlclient"
    25  )
    26  
    27  func TestNewContractTestBytecodeCmd(t *testing.T) {
    28  	require := require.New(t)
    29  	ctrl := gomock.NewController(t)
    30  	defer ctrl.Finish()
    31  	client := mock_ioctlclient.NewMockClient(ctrl)
    32  	apiServiceClient := mock_iotexapi.NewMockAPIServiceClient(ctrl)
    33  	addr := identityset.Address(0).String()
    34  
    35  	ks := keystore.NewKeyStore(t.TempDir(), 2, 1)
    36  	acc, err := ks.NewAccount("")
    37  	require.NoError(err)
    38  	accAddr, err := address.FromBytes(acc.Address.Bytes())
    39  	require.NoError(err)
    40  
    41  	client.EXPECT().SelectTranslation(gomock.Any()).Return("contract", config.English).Times(40)
    42  	client.EXPECT().SetEndpointWithFlag(gomock.Any()).AnyTimes()
    43  	client.EXPECT().SetInsecureWithFlag(gomock.Any()).AnyTimes()
    44  	client.EXPECT().Alias(gomock.Any()).Return("producer", nil).AnyTimes()
    45  	client.EXPECT().APIServiceClient().Return(apiServiceClient, nil).AnyTimes()
    46  	client.EXPECT().IsCryptoSm2().Return(false).AnyTimes()
    47  	client.EXPECT().ReadSecret().Return("", nil).AnyTimes()
    48  	client.EXPECT().Address(gomock.Any()).Return(accAddr.String(), nil).Times(4)
    49  	client.EXPECT().AddressWithDefaultIfNotExist(gomock.Any()).Return(accAddr.String(), nil).AnyTimes()
    50  	client.EXPECT().NewKeyStore().Return(ks).AnyTimes()
    51  	client.EXPECT().AskToConfirm(gomock.Any()).Return(true, nil).AnyTimes()
    52  	client.EXPECT().Config().Return(config.Config{
    53  		Explorer: "iotexscan",
    54  		Endpoint: "testnet1",
    55  	}).AnyTimes()
    56  
    57  	apiServiceClient.EXPECT().ReadContract(gomock.Any(), gomock.Any()).Return(&iotexapi.ReadContractResponse{
    58  		Data: hex.EncodeToString([]byte("60fe47b100000000000000000000000000000000000000000000000000000000")),
    59  	}, nil)
    60  
    61  	t.Run("compile contract", func(t *testing.T) {
    62  		cmd := NewContractTestBytecodeCmd(client)
    63  		result, err := util.ExecuteCmd(cmd, addr, "a9059cbb0000000000000000000000004867c4bada9553216bf296c4c64e9ff0749206490000000000000000000000000000000000000000000000000000000000000001")
    64  		require.NoError(err)
    65  		require.Contains(result, "return")
    66  	})
    67  
    68  	t.Run("failed to read contract", func(t *testing.T) {
    69  		expectedErr := errors.New("failed to read contract")
    70  		apiServiceClient.EXPECT().ReadContract(gomock.Any(), gomock.Any()).Return(nil, expectedErr)
    71  		cmd := NewContractTestBytecodeCmd(client)
    72  		_, err := util.ExecuteCmd(cmd, addr, "a9059cbb0000000000000000000000004867c4bada9553216bf296c4c64e9ff0749206490000000000000000000000000000000000000000000000000000000000000001")
    73  		require.Contains(err.Error(), expectedErr.Error())
    74  	})
    75  
    76  	t.Run("invalid amount", func(t *testing.T) {
    77  		expectedErr := errors.New("invalid amount")
    78  		cmd := NewContractTestBytecodeCmd(client)
    79  		_, err := util.ExecuteCmd(cmd, addr, "a9059cbb0000000000000000000000004867c4bada9553216bf296c4c64e9ff0749206490000000000000000000000000000000000000000000000000000000000000001", "test")
    80  		require.Contains(err.Error(), expectedErr.Error())
    81  	})
    82  
    83  	t.Run("invalid bytecode", func(t *testing.T) {
    84  		expectedErr := errors.New("invalid bytecode")
    85  		cmd := NewContractTestBytecodeCmd(client)
    86  		_, err := util.ExecuteCmd(cmd, addr, "test")
    87  		require.Contains(err.Error(), expectedErr.Error())
    88  	})
    89  
    90  	t.Run("failed to get contract address", func(t *testing.T) {
    91  		expectedErr := errors.New("failed to get contract address")
    92  		client.EXPECT().Address(gomock.Any()).Return("", expectedErr)
    93  		cmd := NewContractTestBytecodeCmd(client)
    94  		_, err := util.ExecuteCmd(cmd, "test", "")
    95  		require.Contains(err.Error(), expectedErr.Error())
    96  	})
    97  }