test: deduplicate e2e tests (#16356)
This commit is contained in:
parent
7f44ecb936
commit
82adcea791
@ -84,42 +84,6 @@ func (s *E2ETestSuite) TearDownSuite() {
|
||||
s.network.Cleanup()
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestCLIValidateSignatures() {
|
||||
val := s.network.Validators[0]
|
||||
sendTokens := sdk.NewCoins(
|
||||
sdk.NewCoin(fmt.Sprintf("%stoken", val.Moniker), sdk.NewInt(10)),
|
||||
sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10)))
|
||||
|
||||
res, err := s.createBankMsg(val, val.Address, sendTokens,
|
||||
fmt.Sprintf("--%s=true", flags.FlagGenerateOnly))
|
||||
s.Require().NoError(err)
|
||||
|
||||
// write unsigned tx to file
|
||||
unsignedTx := testutil.WriteToNewTempFile(s.T(), res.String())
|
||||
defer unsignedTx.Close()
|
||||
res, err = authclitestutil.TxSignExec(val.ClientCtx, val.Address, unsignedTx.Name())
|
||||
s.Require().NoError(err)
|
||||
signedTx, err := val.ClientCtx.TxConfig.TxJSONDecoder()(res.Bytes())
|
||||
s.Require().NoError(err)
|
||||
|
||||
signedTxFile := testutil.WriteToNewTempFile(s.T(), res.String())
|
||||
defer signedTxFile.Close()
|
||||
txBuilder, err := val.ClientCtx.TxConfig.WrapTxBuilder(signedTx)
|
||||
s.Require().NoError(err)
|
||||
_, err = authclitestutil.TxValidateSignaturesExec(val.ClientCtx, signedTxFile.Name())
|
||||
s.Require().NoError(err)
|
||||
|
||||
txBuilder.SetMemo("MODIFIED TX")
|
||||
bz, err := val.ClientCtx.TxConfig.TxJSONEncoder()(txBuilder.GetTx())
|
||||
s.Require().NoError(err)
|
||||
|
||||
modifiedTxFile := testutil.WriteToNewTempFile(s.T(), string(bz))
|
||||
defer modifiedTxFile.Close()
|
||||
|
||||
_, err = authclitestutil.TxValidateSignaturesExec(val.ClientCtx, modifiedTxFile.Name())
|
||||
s.Require().EqualError(err, "signatures validation failed")
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestCLISignGenOnly() {
|
||||
val := s.network.Validators[0]
|
||||
val2 := s.network.Validators[1]
|
||||
|
||||
@ -1,107 +0,0 @@
|
||||
//go:build e2e
|
||||
// +build e2e
|
||||
|
||||
package crisis
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
"cosmossdk.io/simapp"
|
||||
"github.com/cosmos/cosmos-sdk/client/flags"
|
||||
clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli"
|
||||
"github.com/cosmos/cosmos-sdk/testutil/network"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
"github.com/cosmos/cosmos-sdk/x/crisis/client/cli"
|
||||
"github.com/cosmos/gogoproto/proto"
|
||||
"gotest.tools/v3/assert"
|
||||
)
|
||||
|
||||
type fixture struct {
|
||||
cfg network.Config
|
||||
network *network.Network
|
||||
}
|
||||
|
||||
func initFixture(t *testing.T) *fixture {
|
||||
cfg := network.DefaultConfig(simapp.NewTestNetworkFixture)
|
||||
cfg.NumValidators = 1
|
||||
|
||||
network, err := network.New(t, t.TempDir(), cfg)
|
||||
assert.NilError(t, err)
|
||||
assert.NilError(t, network.WaitForNextBlock())
|
||||
|
||||
return &fixture{
|
||||
cfg: cfg,
|
||||
network: network,
|
||||
}
|
||||
}
|
||||
|
||||
func TestNewMsgVerifyInvariantTxCmd(t *testing.T) {
|
||||
t.Parallel()
|
||||
f := initFixture(t)
|
||||
defer f.network.Cleanup()
|
||||
|
||||
val := f.network.Validators[0]
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
args []string
|
||||
expectErrMsg string
|
||||
expectedCode uint32
|
||||
respType proto.Message
|
||||
}{
|
||||
{
|
||||
"missing module",
|
||||
[]string{
|
||||
"", "total-supply",
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()),
|
||||
fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(f.cfg.BondDenom, sdk.NewInt(10))).String()),
|
||||
},
|
||||
"invalid module name", 0, nil,
|
||||
},
|
||||
{
|
||||
"missing invariant route",
|
||||
[]string{
|
||||
"bank", "",
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()),
|
||||
fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(f.cfg.BondDenom, sdk.NewInt(10))).String()),
|
||||
},
|
||||
"invalid invariant route", 0, nil,
|
||||
},
|
||||
{
|
||||
"valid traclientCtx.Codec.UnmarshalJSON(out.Bytes(), nsaction",
|
||||
[]string{
|
||||
"bank", "total-supply",
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()),
|
||||
fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(f.cfg.BondDenom, sdk.NewInt(10))).String()),
|
||||
},
|
||||
"", 0, &sdk.TxResponse{},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
tc := tc
|
||||
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
cmd := cli.NewMsgVerifyInvariantTxCmd()
|
||||
clientCtx := val.ClientCtx
|
||||
|
||||
out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
|
||||
if tc.expectErrMsg != "" {
|
||||
assert.ErrorContains(t, err, tc.expectErrMsg)
|
||||
} else {
|
||||
assert.NilError(t, err)
|
||||
assert.NilError(t, clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String())
|
||||
|
||||
txResp := tc.respType.(*sdk.TxResponse)
|
||||
assert.NilError(t, clitestutil.CheckTxCode(f.network, clientCtx, txResp.TxHash, tc.expectedCode))
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
@ -1,19 +0,0 @@
|
||||
//go:build e2e
|
||||
// +build e2e
|
||||
|
||||
package feegrant
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"cosmossdk.io/simapp"
|
||||
"github.com/cosmos/cosmos-sdk/testutil/network"
|
||||
|
||||
"github.com/stretchr/testify/suite"
|
||||
)
|
||||
|
||||
func TestE2ETestSuite(t *testing.T) {
|
||||
cfg := network.DefaultConfig(simapp.NewTestNetworkFixture)
|
||||
cfg.NumValidators = 3
|
||||
suite.Run(t, NewE2ETestSuite(cfg))
|
||||
}
|
||||
@ -1,993 +0,0 @@
|
||||
package feegrant
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/cosmos/gogoproto/proto"
|
||||
"github.com/stretchr/testify/suite"
|
||||
|
||||
// without this import amino json encoding will fail when resolving any types
|
||||
_ "cosmossdk.io/api/cosmos/feegrant/v1beta1"
|
||||
"cosmossdk.io/x/feegrant"
|
||||
"cosmossdk.io/x/feegrant/client/cli"
|
||||
"github.com/cosmos/cosmos-sdk/client"
|
||||
"github.com/cosmos/cosmos-sdk/client/flags"
|
||||
codecaddress "github.com/cosmos/cosmos-sdk/codec/address"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/hd"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keyring"
|
||||
"github.com/cosmos/cosmos-sdk/testutil"
|
||||
clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli"
|
||||
"github.com/cosmos/cosmos-sdk/testutil/network"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
govtestutil "github.com/cosmos/cosmos-sdk/x/gov/client/testutil"
|
||||
govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1"
|
||||
govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1"
|
||||
)
|
||||
|
||||
const (
|
||||
oneYear = 365 * 24 * 60 * 60
|
||||
tenHours = 10 * 60 * 60
|
||||
oneHour = 60 * 60
|
||||
)
|
||||
|
||||
type E2ETestSuite struct {
|
||||
suite.Suite
|
||||
|
||||
cfg network.Config
|
||||
network *network.Network
|
||||
addedGranter sdk.AccAddress
|
||||
addedGrantee sdk.AccAddress
|
||||
addedGrant feegrant.Grant
|
||||
}
|
||||
|
||||
func NewE2ETestSuite(cfg network.Config) *E2ETestSuite {
|
||||
return &E2ETestSuite{cfg: cfg}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) SetupSuite() {
|
||||
s.T().Log("setting up e2e test suite")
|
||||
|
||||
if testing.Short() {
|
||||
s.T().Skip("skipping test in unit-tests mode.")
|
||||
}
|
||||
|
||||
var err error
|
||||
s.network, err = network.New(s.T(), s.T().TempDir(), s.cfg)
|
||||
s.Require().NoError(err)
|
||||
|
||||
s.Require().NoError(s.network.WaitForNextBlock())
|
||||
|
||||
val := s.network.Validators[0]
|
||||
granter := val.Address
|
||||
grantee := s.network.Validators[1].Address
|
||||
|
||||
s.createGrant(granter, grantee)
|
||||
|
||||
grant, err := feegrant.NewGrant(granter, grantee, &feegrant.BasicAllowance{
|
||||
SpendLimit: sdk.NewCoins(sdk.NewCoin("stake", sdk.NewInt(100))),
|
||||
})
|
||||
s.Require().NoError(err)
|
||||
|
||||
s.addedGrant = grant
|
||||
s.addedGranter = granter
|
||||
s.addedGrantee = grantee
|
||||
}
|
||||
|
||||
// createGrant creates a new basic allowance fee grant from granter to grantee.
|
||||
func (s *E2ETestSuite) createGrant(granter, grantee sdk.Address) {
|
||||
val := s.network.Validators[0]
|
||||
|
||||
clientCtx := val.ClientCtx
|
||||
commonFlags := []string{
|
||||
fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync),
|
||||
fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(100))).String()),
|
||||
}
|
||||
|
||||
fee := sdk.NewCoin("stake", sdk.NewInt(100))
|
||||
|
||||
args := append(
|
||||
[]string{
|
||||
granter.String(),
|
||||
grantee.String(),
|
||||
fmt.Sprintf("--%s=%s", cli.FlagSpendLimit, fee.String()),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, granter),
|
||||
fmt.Sprintf("--%s=%s", cli.FlagExpiration, getFormattedExpiration(oneYear)),
|
||||
},
|
||||
commonFlags...,
|
||||
)
|
||||
|
||||
cmd := cli.NewCmdFeeGrant(codecaddress.NewBech32Codec("cosmos"))
|
||||
|
||||
_, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, args)
|
||||
s.Require().NoError(err)
|
||||
s.Require().NoError(s.network.WaitForNextBlock())
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TearDownSuite() {
|
||||
s.T().Log("tearing down e2e test suite")
|
||||
s.network.Cleanup()
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestCmdGetFeeGrant() {
|
||||
val := s.network.Validators[0]
|
||||
granter := val.Address
|
||||
grantee := s.addedGrantee
|
||||
clientCtx := val.ClientCtx
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
args []string
|
||||
expectErrMsg string
|
||||
expectErr bool
|
||||
respType *feegrant.Grant
|
||||
resp *feegrant.Grant
|
||||
}{
|
||||
{
|
||||
"wrong granter",
|
||||
[]string{
|
||||
"wrong_granter",
|
||||
grantee.String(),
|
||||
fmt.Sprintf("--%s=json", flags.FlagOutput),
|
||||
},
|
||||
"decoding bech32 failed",
|
||||
true, nil, nil,
|
||||
},
|
||||
{
|
||||
"wrong grantee",
|
||||
[]string{
|
||||
granter.String(),
|
||||
"wrong_grantee",
|
||||
fmt.Sprintf("--%s=json", flags.FlagOutput),
|
||||
},
|
||||
"decoding bech32 failed",
|
||||
true, nil, nil,
|
||||
},
|
||||
{
|
||||
"non existed grant",
|
||||
[]string{
|
||||
"cosmos1nph3cfzk6trsmfxkeu943nvach5qw4vwstnvkl",
|
||||
grantee.String(),
|
||||
fmt.Sprintf("--%s=json", flags.FlagOutput),
|
||||
},
|
||||
"fee-grant not found",
|
||||
true, nil, nil,
|
||||
},
|
||||
{
|
||||
"valid req",
|
||||
[]string{
|
||||
granter.String(),
|
||||
grantee.String(),
|
||||
fmt.Sprintf("--%s=json", flags.FlagOutput),
|
||||
},
|
||||
"",
|
||||
false,
|
||||
&feegrant.Grant{},
|
||||
&s.addedGrant,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
tc := tc
|
||||
|
||||
s.Run(tc.name, func() {
|
||||
cmd := cli.GetCmdQueryFeeGrant(codecaddress.NewBech32Codec("cosmos"))
|
||||
out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
|
||||
|
||||
if tc.expectErr {
|
||||
s.Require().Error(err)
|
||||
s.Require().Contains(err.Error(), tc.expectErrMsg)
|
||||
} else {
|
||||
s.Require().NoError(err)
|
||||
s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String())
|
||||
s.Require().Equal(tc.respType.Grantee, tc.respType.Grantee)
|
||||
s.Require().Equal(tc.respType.Granter, tc.respType.Granter)
|
||||
grant, err := tc.respType.GetGrant()
|
||||
s.Require().NoError(err)
|
||||
grant1, err1 := tc.resp.GetGrant()
|
||||
s.Require().NoError(err1)
|
||||
s.Require().Equal(
|
||||
grant.(*feegrant.BasicAllowance).SpendLimit,
|
||||
grant1.(*feegrant.BasicAllowance).SpendLimit,
|
||||
)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestCmdGetFeeGrantsByGrantee() {
|
||||
val := s.network.Validators[0]
|
||||
grantee := s.addedGrantee
|
||||
clientCtx := val.ClientCtx
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
args []string
|
||||
expectErr bool
|
||||
resp *feegrant.QueryAllowancesResponse
|
||||
expectLength int
|
||||
}{
|
||||
{
|
||||
"wrong grantee",
|
||||
[]string{
|
||||
"wrong_grantee",
|
||||
fmt.Sprintf("--%s=json", flags.FlagOutput),
|
||||
},
|
||||
true, nil, 0,
|
||||
},
|
||||
{
|
||||
"non existent grantee",
|
||||
[]string{
|
||||
"cosmos1nph3cfzk6trsmfxkeu943nvach5qw4vwstnvkl",
|
||||
fmt.Sprintf("--%s=json", flags.FlagOutput),
|
||||
},
|
||||
false, &feegrant.QueryAllowancesResponse{}, 0,
|
||||
},
|
||||
{
|
||||
"valid req",
|
||||
[]string{
|
||||
grantee.String(),
|
||||
fmt.Sprintf("--%s=json", flags.FlagOutput),
|
||||
},
|
||||
false, &feegrant.QueryAllowancesResponse{}, 1,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
tc := tc
|
||||
|
||||
s.Run(tc.name, func() {
|
||||
cmd := cli.GetCmdQueryFeeGrantsByGrantee(codecaddress.NewBech32Codec("cosmos"))
|
||||
out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
|
||||
|
||||
if tc.expectErr {
|
||||
s.Require().Error(err)
|
||||
} else {
|
||||
s.Require().NoError(err)
|
||||
s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.resp), out.String())
|
||||
|
||||
s.Require().Len(tc.resp.Allowances, tc.expectLength)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestCmdGetFeeGrantsByGranter() {
|
||||
val := s.network.Validators[0]
|
||||
granter := s.addedGranter
|
||||
clientCtx := val.ClientCtx
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
args []string
|
||||
expectErr bool
|
||||
resp *feegrant.QueryAllowancesByGranterResponse
|
||||
expectLength int
|
||||
}{
|
||||
{
|
||||
"wrong grantee",
|
||||
[]string{
|
||||
"wrong_grantee",
|
||||
fmt.Sprintf("--%s=json", flags.FlagOutput),
|
||||
},
|
||||
true, nil, 0,
|
||||
},
|
||||
{
|
||||
"non existent grantee",
|
||||
[]string{
|
||||
"cosmos1nph3cfzk6trsmfxkeu943nvach5qw4vwstnvkl",
|
||||
fmt.Sprintf("--%s=json", flags.FlagOutput),
|
||||
},
|
||||
false, &feegrant.QueryAllowancesByGranterResponse{}, 0,
|
||||
},
|
||||
{
|
||||
"valid req",
|
||||
[]string{
|
||||
granter.String(),
|
||||
fmt.Sprintf("--%s=json", flags.FlagOutput),
|
||||
},
|
||||
false, &feegrant.QueryAllowancesByGranterResponse{}, 1,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
tc := tc
|
||||
|
||||
s.Run(tc.name, func() {
|
||||
cmd := cli.GetCmdQueryFeeGrantsByGranter(codecaddress.NewBech32Codec("cosmos"))
|
||||
out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
|
||||
|
||||
if tc.expectErr {
|
||||
s.Require().Error(err)
|
||||
} else {
|
||||
s.Require().NoError(err)
|
||||
s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.resp), out.String())
|
||||
s.Require().Len(tc.resp.Allowances, tc.expectLength)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestNewCmdFeeGrant() {
|
||||
val := s.network.Validators[0]
|
||||
granter := val.Address
|
||||
alreadyExistedGrantee := s.addedGrantee
|
||||
clientCtx := val.ClientCtx
|
||||
|
||||
fromAddr, fromName, _, err := client.GetFromFields(clientCtx, clientCtx.Keyring, granter.String())
|
||||
s.Require().Equal(fromAddr, granter)
|
||||
s.Require().NoError(err)
|
||||
|
||||
commonFlags := []string{
|
||||
fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync),
|
||||
fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()),
|
||||
}
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
args []string
|
||||
expectErr bool
|
||||
expectedCode uint32
|
||||
respType proto.Message
|
||||
}{
|
||||
{
|
||||
"wrong granter address",
|
||||
append(
|
||||
[]string{
|
||||
"wrong_granter",
|
||||
"cosmos1nph3cfzk6trsmfxkeu943nvach5qw4vwstnvkl",
|
||||
fmt.Sprintf("--%s=%s", cli.FlagSpendLimit, "100stake"),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, granter),
|
||||
},
|
||||
commonFlags...,
|
||||
),
|
||||
true, 0, nil,
|
||||
},
|
||||
{
|
||||
"wrong grantee address",
|
||||
append(
|
||||
[]string{
|
||||
granter.String(),
|
||||
"wrong_grantee",
|
||||
fmt.Sprintf("--%s=%s", cli.FlagSpendLimit, "100stake"),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, granter),
|
||||
},
|
||||
commonFlags...,
|
||||
),
|
||||
true, 0, nil,
|
||||
},
|
||||
{
|
||||
"wrong granter key name",
|
||||
append(
|
||||
[]string{
|
||||
"invalid_granter",
|
||||
"cosmos16dun6ehcc86e03wreqqww89ey569wuj4em572w",
|
||||
fmt.Sprintf("--%s=%s", cli.FlagSpendLimit, "100stake"),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, granter),
|
||||
},
|
||||
commonFlags...,
|
||||
),
|
||||
true, 0, nil,
|
||||
},
|
||||
{
|
||||
"valid basic fee grant",
|
||||
append(
|
||||
[]string{
|
||||
granter.String(),
|
||||
"cosmos1nph3cfzk6trsmfxkeu943nvach5qw4vwstnvkl",
|
||||
fmt.Sprintf("--%s=%s", cli.FlagSpendLimit, "100stake"),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, granter),
|
||||
},
|
||||
commonFlags...,
|
||||
),
|
||||
false, 0, &sdk.TxResponse{},
|
||||
},
|
||||
{
|
||||
"valid basic fee grant with granter key name",
|
||||
append(
|
||||
[]string{
|
||||
fromName,
|
||||
"cosmos16dun6ehcc86e03wreqqww89ey569wuj4em572w",
|
||||
fmt.Sprintf("--%s=%s", cli.FlagSpendLimit, "100stake"),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, fromName),
|
||||
},
|
||||
commonFlags...,
|
||||
),
|
||||
false, 0, &sdk.TxResponse{},
|
||||
},
|
||||
{
|
||||
"valid basic fee grant with amino",
|
||||
append(
|
||||
[]string{
|
||||
granter.String(),
|
||||
"cosmos1v57fx2l2rt6ehujuu99u2fw05779m5e2ux4z2h",
|
||||
fmt.Sprintf("--%s=%s", cli.FlagSpendLimit, "100stake"),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, granter),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagSignMode, flags.SignModeLegacyAminoJSON),
|
||||
},
|
||||
commonFlags...,
|
||||
),
|
||||
false, 0, &sdk.TxResponse{},
|
||||
},
|
||||
{
|
||||
"valid basic fee grant without spend limit",
|
||||
append(
|
||||
[]string{
|
||||
granter.String(),
|
||||
"cosmos17h5lzptx3ghvsuhk7wx4c4hnl7rsswxjer97em",
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, granter),
|
||||
},
|
||||
commonFlags...,
|
||||
),
|
||||
false, 0, &sdk.TxResponse{},
|
||||
},
|
||||
{
|
||||
"valid basic fee grant without expiration",
|
||||
append(
|
||||
[]string{
|
||||
granter.String(),
|
||||
"cosmos16dlc38dcqt0uralyd8hksxyrny6kaeqfjvjwp5",
|
||||
fmt.Sprintf("--%s=%s", cli.FlagSpendLimit, "100stake"),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, granter),
|
||||
},
|
||||
commonFlags...,
|
||||
),
|
||||
false, 0, &sdk.TxResponse{},
|
||||
},
|
||||
{
|
||||
"valid basic fee grant without spend-limit and expiration",
|
||||
append(
|
||||
[]string{
|
||||
granter.String(),
|
||||
"cosmos1ku40qup9vwag4wtf8cls9mkszxfthaklxkp3c8",
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, granter),
|
||||
},
|
||||
commonFlags...,
|
||||
),
|
||||
false, 0, &sdk.TxResponse{},
|
||||
},
|
||||
{
|
||||
"try to add existed grant",
|
||||
append(
|
||||
[]string{
|
||||
granter.String(),
|
||||
alreadyExistedGrantee.String(),
|
||||
fmt.Sprintf("--%s=%s", cli.FlagSpendLimit, "100stake"),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, granter),
|
||||
},
|
||||
commonFlags...,
|
||||
),
|
||||
false, 18, &sdk.TxResponse{},
|
||||
},
|
||||
{
|
||||
"invalid number of args(periodic fee grant)",
|
||||
append(
|
||||
[]string{
|
||||
granter.String(),
|
||||
"cosmos1nph3cfzk6trsmfxkeu943nvach5qw4vwstnvkl",
|
||||
fmt.Sprintf("--%s=%s", cli.FlagSpendLimit, "100stake"),
|
||||
fmt.Sprintf("--%s=%s", cli.FlagPeriodLimit, "10stake"),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, granter),
|
||||
fmt.Sprintf("--%s=%s", cli.FlagExpiration, getFormattedExpiration(tenHours)),
|
||||
},
|
||||
commonFlags...,
|
||||
),
|
||||
true, 0, nil,
|
||||
},
|
||||
{
|
||||
"period mentioned and period limit omitted, invalid periodic grant",
|
||||
append(
|
||||
[]string{
|
||||
granter.String(),
|
||||
"cosmos1nph3cfzk6trsmfxkeu943nvach5qw4vwstnvkl",
|
||||
fmt.Sprintf("--%s=%s", cli.FlagSpendLimit, "100stake"),
|
||||
fmt.Sprintf("--%s=%d", cli.FlagPeriod, tenHours),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, granter),
|
||||
fmt.Sprintf("--%s=%s", cli.FlagExpiration, getFormattedExpiration(oneHour)),
|
||||
},
|
||||
commonFlags...,
|
||||
),
|
||||
true, 0, nil,
|
||||
},
|
||||
{
|
||||
"period cannot be greater than the actual expiration(periodic fee grant)",
|
||||
append(
|
||||
[]string{
|
||||
granter.String(),
|
||||
"cosmos1nph3cfzk6trsmfxkeu943nvach5qw4vwstnvkl",
|
||||
fmt.Sprintf("--%s=%s", cli.FlagSpendLimit, "100stake"),
|
||||
fmt.Sprintf("--%s=%d", cli.FlagPeriod, tenHours),
|
||||
fmt.Sprintf("--%s=%s", cli.FlagPeriodLimit, "10stake"),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, granter),
|
||||
fmt.Sprintf("--%s=%s", cli.FlagExpiration, getFormattedExpiration(oneHour)),
|
||||
},
|
||||
commonFlags...,
|
||||
),
|
||||
true, 0, nil,
|
||||
},
|
||||
{
|
||||
"valid periodic fee grant",
|
||||
append(
|
||||
[]string{
|
||||
granter.String(),
|
||||
"cosmos1w55kgcf3ltaqdy4ww49nge3klxmrdavrr6frmp",
|
||||
fmt.Sprintf("--%s=%s", cli.FlagSpendLimit, "100stake"),
|
||||
fmt.Sprintf("--%s=%d", cli.FlagPeriod, oneHour),
|
||||
fmt.Sprintf("--%s=%s", cli.FlagPeriodLimit, "10stake"),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, granter),
|
||||
fmt.Sprintf("--%s=%s", cli.FlagExpiration, getFormattedExpiration(tenHours)),
|
||||
},
|
||||
commonFlags...,
|
||||
),
|
||||
false, 0, &sdk.TxResponse{},
|
||||
},
|
||||
{
|
||||
"valid periodic fee grant without spend-limit",
|
||||
append(
|
||||
[]string{
|
||||
granter.String(),
|
||||
"cosmos1vevyks8pthkscvgazc97qyfjt40m6g9xe85ry8",
|
||||
fmt.Sprintf("--%s=%d", cli.FlagPeriod, oneHour),
|
||||
fmt.Sprintf("--%s=%s", cli.FlagPeriodLimit, "10stake"),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, granter),
|
||||
fmt.Sprintf("--%s=%s", cli.FlagExpiration, getFormattedExpiration(tenHours)),
|
||||
},
|
||||
commonFlags...,
|
||||
),
|
||||
false, 0, &sdk.TxResponse{},
|
||||
},
|
||||
{
|
||||
"valid periodic fee grant without expiration",
|
||||
append(
|
||||
[]string{
|
||||
granter.String(),
|
||||
"cosmos14cm33pvnrv2497tyt8sp9yavhmw83nwej3m0e8",
|
||||
fmt.Sprintf("--%s=%s", cli.FlagSpendLimit, "100stake"),
|
||||
fmt.Sprintf("--%s=%d", cli.FlagPeriod, oneHour),
|
||||
fmt.Sprintf("--%s=%s", cli.FlagPeriodLimit, "10stake"),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, granter),
|
||||
},
|
||||
commonFlags...,
|
||||
),
|
||||
false, 0, &sdk.TxResponse{},
|
||||
},
|
||||
{
|
||||
"valid periodic fee grant without spend-limit and expiration",
|
||||
append(
|
||||
[]string{
|
||||
granter.String(),
|
||||
"cosmos12nyk4pcf4arshznkpz882e4l4ts0lt0ap8ce54",
|
||||
fmt.Sprintf("--%s=%d", cli.FlagPeriod, oneHour),
|
||||
fmt.Sprintf("--%s=%s", cli.FlagPeriodLimit, "10stake"),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, granter),
|
||||
},
|
||||
commonFlags...,
|
||||
),
|
||||
false, 0, &sdk.TxResponse{},
|
||||
},
|
||||
{
|
||||
"invalid expiration",
|
||||
append(
|
||||
[]string{
|
||||
granter.String(),
|
||||
"cosmos1vevyks8pthkscvgazc97qyfjt40m6g9xe85ry8",
|
||||
fmt.Sprintf("--%s=%d", cli.FlagPeriod, oneHour),
|
||||
fmt.Sprintf("--%s=%s", cli.FlagPeriodLimit, "10stake"),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, granter),
|
||||
fmt.Sprintf("--%s=%s", cli.FlagExpiration, "invalid"),
|
||||
},
|
||||
commonFlags...,
|
||||
),
|
||||
true, 0, nil,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
tc := tc
|
||||
|
||||
s.Run(tc.name, func() {
|
||||
cmd := cli.NewCmdFeeGrant(codecaddress.NewBech32Codec("cosmos"))
|
||||
out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
|
||||
|
||||
if tc.expectErr {
|
||||
s.Require().Error(err)
|
||||
} else {
|
||||
s.Require().NoError(err)
|
||||
s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String())
|
||||
|
||||
txResp := tc.respType.(*sdk.TxResponse)
|
||||
s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, txResp.TxHash, tc.expectedCode))
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestNewCmdRevokeFeegrant() {
|
||||
val := s.network.Validators[0]
|
||||
granter := s.addedGranter
|
||||
grantee := s.addedGrantee
|
||||
clientCtx := val.ClientCtx
|
||||
|
||||
commonFlags := []string{
|
||||
fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync),
|
||||
fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()),
|
||||
}
|
||||
|
||||
address := "cosmos16ydaqh0fcnh4qt7a3jme4mmztm2qel5axcpw00"
|
||||
// Create new fee grant specifically to test amino.
|
||||
aminoGrantee, err := codecaddress.NewBech32Codec("cosmos").StringToBytes(address)
|
||||
s.Require().NoError(err)
|
||||
s.createGrant(granter, sdk.AccAddress(aminoGrantee))
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
args []string
|
||||
expectErr bool
|
||||
expectedCode uint32
|
||||
respType proto.Message
|
||||
}{
|
||||
{
|
||||
"invalid grantee",
|
||||
append(
|
||||
[]string{
|
||||
"wrong_granter",
|
||||
grantee.String(),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, granter),
|
||||
},
|
||||
commonFlags...,
|
||||
),
|
||||
true, 0, nil,
|
||||
},
|
||||
{
|
||||
"invalid grantee",
|
||||
append(
|
||||
[]string{
|
||||
granter.String(),
|
||||
"wrong_grantee",
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, granter),
|
||||
},
|
||||
commonFlags...,
|
||||
),
|
||||
true, 0, nil,
|
||||
},
|
||||
{
|
||||
"Non existed grant",
|
||||
append(
|
||||
[]string{
|
||||
granter.String(),
|
||||
"cosmos1aeuqja06474dfrj7uqsvukm6rael982kk89mqr",
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, granter),
|
||||
},
|
||||
commonFlags...,
|
||||
),
|
||||
false, 38, &sdk.TxResponse{},
|
||||
},
|
||||
{
|
||||
"Valid revoke",
|
||||
append(
|
||||
[]string{
|
||||
granter.String(),
|
||||
grantee.String(),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, granter),
|
||||
},
|
||||
commonFlags...,
|
||||
),
|
||||
false, 0, &sdk.TxResponse{},
|
||||
},
|
||||
{
|
||||
"Valid revoke with amino",
|
||||
append(
|
||||
[]string{
|
||||
granter.String(),
|
||||
address,
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, granter),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagSignMode, flags.SignModeLegacyAminoJSON),
|
||||
},
|
||||
commonFlags...,
|
||||
),
|
||||
false, 0, &sdk.TxResponse{},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
tc := tc
|
||||
|
||||
s.Run(tc.name, func() {
|
||||
cmd := cli.NewCmdRevokeFeegrant(codecaddress.NewBech32Codec("cosmos"))
|
||||
out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
|
||||
|
||||
if tc.expectErr {
|
||||
s.Require().Error(err)
|
||||
} else {
|
||||
s.Require().NoError(err)
|
||||
s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String())
|
||||
|
||||
txResp := tc.respType.(*sdk.TxResponse)
|
||||
s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, txResp.TxHash, tc.expectedCode))
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestTxWithFeeGrant() {
|
||||
s.T().Skip() // TODO to re-enable in #12274
|
||||
|
||||
val := s.network.Validators[0]
|
||||
clientCtx := val.ClientCtx
|
||||
granter := val.Address
|
||||
|
||||
// creating an account manually (This account won't be exist in state)
|
||||
k, _, err := val.ClientCtx.Keyring.NewMnemonic("grantee", keyring.English, sdk.FullFundraiserPath, keyring.DefaultBIP39Passphrase, hd.Secp256k1)
|
||||
s.Require().NoError(err)
|
||||
pub, err := k.GetPubKey()
|
||||
s.Require().NoError(err)
|
||||
grantee := sdk.AccAddress(pub.Address())
|
||||
|
||||
commonFlags := []string{
|
||||
fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync),
|
||||
fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()),
|
||||
}
|
||||
|
||||
fee := sdk.NewCoin("stake", sdk.NewInt(100))
|
||||
|
||||
args := append(
|
||||
[]string{
|
||||
granter.String(),
|
||||
grantee.String(),
|
||||
fmt.Sprintf("--%s=%s", cli.FlagSpendLimit, fee.String()),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, granter),
|
||||
fmt.Sprintf("--%s=%s", cli.FlagExpiration, getFormattedExpiration(oneYear)),
|
||||
},
|
||||
commonFlags...,
|
||||
)
|
||||
|
||||
cmd := cli.NewCmdFeeGrant(codecaddress.NewBech32Codec("cosmos"))
|
||||
|
||||
_, err = clitestutil.ExecTestCLICmd(clientCtx, cmd, args)
|
||||
s.Require().NoError(err)
|
||||
s.Require().NoError(s.network.WaitForNextBlock())
|
||||
|
||||
testcases := []struct {
|
||||
name string
|
||||
from string
|
||||
flags []string
|
||||
expErrCode uint32
|
||||
}{
|
||||
{
|
||||
name: "granted fee allowance for an account which is not in state and creating any tx with it by using --fee-granter shouldn't fail",
|
||||
from: grantee.String(),
|
||||
flags: []string{fmt.Sprintf("--%s=%s", flags.FlagFeeGranter, granter.String())},
|
||||
},
|
||||
{
|
||||
name: "--fee-payer should also sign the tx (direct)",
|
||||
from: grantee.String(),
|
||||
flags: []string{fmt.Sprintf("--%s=%s", flags.FlagFeePayer, granter.String())},
|
||||
expErrCode: 4,
|
||||
},
|
||||
{
|
||||
name: "--fee-payer should also sign the tx (amino-json)",
|
||||
from: grantee.String(),
|
||||
flags: []string{
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFeePayer, granter.String()),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagSignMode, flags.SignModeLegacyAminoJSON),
|
||||
},
|
||||
expErrCode: 4,
|
||||
},
|
||||
{
|
||||
name: "use --fee-payer and --fee-granter together works",
|
||||
from: grantee.String(),
|
||||
flags: []string{
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFeePayer, grantee.String()),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFeeGranter, granter.String()),
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testcases {
|
||||
s.Run(tc.name, func() {
|
||||
out, err := govtestutil.MsgSubmitLegacyProposal(val.ClientCtx, tc.from,
|
||||
"Text Proposal", "No desc", govv1beta1.ProposalTypeText,
|
||||
tc.flags...,
|
||||
)
|
||||
s.Require().NoError(err)
|
||||
|
||||
var resp sdk.TxResponse
|
||||
s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), &resp), out.String())
|
||||
s.Require().Equal(tc.expErrCode, resp.Code, resp)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestFilteredFeeAllowance() {
|
||||
s.T().Skip() // TODO to re-enable in #12274
|
||||
|
||||
val := s.network.Validators[0]
|
||||
|
||||
granter := val.Address
|
||||
k, _, err := val.ClientCtx.Keyring.NewMnemonic("grantee1", keyring.English, sdk.FullFundraiserPath, keyring.DefaultBIP39Passphrase, hd.Secp256k1)
|
||||
s.Require().NoError(err)
|
||||
pub, err := k.GetPubKey()
|
||||
s.Require().NoError(err)
|
||||
grantee := sdk.AccAddress(pub.Address())
|
||||
|
||||
clientCtx := val.ClientCtx
|
||||
|
||||
commonFlags := []string{
|
||||
fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync),
|
||||
fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(100))).String()),
|
||||
}
|
||||
spendLimit := sdk.NewCoin("stake", sdk.NewInt(1000))
|
||||
|
||||
allowMsgs := strings.Join([]string{sdk.MsgTypeURL(&govv1beta1.MsgSubmitProposal{}), sdk.MsgTypeURL(&govv1.MsgVoteWeighted{})}, ",")
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
args []string
|
||||
expectErr bool
|
||||
respType proto.Message
|
||||
expectedCode uint32
|
||||
}{
|
||||
{
|
||||
"invalid granter address",
|
||||
append(
|
||||
[]string{
|
||||
"not an address",
|
||||
"cosmos1nph3cfzk6trsmfxkeu943nvach5qw4vwstnvkl",
|
||||
fmt.Sprintf("--%s=%s", cli.FlagAllowedMsgs, allowMsgs),
|
||||
fmt.Sprintf("--%s=%s", cli.FlagSpendLimit, spendLimit.String()),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, granter),
|
||||
},
|
||||
commonFlags...,
|
||||
),
|
||||
true, &sdk.TxResponse{}, 0,
|
||||
},
|
||||
{
|
||||
"invalid grantee address",
|
||||
append(
|
||||
[]string{
|
||||
granter.String(),
|
||||
"not an address",
|
||||
fmt.Sprintf("--%s=%s", cli.FlagAllowedMsgs, allowMsgs),
|
||||
fmt.Sprintf("--%s=%s", cli.FlagSpendLimit, spendLimit.String()),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, granter),
|
||||
},
|
||||
commonFlags...,
|
||||
),
|
||||
true, &sdk.TxResponse{}, 0,
|
||||
},
|
||||
{
|
||||
"valid filter fee grant",
|
||||
append(
|
||||
[]string{
|
||||
granter.String(),
|
||||
grantee.String(),
|
||||
fmt.Sprintf("--%s=%s", cli.FlagAllowedMsgs, allowMsgs),
|
||||
fmt.Sprintf("--%s=%s", cli.FlagSpendLimit, spendLimit.String()),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, granter),
|
||||
},
|
||||
commonFlags...,
|
||||
),
|
||||
false, &sdk.TxResponse{}, 0,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
tc := tc
|
||||
|
||||
s.Run(tc.name, func() {
|
||||
cmd := cli.NewCmdFeeGrant(codecaddress.NewBech32Codec("cosmos"))
|
||||
out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
|
||||
|
||||
if tc.expectErr {
|
||||
s.Require().Error(err)
|
||||
} else {
|
||||
s.Require().NoError(err)
|
||||
s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String())
|
||||
|
||||
txResp := tc.respType.(*sdk.TxResponse)
|
||||
s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, txResp.TxHash, tc.expectedCode))
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
args := []string{
|
||||
granter.String(),
|
||||
grantee.String(),
|
||||
fmt.Sprintf("--%s=json", flags.FlagOutput),
|
||||
}
|
||||
|
||||
// get filtered fee allowance and check info
|
||||
cmd := cli.GetCmdQueryFeeGrant(codecaddress.NewBech32Codec("cosmos"))
|
||||
out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, args)
|
||||
s.Require().NoError(err)
|
||||
|
||||
resp := &feegrant.Grant{}
|
||||
|
||||
s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), resp), out.String())
|
||||
s.Require().Equal(resp.Grantee, resp.Grantee)
|
||||
s.Require().Equal(resp.Granter, resp.Granter)
|
||||
|
||||
grant, err := resp.GetGrant()
|
||||
s.Require().NoError(err)
|
||||
|
||||
filteredFeeGrant, err := grant.(*feegrant.AllowedMsgAllowance).GetAllowance()
|
||||
s.Require().NoError(err)
|
||||
|
||||
s.Require().Equal(
|
||||
filteredFeeGrant.(*feegrant.BasicAllowance).SpendLimit.String(),
|
||||
spendLimit.String(),
|
||||
)
|
||||
|
||||
// exec filtered fee allowance
|
||||
cases := []struct {
|
||||
name string
|
||||
malleate func() (testutil.BufferWriter, error)
|
||||
respType proto.Message
|
||||
expectedCode uint32
|
||||
}{
|
||||
{
|
||||
"valid proposal tx",
|
||||
func() (testutil.BufferWriter, error) {
|
||||
return govtestutil.MsgSubmitLegacyProposal(val.ClientCtx, grantee.String(),
|
||||
"Text Proposal", "No desc", govv1beta1.ProposalTypeText,
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFeeGranter, granter.String()),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(100))).String()),
|
||||
)
|
||||
},
|
||||
&sdk.TxResponse{},
|
||||
0,
|
||||
},
|
||||
{
|
||||
"valid weighted_vote tx",
|
||||
func() (testutil.BufferWriter, error) {
|
||||
return govtestutil.MsgVote(val.ClientCtx, grantee.String(), "0", "yes",
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFeeGranter, granter.String()),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(100))).String()),
|
||||
)
|
||||
},
|
||||
&sdk.TxResponse{},
|
||||
2,
|
||||
},
|
||||
{
|
||||
"should fail with unauthorized msgs",
|
||||
func() (testutil.BufferWriter, error) {
|
||||
args := append(
|
||||
[]string{
|
||||
grantee.String(),
|
||||
"cosmos14cm33pvnrv2497tyt8sp9yavhmw83nwej3m0e8",
|
||||
fmt.Sprintf("--%s=%s", cli.FlagSpendLimit, "100stake"),
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFeeGranter, granter),
|
||||
},
|
||||
commonFlags...,
|
||||
)
|
||||
cmd := cli.NewCmdFeeGrant(codecaddress.NewBech32Codec("cosmos"))
|
||||
return clitestutil.ExecTestCLICmd(clientCtx, cmd, args)
|
||||
},
|
||||
&sdk.TxResponse{},
|
||||
7,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
tc := tc
|
||||
|
||||
s.Run(tc.name, func() {
|
||||
out, err := tc.malleate()
|
||||
s.Require().NoError(err)
|
||||
s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String())
|
||||
txResp := tc.respType.(*sdk.TxResponse)
|
||||
s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, txResp.TxHash, tc.expectedCode))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func getFormattedExpiration(duration int64) string {
|
||||
return time.Now().Add(time.Duration(duration) * time.Second).Format(time.RFC3339)
|
||||
}
|
||||
@ -2,842 +2,14 @@ package group
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/client/flags"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keys/ed25519"
|
||||
clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
"github.com/cosmos/cosmos-sdk/x/group"
|
||||
client "github.com/cosmos/cosmos-sdk/x/group/client/cli"
|
||||
)
|
||||
|
||||
func (s *E2ETestSuite) TestQueryGroupInfo() {
|
||||
val := s.network.Validators[0]
|
||||
clientCtx := val.ClientCtx
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
args []string
|
||||
expectErr bool
|
||||
expectErrMsg string
|
||||
}{
|
||||
{
|
||||
"group not found",
|
||||
[]string{"12345", fmt.Sprintf("--%s=json", flags.FlagOutput)},
|
||||
true,
|
||||
"group: not found",
|
||||
},
|
||||
{
|
||||
"group id invalid",
|
||||
[]string{"", fmt.Sprintf("--%s=json", flags.FlagOutput)},
|
||||
true,
|
||||
"strconv.ParseUint: parsing \"\": invalid syntax",
|
||||
},
|
||||
{
|
||||
"group found",
|
||||
[]string{strconv.FormatUint(s.group.Id, 10), fmt.Sprintf("--%s=json", flags.FlagOutput)},
|
||||
false,
|
||||
"",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
tc := tc
|
||||
|
||||
s.Run(tc.name, func() {
|
||||
cmd := client.QueryGroupInfoCmd()
|
||||
|
||||
out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
|
||||
if tc.expectErr {
|
||||
s.Require().Contains(out.String(), tc.expectErrMsg)
|
||||
} else {
|
||||
s.Require().NoError(err, out.String())
|
||||
|
||||
var g group.GroupInfo
|
||||
s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), &g))
|
||||
s.Require().Equal(s.group.Id, g.Id)
|
||||
s.Require().Equal(s.group.Admin, g.Admin)
|
||||
s.Require().Equal(s.group.TotalWeight, g.TotalWeight)
|
||||
s.Require().Equal(s.group.Metadata, g.Metadata)
|
||||
s.Require().Equal(s.group.Version, g.Version)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestQueryGroupsByMembers() {
|
||||
val := s.network.Validators[0]
|
||||
clientCtx := val.ClientCtx
|
||||
require := s.Require()
|
||||
|
||||
cmd := client.QueryGroupsByAdminCmd()
|
||||
out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, []string{val.Address.String(), fmt.Sprintf("--%s=json", flags.FlagOutput)})
|
||||
require.NoError(err)
|
||||
|
||||
var groups group.QueryGroupsByAdminResponse
|
||||
val.ClientCtx.Codec.MustUnmarshalJSON(out.Bytes(), &groups)
|
||||
require.Len(groups.Groups, 1)
|
||||
|
||||
cmd = client.QueryGroupMembersCmd()
|
||||
out, err = clitestutil.ExecTestCLICmd(clientCtx, cmd, []string{fmt.Sprintf("%d", groups.Groups[0].Id), fmt.Sprintf("--%s=json", flags.FlagOutput)})
|
||||
require.NoError(err)
|
||||
|
||||
var members group.QueryGroupMembersResponse
|
||||
val.ClientCtx.Codec.MustUnmarshalJSON(out.Bytes(), &members)
|
||||
require.Len(members.Members, 1)
|
||||
|
||||
testAddr := sdk.AccAddress(ed25519.GenPrivKey().PubKey().Address())
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
args []string
|
||||
expectErr bool
|
||||
expectErrMsg string
|
||||
numItems int
|
||||
expectGroups []*group.GroupInfo
|
||||
}{
|
||||
{
|
||||
"invalid address",
|
||||
[]string{"abcd", fmt.Sprintf("--%s=json", flags.FlagOutput)},
|
||||
true,
|
||||
"invalid bech32 string",
|
||||
0,
|
||||
[]*group.GroupInfo{},
|
||||
},
|
||||
{
|
||||
"not part of any group",
|
||||
[]string{testAddr.String(), fmt.Sprintf("--%s=json", flags.FlagOutput)},
|
||||
false,
|
||||
"",
|
||||
0,
|
||||
[]*group.GroupInfo{},
|
||||
},
|
||||
{
|
||||
"expect one group (request with pagination)",
|
||||
[]string{
|
||||
members.Members[0].Member.Address,
|
||||
fmt.Sprintf("--%s=json", flags.FlagOutput),
|
||||
"--limit=1",
|
||||
},
|
||||
false,
|
||||
"",
|
||||
1,
|
||||
groups.Groups,
|
||||
},
|
||||
{
|
||||
"expect one group",
|
||||
[]string{
|
||||
members.Members[0].Member.Address,
|
||||
fmt.Sprintf("--%s=json", flags.FlagOutput),
|
||||
},
|
||||
false,
|
||||
"",
|
||||
1,
|
||||
groups.Groups,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
tc := tc
|
||||
s.Run(tc.name, func() {
|
||||
cmd := client.QueryGroupsByMemberCmd()
|
||||
out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
|
||||
if tc.expectErr {
|
||||
require.Contains(out.String(), tc.expectErrMsg)
|
||||
} else {
|
||||
require.NoError(err, out.String())
|
||||
|
||||
var resp group.QueryGroupsByMemberResponse
|
||||
val.ClientCtx.Codec.MustUnmarshalJSON(out.Bytes(), &resp)
|
||||
require.Len(resp.Groups, tc.numItems)
|
||||
|
||||
require.Equal(tc.expectGroups, resp.Groups)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestQueryGroupMembers() {
|
||||
val := s.network.Validators[0]
|
||||
clientCtx := val.ClientCtx
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
args []string
|
||||
expectErr bool
|
||||
expectErrMsg string
|
||||
expectMembers []*group.GroupMember
|
||||
}{
|
||||
{
|
||||
"no group",
|
||||
[]string{"12345", fmt.Sprintf("--%s=json", flags.FlagOutput)},
|
||||
false,
|
||||
"",
|
||||
[]*group.GroupMember{},
|
||||
},
|
||||
{
|
||||
"members found",
|
||||
[]string{strconv.FormatUint(s.group.Id, 10), fmt.Sprintf("--%s=json", flags.FlagOutput)},
|
||||
false,
|
||||
"",
|
||||
[]*group.GroupMember{
|
||||
{
|
||||
GroupId: s.group.Id,
|
||||
Member: &group.Member{
|
||||
Address: val.Address.String(),
|
||||
Weight: "3",
|
||||
Metadata: validMetadata,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
"members found (request with pagination)",
|
||||
[]string{
|
||||
strconv.FormatUint(s.group.Id, 10),
|
||||
fmt.Sprintf("--%s=json", flags.FlagOutput),
|
||||
"--limit=1",
|
||||
},
|
||||
false,
|
||||
"",
|
||||
[]*group.GroupMember{
|
||||
{
|
||||
GroupId: s.group.Id,
|
||||
Member: &group.Member{
|
||||
Address: val.Address.String(),
|
||||
Weight: "3",
|
||||
Metadata: validMetadata,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
tc := tc
|
||||
|
||||
s.Run(tc.name, func() {
|
||||
cmd := client.QueryGroupMembersCmd()
|
||||
|
||||
out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
|
||||
if tc.expectErr {
|
||||
s.Require().Contains(out.String(), tc.expectErrMsg)
|
||||
} else {
|
||||
s.Require().NoError(err, out.String())
|
||||
|
||||
var res group.QueryGroupMembersResponse
|
||||
s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), &res))
|
||||
s.Require().Equal(len(res.Members), len(tc.expectMembers))
|
||||
for i := range res.Members {
|
||||
s.Require().Equal(res.Members[i].GroupId, tc.expectMembers[i].GroupId)
|
||||
s.Require().Equal(res.Members[i].Member.Address, tc.expectMembers[i].Member.Address)
|
||||
s.Require().Equal(res.Members[i].Member.Metadata, tc.expectMembers[i].Member.Metadata)
|
||||
s.Require().Equal(res.Members[i].Member.Weight, tc.expectMembers[i].Member.Weight)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestQueryGroupsByAdmin() {
|
||||
val := s.network.Validators[0]
|
||||
clientCtx := val.ClientCtx
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
args []string
|
||||
expectErr bool
|
||||
expectErrMsg string
|
||||
expectGroups []*group.GroupInfo
|
||||
}{
|
||||
{
|
||||
"invalid admin address",
|
||||
[]string{"invalid"},
|
||||
true,
|
||||
"decoding bech32 failed: invalid bech32 string",
|
||||
[]*group.GroupInfo{},
|
||||
},
|
||||
{
|
||||
"no group",
|
||||
[]string{"cosmos139f7kncmglres2nf3h4hc4tade85ekfr8sulz5", fmt.Sprintf("--%s=json", flags.FlagOutput)},
|
||||
false,
|
||||
"",
|
||||
[]*group.GroupInfo{},
|
||||
},
|
||||
{
|
||||
"found groups",
|
||||
[]string{val.Address.String(), fmt.Sprintf("--%s=json", flags.FlagOutput)},
|
||||
false,
|
||||
"",
|
||||
[]*group.GroupInfo{
|
||||
s.group,
|
||||
},
|
||||
},
|
||||
{
|
||||
"found groups (request with pagination)",
|
||||
[]string{
|
||||
val.Address.String(),
|
||||
fmt.Sprintf("--%s=json", flags.FlagOutput),
|
||||
"--limit=2",
|
||||
},
|
||||
false,
|
||||
"",
|
||||
[]*group.GroupInfo{
|
||||
s.group,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
tc := tc
|
||||
|
||||
s.Run(tc.name, func() {
|
||||
cmd := client.QueryGroupsByAdminCmd()
|
||||
|
||||
out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
|
||||
if tc.expectErr {
|
||||
s.Require().Contains(out.String(), tc.expectErrMsg)
|
||||
} else {
|
||||
s.Require().NoError(err, out.String())
|
||||
|
||||
var res group.QueryGroupsByAdminResponse
|
||||
s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), &res))
|
||||
s.Require().Equal(len(res.Groups), len(tc.expectGroups))
|
||||
for i := range res.Groups {
|
||||
s.Require().Equal(res.Groups[i].Id, tc.expectGroups[i].Id)
|
||||
s.Require().Equal(res.Groups[i].Metadata, tc.expectGroups[i].Metadata)
|
||||
s.Require().Equal(res.Groups[i].Version, tc.expectGroups[i].Version)
|
||||
s.Require().Equal(res.Groups[i].TotalWeight, tc.expectGroups[i].TotalWeight)
|
||||
s.Require().Equal(res.Groups[i].Admin, tc.expectGroups[i].Admin)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestQueryGroupPolicyInfo() {
|
||||
val := s.network.Validators[0]
|
||||
clientCtx := val.ClientCtx
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
args []string
|
||||
expectErr bool
|
||||
expectErrMsg string
|
||||
}{
|
||||
{
|
||||
"group policy not found",
|
||||
[]string{val.Address.String(), fmt.Sprintf("--%s=json", flags.FlagOutput)},
|
||||
true,
|
||||
"not found",
|
||||
},
|
||||
{
|
||||
"group policy found",
|
||||
[]string{s.groupPolicies[0].Address, fmt.Sprintf("--%s=json", flags.FlagOutput)},
|
||||
false,
|
||||
"",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
tc := tc
|
||||
|
||||
s.Run(tc.name, func() {
|
||||
cmd := client.QueryGroupPolicyInfoCmd()
|
||||
|
||||
out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
|
||||
if tc.expectErr {
|
||||
s.Require().Contains(out.String(), tc.expectErrMsg)
|
||||
} else {
|
||||
s.Require().NoError(err, out.String())
|
||||
|
||||
var g group.GroupPolicyInfo
|
||||
s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), &g))
|
||||
s.Require().Equal(s.groupPolicies[0].GroupId, g.GroupId)
|
||||
s.Require().Equal(s.groupPolicies[0].Address, g.Address)
|
||||
s.Require().Equal(s.groupPolicies[0].Admin, g.Admin)
|
||||
s.Require().Equal(s.groupPolicies[0].Metadata, g.Metadata)
|
||||
s.Require().Equal(s.groupPolicies[0].Version, g.Version)
|
||||
dp1, err := s.groupPolicies[0].GetDecisionPolicy()
|
||||
s.Require().NoError(err)
|
||||
dp2, err := g.GetDecisionPolicy()
|
||||
s.Require().NoError(err)
|
||||
s.Require().Equal(dp1, dp2)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestQueryGroupPoliciesByGroup() {
|
||||
val := s.network.Validators[0]
|
||||
clientCtx := val.ClientCtx
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
args []string
|
||||
expectErr bool
|
||||
expectErrMsg string
|
||||
expectGroupPolicies []*group.GroupPolicyInfo
|
||||
}{
|
||||
{
|
||||
"invalid group id",
|
||||
[]string{""},
|
||||
true,
|
||||
"strconv.ParseUint: parsing \"\": invalid syntax",
|
||||
[]*group.GroupPolicyInfo{},
|
||||
},
|
||||
{
|
||||
"no group policy",
|
||||
[]string{"12345", fmt.Sprintf("--%s=json", flags.FlagOutput)},
|
||||
false,
|
||||
"",
|
||||
[]*group.GroupPolicyInfo{},
|
||||
},
|
||||
{
|
||||
"found group policies",
|
||||
[]string{strconv.FormatUint(s.group.Id, 10), fmt.Sprintf("--%s=json", flags.FlagOutput)},
|
||||
false,
|
||||
"",
|
||||
[]*group.GroupPolicyInfo{
|
||||
s.groupPolicies[0],
|
||||
s.groupPolicies[1],
|
||||
s.groupPolicies[2],
|
||||
s.groupPolicies[3],
|
||||
s.groupPolicies[4],
|
||||
s.groupPolicies[5],
|
||||
},
|
||||
},
|
||||
{
|
||||
"found group policies (request with pagination)",
|
||||
[]string{
|
||||
strconv.FormatUint(s.group.Id, 10),
|
||||
fmt.Sprintf("--%s=json", flags.FlagOutput),
|
||||
"--limit=2",
|
||||
},
|
||||
false,
|
||||
"",
|
||||
[]*group.GroupPolicyInfo{
|
||||
s.groupPolicies[0],
|
||||
s.groupPolicies[1],
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
tc := tc
|
||||
|
||||
s.Run(tc.name, func() {
|
||||
cmd := client.QueryGroupPoliciesByGroupCmd()
|
||||
|
||||
out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
|
||||
if tc.expectErr {
|
||||
s.Require().Contains(out.String(), tc.expectErrMsg)
|
||||
} else {
|
||||
s.Require().NoError(err, out.String())
|
||||
|
||||
var res group.QueryGroupPoliciesByGroupResponse
|
||||
s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), &res))
|
||||
s.Require().Equal(len(res.GroupPolicies), len(tc.expectGroupPolicies))
|
||||
for i := range res.GroupPolicies {
|
||||
s.Require().Equal(res.GroupPolicies[i].GroupId, tc.expectGroupPolicies[i].GroupId)
|
||||
s.Require().Equal(res.GroupPolicies[i].Metadata, tc.expectGroupPolicies[i].Metadata)
|
||||
s.Require().Equal(res.GroupPolicies[i].Version, tc.expectGroupPolicies[i].Version)
|
||||
s.Require().Equal(res.GroupPolicies[i].Admin, tc.expectGroupPolicies[i].Admin)
|
||||
dp1, err := s.groupPolicies[i].GetDecisionPolicy()
|
||||
s.Require().NoError(err)
|
||||
dp2, err := tc.expectGroupPolicies[i].GetDecisionPolicy()
|
||||
s.Require().NoError(err)
|
||||
s.Require().Equal(dp1, dp2)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestQueryGroupPoliciesByAdmin() {
|
||||
val := s.network.Validators[0]
|
||||
clientCtx := val.ClientCtx
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
args []string
|
||||
expectErr bool
|
||||
expectErrMsg string
|
||||
expectGroupPolicies []*group.GroupPolicyInfo
|
||||
}{
|
||||
{
|
||||
"invalid admin address",
|
||||
[]string{"invalid"},
|
||||
true,
|
||||
"decoding bech32 failed: invalid bech32 string",
|
||||
[]*group.GroupPolicyInfo{},
|
||||
},
|
||||
{
|
||||
"no group policy",
|
||||
[]string{"cosmos139f7kncmglres2nf3h4hc4tade85ekfr8sulz5", fmt.Sprintf("--%s=json", flags.FlagOutput)},
|
||||
false,
|
||||
"",
|
||||
[]*group.GroupPolicyInfo{},
|
||||
},
|
||||
{
|
||||
"found group policies",
|
||||
[]string{val.Address.String(), fmt.Sprintf("--%s=json", flags.FlagOutput)},
|
||||
false,
|
||||
"",
|
||||
[]*group.GroupPolicyInfo{
|
||||
s.groupPolicies[0],
|
||||
s.groupPolicies[1],
|
||||
s.groupPolicies[2],
|
||||
s.groupPolicies[3],
|
||||
s.groupPolicies[4],
|
||||
s.groupPolicies[5],
|
||||
},
|
||||
},
|
||||
{
|
||||
"found group policies (request with pagination)",
|
||||
[]string{
|
||||
val.Address.String(),
|
||||
fmt.Sprintf("--%s=json", flags.FlagOutput),
|
||||
"--limit=2",
|
||||
},
|
||||
false,
|
||||
"",
|
||||
|
||||
[]*group.GroupPolicyInfo{
|
||||
s.groupPolicies[0],
|
||||
s.groupPolicies[1],
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
tc := tc
|
||||
|
||||
s.Run(tc.name, func() {
|
||||
cmd := client.QueryGroupPoliciesByAdminCmd()
|
||||
|
||||
out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
|
||||
if tc.expectErr {
|
||||
s.Require().Contains(out.String(), tc.expectErrMsg)
|
||||
} else {
|
||||
s.Require().NoError(err, out.String())
|
||||
|
||||
var res group.QueryGroupPoliciesByAdminResponse
|
||||
s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), &res))
|
||||
s.Require().Equal(len(res.GroupPolicies), len(tc.expectGroupPolicies))
|
||||
for i := range res.GroupPolicies {
|
||||
s.Require().Equal(res.GroupPolicies[i].GroupId, tc.expectGroupPolicies[i].GroupId)
|
||||
s.Require().Equal(res.GroupPolicies[i].Metadata, tc.expectGroupPolicies[i].Metadata)
|
||||
s.Require().Equal(res.GroupPolicies[i].Version, tc.expectGroupPolicies[i].Version)
|
||||
s.Require().Equal(res.GroupPolicies[i].Admin, tc.expectGroupPolicies[i].Admin)
|
||||
dp1, err := s.groupPolicies[i].GetDecisionPolicy()
|
||||
s.Require().NoError(err)
|
||||
dp2, err := tc.expectGroupPolicies[i].GetDecisionPolicy()
|
||||
s.Require().NoError(err)
|
||||
s.Require().Equal(dp1, dp2)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestQueryProposal() {
|
||||
val := s.network.Validators[0]
|
||||
clientCtx := val.ClientCtx
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
args []string
|
||||
expectErr bool
|
||||
expectErrMsg string
|
||||
}{
|
||||
{
|
||||
"not found",
|
||||
[]string{"12345", fmt.Sprintf("--%s=json", flags.FlagOutput)},
|
||||
true,
|
||||
"not found",
|
||||
},
|
||||
{
|
||||
"invalid proposal id",
|
||||
[]string{"", fmt.Sprintf("--%s=json", flags.FlagOutput)},
|
||||
true,
|
||||
"strconv.ParseUint: parsing \"\": invalid syntax",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
tc := tc
|
||||
|
||||
s.Run(tc.name, func() {
|
||||
cmd := client.QueryProposalCmd()
|
||||
|
||||
out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
|
||||
if tc.expectErr {
|
||||
s.Require().Contains(out.String(), tc.expectErrMsg)
|
||||
} else {
|
||||
s.Require().NoError(err, out.String())
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestQueryProposalsByGroupPolicy() {
|
||||
val := s.network.Validators[0]
|
||||
clientCtx := val.ClientCtx
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
args []string
|
||||
expectErr bool
|
||||
expectErrMsg string
|
||||
expectProposals []*group.Proposal
|
||||
}{
|
||||
{
|
||||
"invalid group policy address",
|
||||
[]string{"invalid"},
|
||||
true,
|
||||
"decoding bech32 failed: invalid bech32 string",
|
||||
[]*group.Proposal{},
|
||||
},
|
||||
{
|
||||
"no group policy",
|
||||
[]string{"cosmos139f7kncmglres2nf3h4hc4tade85ekfr8sulz5", fmt.Sprintf("--%s=json", flags.FlagOutput)},
|
||||
false,
|
||||
"",
|
||||
[]*group.Proposal{},
|
||||
},
|
||||
{
|
||||
"found proposals",
|
||||
[]string{s.groupPolicies[0].Address, fmt.Sprintf("--%s=json", flags.FlagOutput)},
|
||||
false,
|
||||
"",
|
||||
[]*group.Proposal{
|
||||
s.proposal,
|
||||
},
|
||||
},
|
||||
{
|
||||
"found proposals (request with pagination)",
|
||||
[]string{
|
||||
s.groupPolicies[0].Address,
|
||||
fmt.Sprintf("--%s=json", flags.FlagOutput),
|
||||
"--limit=2",
|
||||
},
|
||||
false,
|
||||
"",
|
||||
[]*group.Proposal{
|
||||
s.proposal,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
tc := tc
|
||||
|
||||
s.Run(tc.name, func() {
|
||||
cmd := client.QueryProposalsByGroupPolicyCmd()
|
||||
|
||||
out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
|
||||
if tc.expectErr {
|
||||
s.Require().Contains(out.String(), tc.expectErrMsg)
|
||||
} else {
|
||||
s.Require().NoError(err, out.String())
|
||||
|
||||
var res group.QueryProposalsByGroupPolicyResponse
|
||||
s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), &res))
|
||||
s.Require().Equal(len(res.Proposals), len(tc.expectProposals))
|
||||
for i := range res.Proposals {
|
||||
s.Require().Equal(res.Proposals[i], tc.expectProposals[i])
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestQueryVoteByProposalVoter() {
|
||||
val := s.network.Validators[0]
|
||||
clientCtx := val.ClientCtx
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
args []string
|
||||
expectErr bool
|
||||
expectErrMsg string
|
||||
}{
|
||||
{
|
||||
"invalid voter address",
|
||||
[]string{"1", "invalid", fmt.Sprintf("--%s=json", flags.FlagOutput)},
|
||||
true,
|
||||
"decoding bech32 failed: invalid bech32",
|
||||
},
|
||||
{
|
||||
"invalid proposal id",
|
||||
[]string{"", val.Address.String(), fmt.Sprintf("--%s=json", flags.FlagOutput)},
|
||||
true,
|
||||
"strconv.ParseUint: parsing \"\": invalid syntax",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
tc := tc
|
||||
|
||||
s.Run(tc.name, func() {
|
||||
cmd := client.QueryVoteByProposalVoterCmd()
|
||||
|
||||
out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
|
||||
if tc.expectErr {
|
||||
s.Require().Contains(out.String(), tc.expectErrMsg)
|
||||
} else {
|
||||
s.Require().NoError(err, out.String())
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestQueryVotesByProposal() {
|
||||
val := s.network.Validators[0]
|
||||
clientCtx := val.ClientCtx
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
args []string
|
||||
expectErr bool
|
||||
expectErrMsg string
|
||||
expectVotes []*group.Vote
|
||||
}{
|
||||
{
|
||||
"invalid proposal id",
|
||||
[]string{"", fmt.Sprintf("--%s=json", flags.FlagOutput)},
|
||||
true,
|
||||
"strconv.ParseUint: parsing \"\": invalid syntax",
|
||||
[]*group.Vote{},
|
||||
},
|
||||
{
|
||||
"no votes",
|
||||
[]string{"12345", fmt.Sprintf("--%s=json", flags.FlagOutput)},
|
||||
false,
|
||||
"",
|
||||
[]*group.Vote{},
|
||||
},
|
||||
{
|
||||
"found votes",
|
||||
[]string{"1", fmt.Sprintf("--%s=json", flags.FlagOutput)},
|
||||
false,
|
||||
"",
|
||||
[]*group.Vote{
|
||||
s.vote,
|
||||
},
|
||||
},
|
||||
{
|
||||
"found votes (request with pagination)",
|
||||
[]string{
|
||||
"1",
|
||||
fmt.Sprintf("--%s=json", flags.FlagOutput),
|
||||
"--limit=2",
|
||||
},
|
||||
false,
|
||||
"",
|
||||
[]*group.Vote{
|
||||
s.vote,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
tc := tc
|
||||
|
||||
s.Run(tc.name, func() {
|
||||
cmd := client.QueryVotesByProposalCmd()
|
||||
|
||||
out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
|
||||
if tc.expectErr {
|
||||
s.Require().Contains(out.String(), tc.expectErrMsg)
|
||||
} else {
|
||||
s.Require().NoError(err, out.String())
|
||||
|
||||
var res group.QueryVotesByProposalResponse
|
||||
s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), &res))
|
||||
s.Require().Equal(len(res.Votes), len(tc.expectVotes))
|
||||
for i := range res.Votes {
|
||||
s.Require().Equal(res.Votes[i], tc.expectVotes[i])
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestQueryVotesByVoter() {
|
||||
val := s.network.Validators[0]
|
||||
clientCtx := val.ClientCtx
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
args []string
|
||||
expectErr bool
|
||||
expectErrMsg string
|
||||
expectVotes []*group.Vote
|
||||
}{
|
||||
{
|
||||
"invalid voter address",
|
||||
[]string{"abcd", fmt.Sprintf("--%s=json", flags.FlagOutput)},
|
||||
true,
|
||||
"decoding bech32 failed: invalid bech32",
|
||||
[]*group.Vote{},
|
||||
},
|
||||
{
|
||||
"no votes",
|
||||
[]string{s.groupPolicies[0].Address, fmt.Sprintf("--%s=json", flags.FlagOutput)},
|
||||
true,
|
||||
"",
|
||||
[]*group.Vote{},
|
||||
},
|
||||
{
|
||||
"found votes",
|
||||
[]string{val.Address.String(), fmt.Sprintf("--%s=json", flags.FlagOutput)},
|
||||
false,
|
||||
"",
|
||||
[]*group.Vote{
|
||||
s.vote,
|
||||
},
|
||||
},
|
||||
{
|
||||
"found votes (request with pagination)",
|
||||
[]string{
|
||||
val.Address.String(),
|
||||
fmt.Sprintf("--%s=json", flags.FlagOutput),
|
||||
"--limit=2",
|
||||
},
|
||||
false,
|
||||
"",
|
||||
[]*group.Vote{
|
||||
s.vote,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
tc := tc
|
||||
|
||||
s.Run(tc.name, func() {
|
||||
cmd := client.QueryVotesByVoterCmd()
|
||||
|
||||
out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
|
||||
if tc.expectErr {
|
||||
s.Require().Contains(out.String(), tc.expectErrMsg)
|
||||
} else {
|
||||
s.Require().NoError(err, out.String())
|
||||
|
||||
var res group.QueryVotesByVoterResponse
|
||||
s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), &res))
|
||||
s.Require().Equal(len(res.Votes), len(tc.expectVotes))
|
||||
for i := range res.Votes {
|
||||
s.Require().Equal(res.Votes[i], tc.expectVotes[i])
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestTallyResult() {
|
||||
val := s.network.Validators[0]
|
||||
clientCtx := val.ClientCtx
|
||||
|
||||
@ -1,20 +0,0 @@
|
||||
//go:build e2e
|
||||
// +build e2e
|
||||
|
||||
package nft
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/suite"
|
||||
|
||||
"cosmossdk.io/simapp"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/testutil/network"
|
||||
)
|
||||
|
||||
func TestE2ETestSuite(t *testing.T) {
|
||||
cfg := network.DefaultConfig(simapp.NewTestNetworkFixture)
|
||||
cfg.NumValidators = 1
|
||||
suite.Run(t, NewE2ETestSuite(cfg))
|
||||
}
|
||||
@ -1,414 +0,0 @@
|
||||
package nft
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"cosmossdk.io/x/nft"
|
||||
"github.com/cosmos/cosmos-sdk/testutil"
|
||||
)
|
||||
|
||||
func (s *E2ETestSuite) TestQueryBalanceGRPC() {
|
||||
val := s.network.Validators[0]
|
||||
testCases := []struct {
|
||||
name string
|
||||
args struct {
|
||||
ClassID string
|
||||
Owner string
|
||||
}
|
||||
expectErr bool
|
||||
errMsg string
|
||||
expectValue uint64
|
||||
}{
|
||||
{
|
||||
name: "fail not exist owner",
|
||||
args: struct {
|
||||
ClassID string
|
||||
Owner string
|
||||
}{
|
||||
ClassID: ExpNFT.ClassId,
|
||||
Owner: s.owner.String(),
|
||||
},
|
||||
expectErr: false,
|
||||
expectValue: 0,
|
||||
},
|
||||
{
|
||||
name: "success",
|
||||
args: struct {
|
||||
ClassID string
|
||||
Owner string
|
||||
}{
|
||||
ClassID: ExpNFT.ClassId,
|
||||
Owner: val.Address.String(),
|
||||
},
|
||||
expectErr: false,
|
||||
expectValue: 1,
|
||||
},
|
||||
}
|
||||
balanceURL := val.APIAddress + "/cosmos/nft/v1beta1/balance/%s/%s"
|
||||
for _, tc := range testCases {
|
||||
uri := fmt.Sprintf(balanceURL, tc.args.Owner, tc.args.ClassID)
|
||||
s.Run(tc.name, func() {
|
||||
resp, _ := testutil.GetRequest(uri)
|
||||
if tc.expectErr {
|
||||
s.Require().Contains(string(resp), tc.errMsg)
|
||||
} else {
|
||||
var g nft.QueryBalanceResponse
|
||||
err := val.ClientCtx.Codec.UnmarshalJSON(resp, &g)
|
||||
s.Require().NoError(err)
|
||||
s.Require().Equal(tc.expectValue, g.Amount)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestQueryOwnerGRPC() {
|
||||
val := s.network.Validators[0]
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
args struct {
|
||||
ClassID string
|
||||
ID string
|
||||
}
|
||||
expectErr bool
|
||||
errMsg string
|
||||
expectResult string
|
||||
}{
|
||||
{
|
||||
name: "class id does not exist",
|
||||
args: struct {
|
||||
ClassID string
|
||||
ID string
|
||||
}{
|
||||
ClassID: "class-id",
|
||||
ID: ExpNFT.Id,
|
||||
},
|
||||
expectErr: false,
|
||||
expectResult: "",
|
||||
},
|
||||
{
|
||||
name: "nft id does not exist",
|
||||
args: struct {
|
||||
ClassID string
|
||||
ID string
|
||||
}{
|
||||
ClassID: ExpNFT.ClassId,
|
||||
ID: "nft-id",
|
||||
},
|
||||
expectErr: false,
|
||||
expectResult: "",
|
||||
},
|
||||
{
|
||||
name: "nft exist",
|
||||
args: struct {
|
||||
ClassID string
|
||||
ID string
|
||||
}{
|
||||
ClassID: ExpNFT.ClassId,
|
||||
ID: ExpNFT.Id,
|
||||
},
|
||||
expectErr: false,
|
||||
expectResult: val.Address.String(),
|
||||
},
|
||||
}
|
||||
ownerURL := val.APIAddress + "/cosmos/nft/v1beta1/owner/%s/%s"
|
||||
for _, tc := range testCases {
|
||||
uri := fmt.Sprintf(ownerURL, tc.args.ClassID, tc.args.ID)
|
||||
s.Run(tc.name, func() {
|
||||
resp, err := testutil.GetRequest(uri)
|
||||
if tc.expectErr {
|
||||
s.Require().Contains(string(resp), tc.errMsg)
|
||||
} else {
|
||||
s.Require().NoError(err)
|
||||
var result nft.QueryOwnerResponse
|
||||
err = val.ClientCtx.Codec.UnmarshalJSON(resp, &result)
|
||||
s.Require().NoError(err)
|
||||
s.Require().EqualValues(tc.expectResult, result.Owner)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestQuerySupplyGRPC() {
|
||||
val := s.network.Validators[0]
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
args struct {
|
||||
ClassID string
|
||||
}
|
||||
expectErr bool
|
||||
errMsg string
|
||||
expectResult uint64
|
||||
}{
|
||||
{
|
||||
name: "class id is empty",
|
||||
args: struct {
|
||||
ClassID string
|
||||
}{
|
||||
ClassID: "",
|
||||
},
|
||||
expectErr: true,
|
||||
errMsg: nft.ErrEmptyClassID.Error(),
|
||||
expectResult: 0,
|
||||
},
|
||||
{
|
||||
name: "class id does not exist",
|
||||
args: struct {
|
||||
ClassID string
|
||||
}{
|
||||
ClassID: "class-id",
|
||||
},
|
||||
expectErr: false,
|
||||
expectResult: 0,
|
||||
},
|
||||
{
|
||||
name: "class id exist",
|
||||
args: struct {
|
||||
ClassID string
|
||||
}{
|
||||
ClassID: ExpNFT.ClassId,
|
||||
},
|
||||
expectErr: false,
|
||||
expectResult: 1,
|
||||
},
|
||||
}
|
||||
supplyURL := val.APIAddress + "/cosmos/nft/v1beta1/supply/%s"
|
||||
for _, tc := range testCases {
|
||||
uri := fmt.Sprintf(supplyURL, tc.args.ClassID)
|
||||
s.Run(tc.name, func() {
|
||||
resp, err := testutil.GetRequest(uri)
|
||||
if tc.expectErr {
|
||||
s.Require().Contains(string(resp), tc.errMsg)
|
||||
} else {
|
||||
s.Require().NoError(err)
|
||||
var result nft.QuerySupplyResponse
|
||||
err = val.ClientCtx.Codec.UnmarshalJSON(resp, &result)
|
||||
s.Require().NoError(err)
|
||||
s.Require().EqualValues(tc.expectResult, result.Amount)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestQueryNFTsGRPC() {
|
||||
val := s.network.Validators[0]
|
||||
testCases := []struct {
|
||||
name string
|
||||
args struct {
|
||||
ClassID string
|
||||
Owner string
|
||||
}
|
||||
expectErr bool
|
||||
errorMsg string
|
||||
expectResult []*nft.NFT
|
||||
}{
|
||||
{
|
||||
name: "classID and owner are both empty",
|
||||
args: struct {
|
||||
ClassID string
|
||||
Owner string
|
||||
}{},
|
||||
errorMsg: "must provide at least one of classID or owner",
|
||||
expectErr: true,
|
||||
expectResult: []*nft.NFT{},
|
||||
},
|
||||
{
|
||||
name: "classID is invalid",
|
||||
args: struct {
|
||||
ClassID string
|
||||
Owner string
|
||||
}{
|
||||
ClassID: "invalid_class_id",
|
||||
},
|
||||
expectErr: true,
|
||||
expectResult: []*nft.NFT{},
|
||||
},
|
||||
{
|
||||
name: "classID does not exist",
|
||||
args: struct {
|
||||
ClassID string
|
||||
Owner string
|
||||
}{
|
||||
ClassID: "class-id",
|
||||
},
|
||||
expectErr: false,
|
||||
expectResult: []*nft.NFT{},
|
||||
},
|
||||
{
|
||||
name: "success query by classID",
|
||||
args: struct {
|
||||
ClassID string
|
||||
Owner string
|
||||
}{
|
||||
ClassID: ExpNFT.ClassId,
|
||||
},
|
||||
expectErr: false,
|
||||
expectResult: []*nft.NFT{&ExpNFT},
|
||||
},
|
||||
{
|
||||
name: "success query by owner",
|
||||
args: struct {
|
||||
ClassID string
|
||||
Owner string
|
||||
}{
|
||||
Owner: val.Address.String(),
|
||||
},
|
||||
expectErr: false,
|
||||
expectResult: []*nft.NFT{&ExpNFT},
|
||||
},
|
||||
{
|
||||
name: "success query by owner and classID",
|
||||
args: struct {
|
||||
ClassID string
|
||||
Owner string
|
||||
}{
|
||||
ClassID: ExpNFT.ClassId,
|
||||
Owner: val.Address.String(),
|
||||
},
|
||||
expectErr: false,
|
||||
expectResult: []*nft.NFT{&ExpNFT},
|
||||
},
|
||||
}
|
||||
nftsOfClassURL := val.APIAddress + "/cosmos/nft/v1beta1/nfts?class_id=%s&owner=%s"
|
||||
for _, tc := range testCases {
|
||||
uri := fmt.Sprintf(nftsOfClassURL, tc.args.ClassID, tc.args.Owner)
|
||||
s.Run(tc.name, func() {
|
||||
resp, err := testutil.GetRequest(uri)
|
||||
if tc.expectErr {
|
||||
s.Require().Contains(string(resp), tc.errorMsg)
|
||||
} else {
|
||||
s.Require().NoError(err)
|
||||
var result nft.QueryNFTsResponse
|
||||
err = val.ClientCtx.Codec.UnmarshalJSON(resp, &result)
|
||||
s.Require().NoError(err)
|
||||
s.Require().EqualValues(tc.expectResult, result.Nfts)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestQueryNFTGRPC() {
|
||||
val := s.network.Validators[0]
|
||||
testCases := []struct {
|
||||
name string
|
||||
args struct {
|
||||
ClassID string
|
||||
ID string
|
||||
}
|
||||
expectErr bool
|
||||
errorMsg string
|
||||
}{
|
||||
{
|
||||
name: "nft id does not exist",
|
||||
args: struct {
|
||||
ClassID string
|
||||
ID string
|
||||
}{
|
||||
ClassID: ExpNFT.ClassId,
|
||||
ID: "nft-id",
|
||||
},
|
||||
expectErr: true,
|
||||
errorMsg: "not found nft",
|
||||
},
|
||||
{
|
||||
name: "exist nft",
|
||||
args: struct {
|
||||
ClassID string
|
||||
ID string
|
||||
}{
|
||||
ClassID: ExpNFT.ClassId,
|
||||
ID: ExpNFT.Id,
|
||||
},
|
||||
expectErr: false,
|
||||
},
|
||||
{
|
||||
name: "class id does not exist",
|
||||
args: struct {
|
||||
ClassID string
|
||||
ID string
|
||||
}{
|
||||
ClassID: "class",
|
||||
ID: ExpNFT.Id,
|
||||
},
|
||||
expectErr: true,
|
||||
errorMsg: "not found nft",
|
||||
},
|
||||
}
|
||||
nftURL := val.APIAddress + "/cosmos/nft/v1beta1/nfts/%s/%s"
|
||||
for _, tc := range testCases {
|
||||
uri := fmt.Sprintf(nftURL, tc.args.ClassID, tc.args.ID)
|
||||
s.Run(tc.name, func() {
|
||||
resp, err := testutil.GetRequest(uri)
|
||||
if tc.expectErr {
|
||||
s.Require().Contains(string(resp), tc.errorMsg)
|
||||
} else {
|
||||
s.Require().NoError(err)
|
||||
var result nft.QueryNFTResponse
|
||||
err = val.ClientCtx.Codec.UnmarshalJSON(resp, &result)
|
||||
s.Require().NoError(err)
|
||||
s.Require().EqualValues(ExpNFT, *result.Nft)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestQueryClassGRPC() {
|
||||
val := s.network.Validators[0]
|
||||
testCases := []struct {
|
||||
name string
|
||||
args struct {
|
||||
ClassID string
|
||||
}
|
||||
expectErr bool
|
||||
errorMsg string
|
||||
}{
|
||||
{
|
||||
name: "class id does not exist",
|
||||
args: struct {
|
||||
ClassID string
|
||||
}{
|
||||
ClassID: "class-id",
|
||||
},
|
||||
expectErr: true,
|
||||
errorMsg: "not found class",
|
||||
},
|
||||
{
|
||||
name: "class id exist",
|
||||
args: struct {
|
||||
ClassID string
|
||||
}{
|
||||
ClassID: ExpNFT.ClassId,
|
||||
},
|
||||
expectErr: false,
|
||||
},
|
||||
}
|
||||
classURL := val.APIAddress + "/cosmos/nft/v1beta1/classes/%s"
|
||||
for _, tc := range testCases {
|
||||
uri := fmt.Sprintf(classURL, tc.args.ClassID)
|
||||
s.Run(tc.name, func() {
|
||||
resp, err := testutil.GetRequest(uri)
|
||||
if tc.expectErr {
|
||||
s.Require().Contains(string(resp), tc.errorMsg)
|
||||
} else {
|
||||
s.Require().NoError(err)
|
||||
var result nft.QueryClassResponse
|
||||
err = val.ClientCtx.Codec.UnmarshalJSON(resp, &result)
|
||||
s.Require().NoError(err)
|
||||
s.Require().EqualValues(ExpClass, *result.Class)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestQueryClassesGRPC() {
|
||||
val := s.network.Validators[0]
|
||||
classURL := val.APIAddress + "/cosmos/nft/v1beta1/classes"
|
||||
resp, err := testutil.GetRequest(classURL)
|
||||
s.Require().NoError(err)
|
||||
var result nft.QueryClassesResponse
|
||||
err = val.ClientCtx.Codec.UnmarshalJSON(resp, &result)
|
||||
s.Require().NoError(err)
|
||||
s.Require().Len(result.Classes, 1)
|
||||
s.Require().EqualValues(ExpClass, *result.Classes[0])
|
||||
}
|
||||
@ -1,163 +0,0 @@
|
||||
package nft
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/stretchr/testify/suite"
|
||||
|
||||
"cosmossdk.io/x/nft"
|
||||
"cosmossdk.io/x/nft/client/cli"
|
||||
"github.com/cosmos/cosmos-sdk/client/flags"
|
||||
addresscodec "github.com/cosmos/cosmos-sdk/codec/address"
|
||||
clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli"
|
||||
"github.com/cosmos/cosmos-sdk/testutil/network"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
|
||||
const (
|
||||
OwnerName = "owner"
|
||||
Owner = "cosmos1kznrznww4pd6gx0zwrpthjk68fdmqypjpkj5hp"
|
||||
OwnerArmor = `-----BEGIN TENDERMINT PRIVATE KEY-----
|
||||
salt: C3586B75587D2824187D2CDA22B6AFB6
|
||||
type: secp256k1
|
||||
kdf: bcrypt
|
||||
|
||||
1+15OrCKgjnwym1zO3cjo/SGe3PPqAYChQ5wMHjdUbTZM7mWsH3/ueL6swgjzI3b
|
||||
DDzEQAPXBQflzNW6wbne9IfT651zCSm+j1MWaGk=
|
||||
=wEHs
|
||||
-----END TENDERMINT PRIVATE KEY-----`
|
||||
|
||||
testClassID = "kitty"
|
||||
testClassName = "Crypto Kitty"
|
||||
testClassSymbol = "kitty"
|
||||
testClassDescription = "Crypto Kitty"
|
||||
testClassURI = "class uri"
|
||||
testID = "kitty1"
|
||||
testURI = "kitty uri"
|
||||
)
|
||||
|
||||
var (
|
||||
ExpClass = nft.Class{
|
||||
Id: testClassID,
|
||||
Name: testClassName,
|
||||
Symbol: testClassSymbol,
|
||||
Description: testClassDescription,
|
||||
Uri: testClassURI,
|
||||
}
|
||||
|
||||
ExpNFT = nft.NFT{
|
||||
ClassId: testClassID,
|
||||
Id: testID,
|
||||
Uri: testURI,
|
||||
}
|
||||
)
|
||||
|
||||
type E2ETestSuite struct {
|
||||
suite.Suite
|
||||
|
||||
cfg network.Config
|
||||
network *network.Network
|
||||
owner sdk.AccAddress
|
||||
}
|
||||
|
||||
func NewE2ETestSuite(cfg network.Config) *E2ETestSuite {
|
||||
return &E2ETestSuite{cfg: cfg}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) SetupSuite() {
|
||||
s.T().Log("setting up e2e test suite")
|
||||
|
||||
genesisState := s.cfg.GenesisState
|
||||
nftGenesis := nft.GenesisState{
|
||||
Classes: []*nft.Class{&ExpClass},
|
||||
Entries: []*nft.Entry{{
|
||||
Owner: Owner,
|
||||
Nfts: []*nft.NFT{&ExpNFT},
|
||||
}},
|
||||
}
|
||||
|
||||
nftDataBz, err := s.cfg.Codec.MarshalJSON(&nftGenesis)
|
||||
s.Require().NoError(err)
|
||||
genesisState[nft.ModuleName] = nftDataBz
|
||||
s.cfg.GenesisState = genesisState
|
||||
s.network, err = network.New(s.T(), s.T().TempDir(), s.cfg)
|
||||
s.Require().NoError(err)
|
||||
s.Require().NoError(s.network.WaitForNextBlock())
|
||||
|
||||
s.initAccount()
|
||||
s.Require().NoError(s.network.WaitForNextBlock())
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TearDownSuite() {
|
||||
s.T().Log("tearing down e2e test suite")
|
||||
s.network.Cleanup()
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestCLITxSend() {
|
||||
cmd := cli.NewCmdSend()
|
||||
val := s.network.Validators[0]
|
||||
args := []string{
|
||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, OwnerName),
|
||||
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.cfg.BondDenom, sdk.NewInt(10))).String()),
|
||||
}
|
||||
testCases := []struct {
|
||||
name string
|
||||
args []string
|
||||
expectedCode uint32
|
||||
expectErr bool
|
||||
}{
|
||||
{
|
||||
"valid transaction",
|
||||
[]string{
|
||||
testClassID,
|
||||
testID,
|
||||
val.Address.String(),
|
||||
},
|
||||
0,
|
||||
false,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
tc := tc
|
||||
s.Run(tc.name, func() {
|
||||
clientCtx := val.ClientCtx
|
||||
args = append(args, tc.args...)
|
||||
|
||||
out, err := clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, args)
|
||||
if tc.expectErr {
|
||||
s.Require().Error(err)
|
||||
} else {
|
||||
var txResp sdk.TxResponse
|
||||
s.Require().NoError(err)
|
||||
s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), &txResp), out.String())
|
||||
s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, txResp.TxHash, tc.expectedCode))
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) initAccount() {
|
||||
val := s.network.Validators[0]
|
||||
ctx := val.ClientCtx
|
||||
err := ctx.Keyring.ImportPrivKey(OwnerName, OwnerArmor, "1234567890")
|
||||
s.Require().NoError(err)
|
||||
|
||||
keyinfo, err := ctx.Keyring.Key(OwnerName)
|
||||
s.Require().NoError(err)
|
||||
|
||||
args := []string{
|
||||
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.cfg.BondDenom, sdk.NewInt(10))).String()),
|
||||
}
|
||||
|
||||
s.owner, err = keyinfo.GetAddress()
|
||||
s.Require().NoError(err)
|
||||
|
||||
amount := sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(200)))
|
||||
_, err = clitestutil.MsgSendExec(ctx, val.Address, s.owner, amount, addresscodec.NewBech32Codec("cosmos"), args...)
|
||||
s.Require().NoError(err)
|
||||
}
|
||||
@ -18,6 +18,7 @@ import (
|
||||
"cosmossdk.io/x/feegrant"
|
||||
"cosmossdk.io/x/feegrant/client/cli"
|
||||
"cosmossdk.io/x/feegrant/module"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/client"
|
||||
"github.com/cosmos/cosmos-sdk/client/flags"
|
||||
codecaddress "github.com/cosmos/cosmos-sdk/codec/address"
|
||||
@ -453,7 +454,7 @@ func (s *CLITestSuite) TestNewCmdRevokeFeegrant() {
|
||||
respType proto.Message
|
||||
}{
|
||||
{
|
||||
"invalid grantee",
|
||||
"invalid granter",
|
||||
append(
|
||||
[]string{
|
||||
"wrong_granter",
|
||||
|
||||
@ -2,6 +2,7 @@ package keeper_test
|
||||
|
||||
import (
|
||||
"cosmossdk.io/x/feegrant"
|
||||
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
|
||||
@ -55,6 +56,16 @@ func (suite *KeeperTestSuite) TestFeeAllowance() {
|
||||
func() {},
|
||||
func(*feegrant.QueryAllowanceResponse) {},
|
||||
},
|
||||
{
|
||||
"non existed grant",
|
||||
&feegrant.QueryAllowanceRequest{
|
||||
Granter: invalidGranter,
|
||||
Grantee: invalidGrantee,
|
||||
},
|
||||
true,
|
||||
func() {},
|
||||
func(*feegrant.QueryAllowanceResponse) {},
|
||||
},
|
||||
{
|
||||
"valid query: expect single grant",
|
||||
&feegrant.QueryAllowanceRequest{
|
||||
|
||||
@ -16,6 +16,7 @@ import (
|
||||
simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims"
|
||||
"github.com/cosmos/cosmos-sdk/testutil/testdata"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
"github.com/cosmos/cosmos-sdk/types/query"
|
||||
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
|
||||
"github.com/cosmos/cosmos-sdk/x/group"
|
||||
"github.com/cosmos/cosmos-sdk/x/group/internal/math"
|
||||
@ -1588,6 +1589,14 @@ func (s *TestSuite) TestGroupPoliciesByAdminOrGroup() {
|
||||
s.Assert().Equal(dp1, dp2)
|
||||
}
|
||||
|
||||
// no group policy
|
||||
noPolicies, err := s.groupKeeper.GroupPoliciesByAdmin(s.ctx, &group.QueryGroupPoliciesByAdminRequest{
|
||||
Admin: addrs[2].String(),
|
||||
})
|
||||
s.Require().NoError(err)
|
||||
policyAccs = noPolicies.GroupPolicies
|
||||
s.Require().Equal(len(policyAccs), 0)
|
||||
|
||||
// query group policy by admin
|
||||
policiesByAdminRes, err := s.groupKeeper.GroupPoliciesByAdmin(s.ctx, &group.QueryGroupPoliciesByAdminRequest{
|
||||
Admin: admin.String(),
|
||||
@ -2072,12 +2081,31 @@ func (s *TestSuite) TestVote() {
|
||||
s.Require().NoError(err)
|
||||
myProposalID := proposalRes.ProposalId
|
||||
|
||||
// proposals by group policy
|
||||
// no group policy
|
||||
proposalsRes, err := s.groupKeeper.ProposalsByGroupPolicy(s.ctx, &group.QueryProposalsByGroupPolicyRequest{
|
||||
Address: accountAddr,
|
||||
Address: addrs[2].String(),
|
||||
})
|
||||
s.Require().NoError(err)
|
||||
proposals := proposalsRes.Proposals
|
||||
s.Require().Equal(len(proposals), 0)
|
||||
|
||||
// proposals by group policy (request with pagination)
|
||||
proposalsRes, err = s.groupKeeper.ProposalsByGroupPolicy(s.ctx, &group.QueryProposalsByGroupPolicyRequest{
|
||||
Address: accountAddr,
|
||||
Pagination: &query.PageRequest{
|
||||
Limit: 2,
|
||||
},
|
||||
})
|
||||
s.Require().NoError(err)
|
||||
proposals = proposalsRes.Proposals
|
||||
s.Require().Equal(len(proposals), 1)
|
||||
|
||||
// proposals by group policy
|
||||
proposalsRes, err = s.groupKeeper.ProposalsByGroupPolicy(s.ctx, &group.QueryProposalsByGroupPolicyRequest{
|
||||
Address: accountAddr,
|
||||
})
|
||||
s.Require().NoError(err)
|
||||
proposals = proposalsRes.Proposals
|
||||
s.Require().Equal(len(proposals), 1)
|
||||
s.Assert().Equal(req.GroupPolicyAddress, proposals[0].GroupPolicyAddress)
|
||||
s.Assert().Equal(req.Metadata, proposals[0].Metadata)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user