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 }