github.com/iotexproject/iotex-core@v1.14.1-rc1/ioctl/newcmd/contract/contracttestfunction_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  	"testing"
    10  
    11  	"github.com/golang/mock/gomock"
    12  	"github.com/iotexproject/iotex-address/address"
    13  	"github.com/iotexproject/iotex-proto/golang/iotexapi"
    14  	"github.com/iotexproject/iotex-proto/golang/iotexapi/mock_iotexapi"
    15  	"github.com/iotexproject/iotex-proto/golang/iotextypes"
    16  	"github.com/stretchr/testify/require"
    17  
    18  	"github.com/iotexproject/iotex-core/ioctl/config"
    19  	"github.com/iotexproject/iotex-core/ioctl/util"
    20  	"github.com/iotexproject/iotex-core/test/mock/mock_ioctlclient"
    21  )
    22  
    23  func TestNewContractTestFunctionCmd(t *testing.T) {
    24  	require := require.New(t)
    25  	ctrl := gomock.NewController(t)
    26  	defer ctrl.Finish()
    27  
    28  	t.Run("test_pass", func(t *testing.T) {
    29  		client := mock_ioctlclient.NewMockClient(ctrl)
    30  		apiClient := mock_iotexapi.NewMockAPIServiceClient(ctrl)
    31  		client.EXPECT().SelectTranslation(gomock.Any()).Return("test", config.English).MinTimes(2)
    32  		client.EXPECT().Address(gomock.Any()).DoAndReturn(func(addr string) (string, error) {
    33  			_, err := address.FromString(addr)
    34  			return addr, err
    35  		}).Times(1)
    36  		client.EXPECT().APIServiceClient().Return(apiClient, nil).Times(1)
    37  		client.EXPECT().AddressWithDefaultIfNotExist(gomock.Any()).Return("", nil).Times(1)
    38  		apiClient.EXPECT().ReadContract(gomock.Any(), gomock.Any(), gomock.Any()).Return(&iotexapi.ReadContractResponse{}, nil).Times(1)
    39  		cmd := NewContractTestFunctionCmd(client)
    40  		result, err := util.ExecuteCmd(cmd, "--with-arguments", `{"recipients":["io1h8zxmdacge966wp6t90a02ncghaa6eptnftfqr","io14fmlh7zedcx7tn3k9k744v54nxnv8zky86tjhj"],"amounts":["3123132","123"],"payload":"PLEASE!!!"}`, "io1h8zxmdacge966wp6t90a02ncghaa6eptnftfqr", "test.abi", "multiSend", "3.4")
    41  		require.NoError(err)
    42  		require.Contains(result, "return")
    43  	})
    44  
    45  	t.Run("test_output", func(t *testing.T) {
    46  		client := mock_ioctlclient.NewMockClient(ctrl)
    47  		apiClient := mock_iotexapi.NewMockAPIServiceClient(ctrl)
    48  		client.EXPECT().SelectTranslation(gomock.Any()).Return("test", config.English).MinTimes(2)
    49  		client.EXPECT().Address(gomock.Any()).DoAndReturn(func(addr string) (string, error) {
    50  			_, err := address.FromString(addr)
    51  			return addr, err
    52  		}).Times(1)
    53  		client.EXPECT().APIServiceClient().Return(apiClient, nil).Times(1)
    54  		client.EXPECT().AddressWithDefaultIfNotExist(gomock.Any()).Return("", nil).Times(1)
    55  		apiClient.EXPECT().ReadContract(gomock.Any(), gomock.Any(), gomock.Any()).Return(&iotexapi.ReadContractResponse{
    56  			Data:    "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000b48656c6c6f20576f726c64000000000000000000000000000000000000000000",
    57  			Receipt: &iotextypes.Receipt{},
    58  		}, nil).Times(1)
    59  		cmd := NewContractTestFunctionCmd(client)
    60  		result, err := util.ExecuteCmd(cmd, "io1h8zxmdacge966wp6t90a02ncghaa6eptnftfqr", "test.abi", "getMessage")
    61  		require.NoError(err)
    62  		require.Contains(result, "Hello World")
    63  	})
    64  
    65  	t.Run("invalid_address", func(t *testing.T) {
    66  		client := mock_ioctlclient.NewMockClient(ctrl)
    67  		client.EXPECT().SelectTranslation(gomock.Any()).Return("test", config.English).MinTimes(2)
    68  		client.EXPECT().Address(gomock.Any()).DoAndReturn(func(addr string) (string, error) {
    69  			_, err := address.FromString(addr)
    70  			return addr, err
    71  		}).Times(1)
    72  		cmd := NewContractTestFunctionCmd(client)
    73  		_, err := util.ExecuteCmd(cmd, "--with-arguments", `{"recipients":["io1h8zxmdacge966wp6t90a02ncghaa6eptnftfqr","io14fmlh7zedcx7tn3k9k744v54nxnv8zky86tjhj"],"amounts":["3123132","123"],"payload":"PLEASE!!!"}`, "123", "test.abi", "multiSend")
    74  		require.Contains(err.Error(), "invalid address")
    75  	})
    76  
    77  	t.Run("abifile_not_exist", func(t *testing.T) {
    78  		client := mock_ioctlclient.NewMockClient(ctrl)
    79  		client.EXPECT().SelectTranslation(gomock.Any()).Return("test", config.English).MinTimes(2)
    80  		client.EXPECT().Address(gomock.Any()).DoAndReturn(func(addr string) (string, error) {
    81  			_, err := address.FromString(addr)
    82  			return addr, err
    83  		}).Times(1)
    84  		cmd := NewContractTestFunctionCmd(client)
    85  		_, err := util.ExecuteCmd(cmd, "--with-arguments", `{"recipients":["io1h8zxmdacge966wp6t90a02ncghaa6eptnftfqr","io14fmlh7zedcx7tn3k9k744v54nxnv8zky86tjhj"],"amounts":["3123132","123"],"payload":"PLEASE!!!"}`, "io1h8zxmdacge966wp6t90a02ncghaa6eptnftfqr", "not_exist.abi", "multiSend")
    86  		require.Contains(err.Error(), "no such file")
    87  	})
    88  
    89  	t.Run("invalid_method", func(t *testing.T) {
    90  		client := mock_ioctlclient.NewMockClient(ctrl)
    91  		client.EXPECT().SelectTranslation(gomock.Any()).Return("test", config.English).MinTimes(2)
    92  		client.EXPECT().Address(gomock.Any()).DoAndReturn(func(addr string) (string, error) {
    93  			_, err := address.FromString(addr)
    94  			return addr, err
    95  		}).Times(1)
    96  		cmd := NewContractTestFunctionCmd(client)
    97  		_, err := util.ExecuteCmd(cmd, "--with-arguments", `{"recipients":["io1h8zxmdacge966wp6t90a02ncghaa6eptnftfqr","io14fmlh7zedcx7tn3k9k744v54nxnv8zky86tjhj"],"amounts":["3123132","123"],"payload":"PLEASE!!!"}`, "io1h8zxmdacge966wp6t90a02ncghaa6eptnftfqr", "test.abi", "multiSend1")
    98  		require.Contains(err.Error(), "invalid method name")
    99  	})
   100  
   101  	t.Run("invalid_amount", func(t *testing.T) {
   102  		client := mock_ioctlclient.NewMockClient(ctrl)
   103  		client.EXPECT().SelectTranslation(gomock.Any()).Return("test", config.English).MinTimes(2)
   104  		client.EXPECT().Address(gomock.Any()).DoAndReturn(func(addr string) (string, error) {
   105  			_, err := address.FromString(addr)
   106  			return addr, err
   107  		}).Times(1)
   108  		cmd := NewContractTestFunctionCmd(client)
   109  		_, err := util.ExecuteCmd(cmd, "--with-arguments", `{"recipients":["io1h8zxmdacge966wp6t90a02ncghaa6eptnftfqr","io14fmlh7zedcx7tn3k9k744v54nxnv8zky86tjhj"],"amounts":["3123132","123"],"payload":"PLEASE!!!"}`, "io1h8zxmdacge966wp6t90a02ncghaa6eptnftfqr", "test.abi", "multiSend", "amount")
   110  		require.Contains(err.Error(), "invalid amount")
   111  	})
   112  
   113  	t.Run("invalid_argument", func(t *testing.T) {
   114  		client := mock_ioctlclient.NewMockClient(ctrl)
   115  		client.EXPECT().SelectTranslation(gomock.Any()).Return("test", config.English).MinTimes(2)
   116  		client.EXPECT().Address(gomock.Any()).DoAndReturn(func(addr string) (string, error) {
   117  			_, err := address.FromString(addr)
   118  			return addr, err
   119  		}).Times(1)
   120  		cmd := NewContractTestFunctionCmd(client)
   121  		_, err := util.ExecuteCmd(cmd, "--with-arguments", `{"recipients":"asd"}`, "io1h8zxmdacge966wp6t90a02ncghaa6eptnftfqr", "test.abi", "multiSend", "3.4")
   122  		require.Contains(err.Error(), "invalid argument")
   123  	})
   124  }