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  }