github.com/iotexproject/iotex-core@v1.14.1-rc1/ioctl/newcmd/node/nodereward_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 node
     7  
     8  import (
     9  	"testing"
    10  
    11  	"github.com/golang/mock/gomock"
    12  	"github.com/iotexproject/iotex-proto/golang/iotexapi"
    13  	"github.com/iotexproject/iotex-proto/golang/iotexapi/mock_iotexapi"
    14  	"github.com/pkg/errors"
    15  	"github.com/stretchr/testify/require"
    16  
    17  	"github.com/iotexproject/iotex-core/ioctl/config"
    18  	"github.com/iotexproject/iotex-core/ioctl/util"
    19  	"github.com/iotexproject/iotex-core/test/mock/mock_ioctlclient"
    20  )
    21  
    22  func TestNewNodeRewardCmd(t *testing.T) {
    23  	require := require.New(t)
    24  	ctrl := gomock.NewController(t)
    25  	client := mock_ioctlclient.NewMockClient(ctrl)
    26  	apiClient := mock_iotexapi.NewMockAPIServiceClient(ctrl)
    27  
    28  	client.EXPECT().SelectTranslation(gomock.Any()).Return("mockTranslationString", config.English).Times(24)
    29  	client.EXPECT().APIServiceClient().Return(apiClient, nil).AnyTimes()
    30  
    31  	t.Run("get node reward pool", func(t *testing.T) {
    32  		t.Run("get available reward & total reward", func(t *testing.T) {
    33  			apiClient.EXPECT().ReadState(gomock.Any(), &iotexapi.ReadStateRequest{
    34  				ProtocolID: []byte("rewarding"),
    35  				MethodName: []byte("AvailableBalance"),
    36  			}).Return(&iotexapi.ReadStateResponse{
    37  				Data: []byte("24361490367906930338205776")},
    38  				nil)
    39  
    40  			apiClient.EXPECT().ReadState(gomock.Any(), &iotexapi.ReadStateRequest{
    41  				ProtocolID: []byte("rewarding"),
    42  				MethodName: []byte("TotalBalance"),
    43  			}).Return(&iotexapi.ReadStateResponse{
    44  				Data: []byte("52331682309272536203174665")},
    45  				nil)
    46  
    47  			cmd := NewNodeRewardCmd(client)
    48  			result, err := util.ExecuteCmd(cmd, "pool")
    49  			require.NoError(err)
    50  			require.Contains(result, "24361490.367906930338205776")
    51  			require.Contains(result, "52331682.309272536203174665")
    52  		})
    53  
    54  		t.Run("failed to invoke AvailableBalance api", func(t *testing.T) {
    55  			expectedErr := errors.New("failed to invoke ReadState api")
    56  
    57  			apiClient.EXPECT().ReadState(gomock.Any(), &iotexapi.ReadStateRequest{
    58  				ProtocolID: []byte("rewarding"),
    59  				MethodName: []byte("AvailableBalance"),
    60  			}).Return(nil, expectedErr)
    61  
    62  			cmd := NewNodeRewardCmd(client)
    63  			_, err := util.ExecuteCmd(cmd, "pool")
    64  			require.Contains(err.Error(), expectedErr.Error())
    65  		})
    66  
    67  		t.Run("failed to convert string into big int", func(t *testing.T) {
    68  			expectedErr := errors.New("failed to convert string into big int")
    69  
    70  			apiClient.EXPECT().ReadState(gomock.Any(), &iotexapi.ReadStateRequest{
    71  				ProtocolID: []byte("rewarding"),
    72  				MethodName: []byte("AvailableBalance"),
    73  			}).Return(&iotexapi.ReadStateResponse{
    74  				Data: []byte("0x24361490367906930338205776")},
    75  				nil)
    76  
    77  			cmd := NewNodeRewardCmd(client)
    78  			_, err := util.ExecuteCmd(cmd, "pool")
    79  			require.Contains(err.Error(), expectedErr.Error())
    80  		})
    81  
    82  		t.Run("failed to invoke TotalBalance api", func(t *testing.T) {
    83  			expectedErr := errors.New("failed to invoke ReadState api")
    84  
    85  			apiClient.EXPECT().ReadState(gomock.Any(), &iotexapi.ReadStateRequest{
    86  				ProtocolID: []byte("rewarding"),
    87  				MethodName: []byte("AvailableBalance"),
    88  			}).Return(&iotexapi.ReadStateResponse{
    89  				Data: []byte("24361490367906930338205776")},
    90  				nil)
    91  
    92  			apiClient.EXPECT().ReadState(gomock.Any(), &iotexapi.ReadStateRequest{
    93  				ProtocolID: []byte("rewarding"),
    94  				MethodName: []byte("TotalBalance"),
    95  			}).Return(nil, expectedErr)
    96  
    97  			cmd := NewNodeRewardCmd(client)
    98  			_, err := util.ExecuteCmd(cmd, "pool")
    99  			require.Contains(err.Error(), expectedErr.Error())
   100  		})
   101  	})
   102  
   103  	t.Run("get unclaimed node reward", func(t *testing.T) {
   104  		t.Run("get balance by address", func(t *testing.T) {
   105  			client.EXPECT().Address(gomock.Any()).Return("test_address", nil).Times(1)
   106  
   107  			apiClient.EXPECT().ReadState(gomock.Any(), &iotexapi.ReadStateRequest{
   108  				ProtocolID: []byte("rewarding"),
   109  				MethodName: []byte("UnclaimedBalance"),
   110  				Arguments:  [][]byte{[]byte("test_address")},
   111  			}).Return(&iotexapi.ReadStateResponse{
   112  				Data: []byte("0"),
   113  			}, nil)
   114  
   115  			cmd := NewNodeRewardCmd(client)
   116  			result, err := util.ExecuteCmd(cmd, "unclaimed", "test")
   117  			require.NoError(err)
   118  			require.Contains(result, "test_address: 0 IOTX")
   119  		})
   120  
   121  		t.Run("failed to get address", func(t *testing.T) {
   122  			expectedErr := errors.New("failed to get address")
   123  			client.EXPECT().Address(gomock.Any()).Return("", expectedErr)
   124  
   125  			cmd := NewNodeRewardCmd(client)
   126  			_, err := util.ExecuteCmd(cmd, "unclaimed", "test")
   127  			require.Contains(err.Error(), expectedErr.Error())
   128  		})
   129  
   130  		t.Run("failed to get version from server", func(t *testing.T) {
   131  			expectedErr := errors.New("failed to get version from server")
   132  
   133  			client.EXPECT().Address(gomock.Any()).Return("test_address", nil).Times(1)
   134  
   135  			apiClient.EXPECT().ReadState(gomock.Any(), &iotexapi.ReadStateRequest{
   136  				ProtocolID: []byte("rewarding"),
   137  				MethodName: []byte("UnclaimedBalance"),
   138  				Arguments:  [][]byte{[]byte("test_address")},
   139  			}).Return(nil, expectedErr)
   140  
   141  			cmd := NewNodeRewardCmd(client)
   142  			_, err := util.ExecuteCmd(cmd, "unclaimed", "test")
   143  			require.Contains(err.Error(), expectedErr.Error())
   144  		})
   145  	})
   146  
   147  	t.Run("unknown command", func(t *testing.T) {
   148  		expectedErr := errors.New("unknown command. \nRun 'ioctl node reward --help' for usage")
   149  
   150  		cmd := NewNodeRewardCmd(client)
   151  		_, err := util.ExecuteCmd(cmd, "")
   152  		require.Contains(err.Error(), expectedErr.Error())
   153  	})
   154  }