github.com/cosmos/cosmos-sdk@v0.50.10/types/result_test.go (about) 1 package types_test 2 3 import ( 4 "encoding/hex" 5 "fmt" 6 "strings" 7 "testing" 8 "time" 9 10 abci "github.com/cometbft/cometbft/abci/types" 11 cmtt "github.com/cometbft/cometbft/proto/tendermint/types" 12 coretypes "github.com/cometbft/cometbft/rpc/core/types" 13 cmt "github.com/cometbft/cometbft/types" 14 "github.com/golang/protobuf/proto" //nolint:staticcheck // grpc-gateway uses deprecated golang/protobuf 15 "github.com/stretchr/testify/require" 16 "github.com/stretchr/testify/suite" 17 18 "github.com/cosmos/cosmos-sdk/codec" 19 "github.com/cosmos/cosmos-sdk/testutil/testdata" 20 sdk "github.com/cosmos/cosmos-sdk/types" 21 ) 22 23 type resultTestSuite struct { 24 suite.Suite 25 } 26 27 func TestResultTestSuite(t *testing.T) { 28 suite.Run(t, new(resultTestSuite)) 29 } 30 31 func (s *resultTestSuite) SetupSuite() { 32 s.T().Parallel() 33 } 34 35 func (s *resultTestSuite) TestParseABCILog() { 36 logs := `[{"log":"","msg_index":1,"success":true}]` 37 res, err := sdk.ParseABCILogs(logs) 38 39 s.Require().NoError(err) 40 s.Require().Len(res, 1) 41 s.Require().Equal(res[0].Log, "") 42 s.Require().Equal(res[0].MsgIndex, uint32(1)) 43 } 44 45 func (s *resultTestSuite) TestABCIMessageLog() { 46 cdc := codec.NewLegacyAmino() 47 events := sdk.Events{ 48 sdk.NewEvent("transfer", sdk.NewAttribute("sender", "foo")), 49 sdk.NewEvent("transfer", sdk.NewAttribute("sender", "bar")), 50 } 51 msgLog := sdk.NewABCIMessageLog(0, "", events) 52 msgLogs := sdk.ABCIMessageLogs{msgLog} 53 bz, err := cdc.MarshalJSON(msgLogs) 54 55 s.Require().NoError(err) 56 s.Require().Equal(string(bz), msgLogs.String()) 57 s.Require().Equal(`[{"msg_index":0,"events":[{"type":"transfer","attributes":[{"key":"sender","value":"foo"}]},{"type":"transfer","attributes":[{"key":"sender","value":"bar"}]}]}]`, msgLogs.String()) 58 } 59 60 func (s *resultTestSuite) TestNewSearchTxsResult() { 61 got := sdk.NewSearchTxsResult(150, 20, 2, 20, []*sdk.TxResponse{}) 62 s.Require().Equal(&sdk.SearchTxsResult{ 63 TotalCount: 150, 64 Count: 20, 65 PageNumber: 2, 66 PageTotal: 8, 67 Limit: 20, 68 Txs: []*sdk.TxResponse{}, 69 }, got) 70 } 71 72 func (s *resultTestSuite) TestResponseResultTx() { 73 deliverTxResult := abci.ExecTxResult{ 74 Codespace: "codespace", 75 Code: 1, 76 Data: []byte("data"), 77 Log: `[]`, 78 Info: "info", 79 GasWanted: 100, 80 GasUsed: 90, 81 } 82 resultTx := &coretypes.ResultTx{ 83 Hash: []byte("test"), 84 Height: 10, 85 TxResult: deliverTxResult, 86 } 87 logs, err := sdk.ParseABCILogs(`[]`) 88 89 s.Require().NoError(err) 90 91 want := &sdk.TxResponse{ 92 TxHash: "74657374", 93 Height: 10, 94 Codespace: "codespace", 95 Code: 1, 96 Data: strings.ToUpper(hex.EncodeToString([]byte("data"))), 97 RawLog: `[]`, 98 Logs: logs, 99 Info: "info", 100 GasWanted: 100, 101 GasUsed: 90, 102 Tx: nil, 103 Timestamp: "timestamp", 104 } 105 106 s.Require().Equal(want, sdk.NewResponseResultTx(resultTx, nil, "timestamp")) 107 s.Require().Equal((*sdk.TxResponse)(nil), sdk.NewResponseResultTx(nil, nil, "timestamp")) 108 s.Require().Equal(`code: 1 109 codespace: codespace 110 data: "64617461" 111 events: [] 112 gas_used: "90" 113 gas_wanted: "100" 114 height: "10" 115 info: info 116 logs: [] 117 raw_log: '[]' 118 timestamp: timestamp 119 tx: null 120 txhash: "74657374" 121 `, sdk.NewResponseResultTx(resultTx, nil, "timestamp").String()) 122 s.Require().True(sdk.TxResponse{}.Empty()) 123 s.Require().False(want.Empty()) 124 125 resultBroadcastTx := &coretypes.ResultBroadcastTx{ 126 Code: 1, 127 Codespace: "codespace", 128 Data: []byte("data"), 129 Log: `[]`, 130 Hash: []byte("test"), 131 } 132 133 s.Require().Equal(&sdk.TxResponse{ 134 Code: 1, 135 Codespace: "codespace", 136 Data: "64617461", 137 RawLog: `[]`, 138 Logs: logs, 139 TxHash: "74657374", 140 }, sdk.NewResponseFormatBroadcastTx(resultBroadcastTx)) 141 s.Require().Equal((*sdk.TxResponse)(nil), sdk.NewResponseFormatBroadcastTx(nil)) 142 } 143 144 func (s *resultTestSuite) TestNewSearchBlocksResult() { 145 got := sdk.NewSearchBlocksResult(150, 20, 2, 20, []*cmtt.Block{}) 146 s.Require().Equal(&sdk.SearchBlocksResult{ 147 TotalCount: 150, 148 Count: 20, 149 PageNumber: 2, 150 PageTotal: 8, 151 Limit: 20, 152 Blocks: []*cmtt.Block{}, 153 }, got) 154 } 155 156 func (s *resultTestSuite) TestResponseResultBlock() { 157 timestamp := time.Now() 158 timestampStr := timestamp.UTC().Format(time.RFC3339) 159 160 // create a block 161 resultBlock := &coretypes.ResultBlock{Block: &cmt.Block{ 162 Header: cmt.Header{ 163 Height: 10, 164 Time: timestamp, 165 }, 166 Evidence: cmt.EvidenceData{ 167 Evidence: make(cmt.EvidenceList, 0), 168 }, 169 }} 170 171 blk, err := resultBlock.Block.ToProto() 172 s.Require().NoError(err) 173 174 want := &cmtt.Block{ 175 Header: blk.Header, 176 Evidence: blk.Evidence, 177 } 178 179 s.Require().Equal(want, sdk.NewResponseResultBlock(resultBlock, timestampStr)) 180 } 181 182 func TestWrapServiceResult(t *testing.T) { 183 ctx := sdk.Context{} 184 185 res, err := sdk.WrapServiceResult(ctx, nil, fmt.Errorf("test")) 186 require.Nil(t, res) 187 require.NotNil(t, err) 188 189 res, err = sdk.WrapServiceResult(ctx, &testdata.Dog{}, nil) 190 require.NotNil(t, res) 191 require.Nil(t, err) 192 require.Empty(t, res.Events) 193 194 ctx = ctx.WithEventManager(sdk.NewEventManager()) 195 ctx.EventManager().EmitEvent(sdk.NewEvent("test")) 196 res, err = sdk.WrapServiceResult(ctx, &testdata.Dog{}, nil) 197 require.NotNil(t, res) 198 require.Nil(t, err) 199 require.Len(t, res.Events, 1) 200 201 spot := testdata.Dog{Name: "spot"} 202 res, err = sdk.WrapServiceResult(ctx, &spot, nil) 203 require.NotNil(t, res) 204 require.Nil(t, err) 205 require.Len(t, res.Events, 1) 206 var spot2 testdata.Dog 207 err = proto.Unmarshal(res.Data, &spot2) 208 require.NoError(t, err) 209 require.Equal(t, spot, spot2) 210 }