From da5032af1f051b03f95d6a8643dfecd8bb7c5ea5 Mon Sep 17 00:00:00 2001 From: dreamer Date: Mon, 1 Jul 2024 13:52:41 +0800 Subject: [PATCH] add e2e test --- e2e/go.mod | 2 +- e2e/random/cli_test.go | 15 +++ e2e/random/query.go | 197 ++++++++++++++++++++++++++++++++++++++ e2e/random/test_helper.go | 62 ++++++++++++ e2e/random/tx.go | 196 +++++++++++++++++++++++++++++++++++++ e2e/record/cli_test.go | 15 +++ e2e/record/query.go | 77 +++++++++++++++ e2e/record/test_helper.go | 49 ++++++++++ e2e/record/tx.go | 62 ++++++++++++ e2e/suite.go | 2 +- 10 files changed, 675 insertions(+), 2 deletions(-) create mode 100644 e2e/random/cli_test.go create mode 100644 e2e/random/query.go create mode 100644 e2e/random/test_helper.go create mode 100644 e2e/random/tx.go create mode 100644 e2e/record/cli_test.go create mode 100644 e2e/record/query.go create mode 100644 e2e/record/test_helper.go create mode 100644 e2e/record/tx.go diff --git a/e2e/go.mod b/e2e/go.mod index ceef05d9..5d712e12 100644 --- a/e2e/go.mod +++ b/e2e/go.mod @@ -9,6 +9,7 @@ require ( github.com/cosmos/cosmos-sdk v0.47.9 github.com/cosmos/gogoproto v1.4.10 github.com/stretchr/testify v1.8.4 + github.com/tidwall/gjson v1.14.4 google.golang.org/protobuf v1.32.0 mods.irisnet.org/api v1.0.0-beta mods.irisnet.org/modules/coinswap v1.0.0-beta @@ -171,7 +172,6 @@ require ( github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c // indirect github.com/tendermint/go-amino v0.16.0 // indirect github.com/tidwall/btree v1.6.0 // indirect - github.com/tidwall/gjson v1.14.4 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect github.com/tklauser/go-sysconf v0.3.5 // indirect diff --git a/e2e/random/cli_test.go b/e2e/random/cli_test.go new file mode 100644 index 00000000..6a0b9215 --- /dev/null +++ b/e2e/random/cli_test.go @@ -0,0 +1,15 @@ +package random + +import ( + "testing" + + "github.com/stretchr/testify/suite" +) + +func TestTxTestSuite(t *testing.T) { + suite.Run(t, new(TxTestSuite)) +} + +func TestQueryTestSuite(t *testing.T) { + suite.Run(t, new(QueryTestSuite)) +} \ No newline at end of file diff --git a/e2e/random/query.go b/e2e/random/query.go new file mode 100644 index 00000000..edf415e4 --- /dev/null +++ b/e2e/random/query.go @@ -0,0 +1,197 @@ +package random + +import ( + "context" + "encoding/json" + "fmt" + "time" + + "github.com/cosmos/gogoproto/proto" + "github.com/tidwall/gjson" + + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/testutil" + "github.com/cosmos/cosmos-sdk/testutil/network" + sdk "github.com/cosmos/cosmos-sdk/types" + + "mods.irisnet.org/e2e" + "mods.irisnet.org/e2e/service" + randomcli "mods.irisnet.org/modules/random/client/cli" + randomtypes "mods.irisnet.org/modules/random/types" + servicecli "mods.irisnet.org/modules/service/client/cli" + servicetypes "mods.irisnet.org/modules/service/types" +) + +// QueryTestSuite is a suite of end-to-end tests for the nft module +type QueryTestSuite struct { + e2e.TestSuite +} + +// SetupSuite sets up test suite +func (s *QueryTestSuite) SetupSuite() { + s.SetModifyConfigFn(func(cfg *network.Config) { + var serviceGenState servicetypes.GenesisState + cfg.Codec.MustUnmarshalJSON(cfg.GenesisState[servicetypes.ModuleName], &serviceGenState) + + serviceGenState.Definitions = append( + serviceGenState.Definitions, + servicetypes.GenOraclePriceSvcDefinition(), + servicetypes.GetRandomSvcDefinition(), + ) + serviceGenState.Bindings = append( + serviceGenState.Bindings, + servicetypes.GenOraclePriceSvcBinding(sdk.DefaultBondDenom), + ) + cfg.GenesisState[servicetypes.ModuleName] = cfg.Codec.MustMarshalJSON(&serviceGenState) + }) + s.TestSuite.SetupSuite() +} + +// TestQueryCmd tests all query command in the nft module +func (s *QueryTestSuite) TestQueryCmd() { + val := s.Validators[0] + clientCtx := val.ClientCtx + expectedCode := uint32(0) + + // --------------------------------------------------------------------------- + serviceDeposit := fmt.Sprintf("50000%s", s.BondDenom) + servicePrices := fmt.Sprintf(`{"price": "50%s"}`, s.BondDenom) + qos := int64(3) + options := "{}" + provider := val.Address + baseURL := val.APIAddress + + from := val.Address + blockInterval := 4 + oracle := true + serviceFeeCap := fmt.Sprintf("50%s", s.BondDenom) + + respResult := `{"code":200,"message":""}` + seedStr := "ABCDEF12ABCDEF12ABCDEF12ABCDEF12ABCDEF12ABCDEF12ABCDEF12ABCDEF12" + respOutput := fmt.Sprintf(`{"header":{},"body":{"seed":"%s"}}`, seedStr) + + // ------bind random service------------- + args := []string{ + fmt.Sprintf("--%s=%s", servicecli.FlagServiceName, randomtypes.ServiceName), + fmt.Sprintf("--%s=%s", servicecli.FlagDeposit, serviceDeposit), + fmt.Sprintf("--%s=%s", servicecli.FlagPricing, servicePrices), + fmt.Sprintf("--%s=%d", servicecli.FlagQoS, qos), + fmt.Sprintf("--%s=%s", servicecli.FlagOptions, options), + fmt.Sprintf("--%s=%s", servicecli.FlagProvider, provider), + + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), + fmt.Sprintf( + "--%s=%s", + flags.FlagFees, + sdk.NewCoins(sdk.NewCoin(s.Network.BondDenom, sdk.NewInt(10))).String(), + ), + } + + txResult := service.BindServiceExec( + s.T(), + s.Network, + clientCtx, + provider.String(), + args...) + s.Require().Equal(expectedCode, txResult.Code) + + // ------test GetCmdRequestRandom()------------- + args = []string{ + fmt.Sprintf("--%s=%s", randomcli.FlagServiceFeeCap, serviceFeeCap), + fmt.Sprintf("--%s=%t", randomcli.FlagOracle, oracle), + fmt.Sprintf("--%s=%d", randomcli.FlagBlockInterval, blockInterval), + + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), + fmt.Sprintf( + "--%s=%s", + flags.FlagFees, + sdk.NewCoins(sdk.NewCoin(s.Network.BondDenom, sdk.NewInt(10))).String(), + ), + } + + txResult = RequestRandomExec(s.T(), s.Network, clientCtx, from.String(), args...) + s.Require().Equal(expectedCode, txResult.Code) + + requestID := gjson.Get(txResult.Log, "0.events.1.attributes.0.value").String() + requestHeight := gjson.Get(txResult.Log, "0.events.1.attributes.2.value").Int() + + // ------test GetCmdQueryRandomRequestQueue()------------- + url := fmt.Sprintf("%s/irismod/random/queue", baseURL) + resp, err := testutil.GetRequest(url) + respType := proto.Message(&randomtypes.QueryRandomRequestQueueResponse{}) + s.Require().NoError(err) + s.Require().NoError(clientCtx.Codec.UnmarshalJSON(resp, respType)) + qrrResp := respType.(*randomtypes.QueryRandomRequestQueueResponse) + s.Require().NoError(err) + s.Require().Len(qrrResp.Requests, 1) + + // ------get service request------------- + requestHeight = requestHeight + 1 + _, err = s.Network.WaitForHeightWithTimeout( + requestHeight, + time.Duration(int64(blockInterval+2)*int64(s.Network.TimeoutCommit)), + ) + if err != nil { + s.Network.WaitForNBlock(2) + } + + blockResult, err := val.RPCClient.BlockResults(context.Background(), &requestHeight) + s.Require().NoError(err) + var requestId string + for _, event := range blockResult.EndBlockEvents { + if event.Type == servicetypes.EventTypeNewBatchRequestProvider { + var found bool + var requestIds []string + var requestsBz []byte + for _, attribute := range event.Attributes { + if string(attribute.Key) == servicetypes.AttributeKeyRequests { + requestsBz = []byte(attribute.Value) + found = true + } + } + s.Require().True(found) + if found { + err := json.Unmarshal(requestsBz, &requestIds) + s.Require().NoError(err) + } + s.Require().Len(requestIds, 1) + requestId = requestIds[0] + } + } + s.Require().NotEmpty(requestId) + + // ------respond service request------------- + args = []string{ + fmt.Sprintf("--%s=%s", servicecli.FlagRequestID, requestId), + fmt.Sprintf("--%s=%s", servicecli.FlagResult, respResult), + fmt.Sprintf("--%s=%s", servicecli.FlagData, respOutput), + + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), + fmt.Sprintf( + "--%s=%s", + flags.FlagFees, + sdk.NewCoins(sdk.NewCoin(s.Network.BondDenom, sdk.NewInt(10))).String(), + ), + } + + txResult = service.RespondServiceExec( + s.T(), + s.Network, + clientCtx, + provider.String(), + args...) + s.Require().Equal(expectedCode, txResult.Code) + + // ------test GetCmdQueryRandom()------------- + url = fmt.Sprintf("%s/irismod/random/randoms/%s", baseURL, requestID) + resp, err = testutil.GetRequest(url) + respType = proto.Message(&randomtypes.QueryRandomResponse{}) + s.Require().NoError(err) + s.Require().NoError(clientCtx.Codec.UnmarshalJSON(resp, respType)) + randomResp := respType.(*randomtypes.QueryRandomResponse) + s.Require().NoError(err) + s.Require().NotNil(randomResp.Random.Value) +} diff --git a/e2e/random/test_helper.go b/e2e/random/test_helper.go new file mode 100644 index 00000000..0eee6081 --- /dev/null +++ b/e2e/random/test_helper.go @@ -0,0 +1,62 @@ +package random + +import ( + "fmt" + "testing" + + "github.com/cometbft/cometbft/libs/cli" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + + randomcli "mods.irisnet.org/modules/random/client/cli" + randomtypes "mods.irisnet.org/modules/random/types" + "mods.irisnet.org/simapp" +) + +// MsgRedelegateExec creates a redelegate message. +func RequestRandomExec(t *testing.T, + network simapp.Network, + clientCtx client.Context, + from string, + extraArgs ...string, +) *simapp.ResponseTx { + args := []string{ + fmt.Sprintf("--%s=%s", flags.FlagFrom, from), + } + args = append(args, extraArgs...) + + return network.ExecTxCmdWithResult(t, clientCtx, randomcli.GetCmdRequestRandom(), args) +} + +func QueryRandomExec(t *testing.T, + network simapp.Network, + clientCtx client.Context, + requestID string, + extraArgs ...string) *randomtypes.Random { + args := []string{ + requestID, + fmt.Sprintf("--%s=json", cli.OutputFlag), + } + args = append(args, extraArgs...) + + response := &randomtypes.Random{} + network.ExecQueryCmd(t, clientCtx, randomcli.GetCmdQueryRandom(), args, response) + return response +} + +func QueryRandomRequestQueueExec(t *testing.T, + network simapp.Network, + clientCtx client.Context, + genHeight string, + extraArgs ...string) *randomtypes.QueryRandomRequestQueueResponse { + args := []string{ + genHeight, + fmt.Sprintf("--%s=json", cli.OutputFlag), + } + args = append(args, extraArgs...) + + response := &randomtypes.QueryRandomRequestQueueResponse{} + network.ExecQueryCmd(t, clientCtx, randomcli.GetCmdQueryRandomRequestQueue(), args, response) + return response +} \ No newline at end of file diff --git a/e2e/random/tx.go b/e2e/random/tx.go new file mode 100644 index 00000000..4fc758a4 --- /dev/null +++ b/e2e/random/tx.go @@ -0,0 +1,196 @@ +package random + +import ( + "context" + "encoding/hex" + "encoding/json" + "fmt" + "time" + + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/testutil/network" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/tidwall/gjson" + + "mods.irisnet.org/e2e" + "mods.irisnet.org/e2e/service" + randomcli "mods.irisnet.org/modules/random/client/cli" + randomtypes "mods.irisnet.org/modules/random/types" + servicecli "mods.irisnet.org/modules/service/client/cli" + servicetypes "mods.irisnet.org/modules/service/types" +) + +// TxTestSuite is a suite of end-to-end tests for the nft module +type TxTestSuite struct { + e2e.TestSuite +} + +// SetupSuite sets up test suite +func (s *TxTestSuite) SetupSuite() { + s.SetModifyConfigFn(func(cfg *network.Config) { + var serviceGenState servicetypes.GenesisState + cfg.Codec.MustUnmarshalJSON(cfg.GenesisState[servicetypes.ModuleName], &serviceGenState) + + serviceGenState.Definitions = append( + serviceGenState.Definitions, + servicetypes.GenOraclePriceSvcDefinition(), + servicetypes.GetRandomSvcDefinition(), + ) + serviceGenState.Bindings = append( + serviceGenState.Bindings, + servicetypes.GenOraclePriceSvcBinding(sdk.DefaultBondDenom), + ) + cfg.GenesisState[servicetypes.ModuleName] = cfg.Codec.MustMarshalJSON(&serviceGenState) + }) + s.TestSuite.SetupSuite() +} + +// TestTxCmd tests all tx command in the nft module +func (s *TxTestSuite) TestTxCmd() { + val := s.Validators[0] + clientCtx := val.ClientCtx + expectedCode := uint32(0) + + // --------------------------------------------------------------------------- + serviceDeposit := fmt.Sprintf("50000%s", s.BondDenom) + servicePrices := fmt.Sprintf(`{"price": "50%s"}`, s.BondDenom) + qos := int64(3) + options := "{}" + provider := val.Address + + from := val.Address + blockInterval := 4 + oracle := true + serviceFeeCap := fmt.Sprintf("50%s", s.BondDenom) + + respResult := `{"code":200,"message":""}` + seedStr := "ABCDEF12ABCDEF12ABCDEF12ABCDEF12ABCDEF12ABCDEF12ABCDEF12ABCDEF12" + respOutput := fmt.Sprintf(`{"header":{},"body":{"seed":"%s"}}`, seedStr) + + // ------bind random service------------- + args := []string{ + fmt.Sprintf("--%s=%s", servicecli.FlagServiceName, randomtypes.ServiceName), + fmt.Sprintf("--%s=%s", servicecli.FlagDeposit, serviceDeposit), + fmt.Sprintf("--%s=%s", servicecli.FlagPricing, servicePrices), + fmt.Sprintf("--%s=%d", servicecli.FlagQoS, qos), + fmt.Sprintf("--%s=%s", servicecli.FlagOptions, options), + fmt.Sprintf("--%s=%s", servicecli.FlagProvider, provider), + + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), + fmt.Sprintf( + "--%s=%s", + flags.FlagFees, + sdk.NewCoins(sdk.NewCoin(s.BondDenom, sdk.NewInt(10))).String(), + ), + } + + txResult := service.BindServiceExec( + s.T(), + s.Network, + clientCtx, + provider.String(), + args...) + s.Require().Equal(expectedCode, txResult.Code, txResult.Log) + + // ------test GetCmdRequestRandom()------------- + args = []string{ + fmt.Sprintf("--%s=%s", randomcli.FlagServiceFeeCap, serviceFeeCap), + fmt.Sprintf("--%s=%t", randomcli.FlagOracle, oracle), + fmt.Sprintf("--%s=%d", randomcli.FlagBlockInterval, blockInterval), + + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), + fmt.Sprintf( + "--%s=%s", + flags.FlagFees, + sdk.NewCoins(sdk.NewCoin(s.BondDenom, sdk.NewInt(10))).String(), + ), + } + + txResult = RequestRandomExec(s.T(), s.Network, clientCtx, from.String(), args...) + s.Require().Equal(expectedCode, txResult.Code) + + requestID := gjson.Get(txResult.Log, "0.events.1.attributes.0.value").String() + requestHeight := gjson.Get(txResult.Log, "0.events.1.attributes.2.value").Int() + + // ------test GetCmdQueryRandomRequestQueue()------------- + qrrResp := QueryRandomRequestQueueExec( + s.T(), + s.Network, + clientCtx, + fmt.Sprintf("%d", requestHeight), + ) + s.Require().Len(qrrResp.Requests, 1) + + // ------get service request------------- + requestHeight = requestHeight + 1 + _, err := s.WaitForHeightWithTimeout( + requestHeight, + time.Duration(int64(blockInterval+5)*int64(s.TimeoutCommit)), + ) + s.Require().NoError(err) + + blockResult, err := val.RPCClient.BlockResults(context.Background(), &requestHeight) + s.Require().NoError(err) + var requestId string + for _, event := range blockResult.EndBlockEvents { + if event.Type == servicetypes.EventTypeNewBatchRequestProvider { + var found bool + var requestIds []string + var requestsBz []byte + for _, attribute := range event.Attributes { + if string(attribute.Key) == servicetypes.AttributeKeyRequests { + requestsBz = []byte(attribute.GetValue()) + found = true + } + } + s.Require().True(found) + if found { + err := json.Unmarshal(requestsBz, &requestIds) + s.Require().NoError(err) + } + s.Require().Len(requestIds, 1) + requestId = requestIds[0] + } + } + s.Require().NotNil(requestId) + + // ------respond service request------------- + args = []string{ + fmt.Sprintf("--%s=%s", servicecli.FlagRequestID, requestId), + fmt.Sprintf("--%s=%s", servicecli.FlagResult, respResult), + fmt.Sprintf("--%s=%s", servicecli.FlagData, respOutput), + + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), + fmt.Sprintf( + "--%s=%s", + flags.FlagFees, + sdk.NewCoins(sdk.NewCoin(s.BondDenom, sdk.NewInt(10))).String(), + ), + } + + txResult = service.RespondServiceExec( + s.T(), + s.Network, + clientCtx, + provider.String(), + args...) + s.Require().Equal(expectedCode, txResult.Code) + + generateHeight := txResult.Height + + // ------test GetCmdQueryRandom()------------- + randomResp := QueryRandomExec(s.T(), s.Network, clientCtx, requestID) + s.Require().NotNil(randomResp.Value) + + generateBLock, err := clientCtx.Client.Block(context.Background(), &generateHeight) + s.Require().NoError(err) + seed, err := hex.DecodeString(seedStr) + s.Require().NoError(err) + random := randomtypes.MakePRNG(generateBLock.Block.LastBlockID.Hash, generateBLock.Block.Header.Time.Unix(), from, seed, true). + GetRand(). + FloatString(randomtypes.RandPrec) + s.Require().Equal(random, randomResp.Value) +} diff --git a/e2e/record/cli_test.go b/e2e/record/cli_test.go new file mode 100644 index 00000000..3c2709e1 --- /dev/null +++ b/e2e/record/cli_test.go @@ -0,0 +1,15 @@ +package record + +import ( + "testing" + + "github.com/stretchr/testify/suite" +) + +func TestTxTestSuite(t *testing.T) { + suite.Run(t, new(TxTestSuite)) +} + +func TestQueryTestSuite(t *testing.T) { + suite.Run(t, new(QueryTestSuite)) +} \ No newline at end of file diff --git a/e2e/record/query.go b/e2e/record/query.go new file mode 100644 index 00000000..1c8eac94 --- /dev/null +++ b/e2e/record/query.go @@ -0,0 +1,77 @@ +package record + +import ( + "fmt" + + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/testutil" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/gogoproto/proto" + + "mods.irisnet.org/e2e" + recordcli "mods.irisnet.org/modules/record/client/cli" + recordtypes "mods.irisnet.org/modules/record/types" +) + +// QueryTestSuite is a suite of end-to-end tests for the nft module +type QueryTestSuite struct { + e2e.TestSuite +} + +// TestQueryCmd tests all query command in the nft module +func (s *QueryTestSuite) TestQueryCmd() { + val := s.Network.Validators[0] + clientCtx := val.ClientCtx + + // --------------------------------------------------------------------------- + + from := val.Address + digest := "digest" + digestAlgo := "digest-algo" + uri := "https://example.abc" + meta := "meta data" + + args := []string{ + fmt.Sprintf("--%s=%s", recordcli.FlagURI, uri), + fmt.Sprintf("--%s=%s", recordcli.FlagMeta, meta), + + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), + fmt.Sprintf( + "--%s=%s", + flags.FlagFees, + sdk.NewCoins(sdk.NewCoin(s.Network.BondDenom, sdk.NewInt(10))).String(), + ), + } + + expectedCode := uint32(0) + + txResult := CreateRecordExec(s.T(), + s.Network, + clientCtx, from.String(), digest, digestAlgo, args...) + s.Require().Equal(expectedCode, txResult.Code) + + recordID := s.Network.GetAttribute( + recordtypes.EventTypeCreateRecord, + recordtypes.AttributeKeyRecordID, + txResult.Events, + ) + // --------------------------------------------------------------------------- + + baseURL := val.APIAddress + url := fmt.Sprintf("%s/irismod/record/records/%s", baseURL, recordID) + + respType := proto.Message(&recordtypes.QueryRecordResponse{}) + expectedContents := []recordtypes.Content{{ + Digest: digest, + DigestAlgo: digestAlgo, + URI: uri, + Meta: meta, + }} + + resp, err := testutil.GetRequest(url) + s.Require().NoError(err) + s.Require().NoError(clientCtx.Codec.UnmarshalJSON(resp, respType)) + record := respType.(*recordtypes.QueryRecordResponse).Record + s.Require().Equal(expectedContents, record.Contents) +} diff --git a/e2e/record/test_helper.go b/e2e/record/test_helper.go new file mode 100644 index 00000000..e1e265fa --- /dev/null +++ b/e2e/record/test_helper.go @@ -0,0 +1,49 @@ +package record + +import ( + "fmt" + "testing" + + "github.com/cometbft/cometbft/libs/cli" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/gogoproto/proto" + + recordcli "mods.irisnet.org/modules/record/client/cli" + "mods.irisnet.org/simapp" +) + +// CreateRecordExec creates a redelegate message. +func CreateRecordExec(t *testing.T, + network simapp.Network, + clientCtx client.Context, + from string, + digest string, + digestAlgo string, + extraArgs ...string) *simapp.ResponseTx { + args := []string{ + digest, + digestAlgo, + fmt.Sprintf("--%s=%s", flags.FlagFrom, from), + } + args = append(args, extraArgs...) + + return network.ExecTxCmdWithResult(t, clientCtx, recordcli.GetCmdCreateRecord(), args) +} + +// QueryRecordExec queries a record. +func QueryRecordExec(t *testing.T, + network simapp.Network, + clientCtx client.Context, + recordID string, + resp proto.Message, + extraArgs ...string) { + args := []string{ + recordID, + fmt.Sprintf("--%s=json", cli.OutputFlag), + } + args = append(args, extraArgs...) + + network.ExecQueryCmd(t, clientCtx, recordcli.GetCmdQueryRecord(), args, resp) +} \ No newline at end of file diff --git a/e2e/record/tx.go b/e2e/record/tx.go new file mode 100644 index 00000000..4cffad01 --- /dev/null +++ b/e2e/record/tx.go @@ -0,0 +1,62 @@ +package record + +import ( + "fmt" + + "github.com/cosmos/cosmos-sdk/client/flags" + sdk "github.com/cosmos/cosmos-sdk/types" + + "mods.irisnet.org/e2e" + recordcli "mods.irisnet.org/modules/record/client/cli" + recordtypes "mods.irisnet.org/modules/record/types" +) + +// TxTestSuite is a suite of end-to-end tests for the nft module +type TxTestSuite struct { + e2e.TestSuite +} + +// TestTxCmd tests all tx command in the nft module +func (s *TxTestSuite) TestTxCmd() { + val := s.Network.Validators[0] + clientCtx := val.ClientCtx + + // --------------------------------------------------------------------------- + + from := val.Address + digest := "digest" + digestAlgo := "digest-algo" + uri := "uri" + meta := "meta" + + args := []string{ + fmt.Sprintf("--%s=%s", recordcli.FlagURI, uri), + fmt.Sprintf("--%s=%s", recordcli.FlagMeta, meta), + + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.Network.BondDenom, sdk.NewInt(10))).String()), + } + + expectedCode := uint32(0) + + txResult := CreateRecordExec(s.T(), + s.Network, + clientCtx, from.String(), digest, digestAlgo, args...) + s.Require().Equal(expectedCode, txResult.Code) + + recordID := s.Network.GetAttribute(recordtypes.EventTypeCreateRecord, recordtypes.AttributeKeyRecordID, txResult.Events) + + // --------------------------------------------------------------------------- + + record := &recordtypes.Record{} + expectedContents := []recordtypes.Content{{ + Digest: digest, + DigestAlgo: digestAlgo, + URI: uri, + Meta: meta, + }} + + QueryRecordExec(s.T(), s.Network, clientCtx, recordID, record) + s.Require().Equal(expectedContents, record.Contents) +} diff --git a/e2e/suite.go b/e2e/suite.go index cf41b6fc..0e4fc9c6 100644 --- a/e2e/suite.go +++ b/e2e/suite.go @@ -43,7 +43,7 @@ func (s *TestSuite) SetupSuite() { // TearDownSuite tears down the integration test suite func (s *TestSuite) TearDownSuite() { - s.T().Log("tearing down e2e nft test suite") + s.T().Log("tearing down e2e test suite") s.Network.Cleanup() }