refactor: Use mocks for x/nft testing (#12407)
## Description Ref: #12398 --- ### Author Checklist *All items are required. Please add a note to the item if the item is not applicable and please add links to any relevant follow up issues.* I have... - [ ] included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title - [ ] added `!` to the type prefix if API or client breaking change - [ ] targeted the correct branch (see [PR Targeting](https://github.com/cosmos/cosmos-sdk/blob/main/CONTRIBUTING.md#pr-targeting)) - [ ] provided a link to the relevant issue or specification - [ ] followed the guidelines for [building modules](https://github.com/cosmos/cosmos-sdk/blob/main/docs/building-modules) - [ ] included the necessary unit and integration [tests](https://github.com/cosmos/cosmos-sdk/blob/main/CONTRIBUTING.md#testing) - [ ] added a changelog entry to `CHANGELOG.md` - [ ] included comments for [documenting Go code](https://blog.golang.org/godoc) - [ ] updated the relevant documentation or specification - [ ] reviewed "Files changed" and left comments if necessary - [ ] confirmed all CI checks have passed ### Reviewers Checklist *All items are required. Please add a note if the item is not applicable and please add your handle next to the items reviewed if you only reviewed selected items.* I have... - [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title - [ ] confirmed `!` in the type prefix if API or client breaking change - [ ] confirmed all author checklist items have been addressed - [ ] reviewed state machine logic - [ ] reviewed API design and naming - [ ] reviewed documentation is accurate - [ ] reviewed tests and test coverage - [ ] manually tested (if applicable)
This commit is contained in:
parent
c3314ea99b
commit
76bbcd2ce3
11
Makefile
11
Makefile
@ -138,18 +138,9 @@ cosmovisor:
|
||||
|
||||
.PHONY: build build-linux cosmovisor
|
||||
|
||||
mockgen_cmd=go run github.com/golang/mock/mockgen
|
||||
|
||||
mocks: $(MOCKS_DIR)
|
||||
$(mockgen_cmd) -source=client/account_retriever.go -package mocks -destination tests/mocks/account_retriever.go
|
||||
$(mockgen_cmd) -package mocks -destination tests/mocks/tendermint_tm_db_DB.go github.com/tendermint/tm-db DB
|
||||
$(mockgen_cmd) -source db/types.go -package mocks -destination tests/mocks/db/types.go
|
||||
$(mockgen_cmd) -source=types/module/module.go -package mocks -destination tests/mocks/types_module_module.go
|
||||
$(mockgen_cmd) -source=types/invariant.go -package mocks -destination tests/mocks/types_invariant.go
|
||||
$(mockgen_cmd) -source=types/router.go -package mocks -destination tests/mocks/types_router.go
|
||||
$(mockgen_cmd) -package mocks -destination tests/mocks/grpc_server.go github.com/gogo/protobuf/grpc Server
|
||||
$(mockgen_cmd) -package mocks -destination tests/mocks/tendermint_tendermint_libs_log_DB.go github.com/tendermint/tendermint/libs/log Logger
|
||||
$(mockgen_cmd) -source=orm/model/ormtable/hooks.go -package ormmocks -destination orm/testing/ormmocks/hooks.go
|
||||
sh ./scripts/mockgen.sh
|
||||
.PHONY: mocks
|
||||
|
||||
$(MOCKS_DIR):
|
||||
|
||||
13
scripts/mockgen.sh
Executable file
13
scripts/mockgen.sh
Executable file
@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
mockgen_cmd="go run github.com/golang/mock/mockgen"
|
||||
$mockgen_cmd -source=client/account_retriever.go -package mocks -destination tests/mocks/account_retriever.go
|
||||
$mockgen_cmd -package mocks -destination tests/mocks/tendermint_tm_db_DB.go github.com/tendermint/tm-db DB
|
||||
$mockgen_cmd -source db/types.go -package mocks -destination tests/mocks/db/types.go
|
||||
$mockgen_cmd -source=types/module/module.go -package mocks -destination tests/mocks/types_module_module.go
|
||||
$mockgen_cmd -source=types/invariant.go -package mocks -destination tests/mocks/types_invariant.go
|
||||
$mockgen_cmd -source=types/router.go -package mocks -destination tests/mocks/types_router.go
|
||||
$mockgen_cmd -package mocks -destination tests/mocks/grpc_server.go github.com/gogo/protobuf/grpc Server
|
||||
$mockgen_cmd -package mocks -destination tests/mocks/tendermint_tendermint_libs_log_DB.go github.com/tendermint/tendermint/libs/log Logger
|
||||
$mockgen_cmd -source=orm/model/ormtable/hooks.go -package ormmocks -destination orm/testing/ormmocks/hooks.go
|
||||
$mockgen_cmd -source=x/nft/expected_keepers.go -package testutil -destination x/nft/testutil/expected_keepers_mocks.go
|
||||
@ -1,6 +1,9 @@
|
||||
package testutil
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/tendermint/tendermint/libs/log"
|
||||
tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
|
||||
dbm "github.com/tendermint/tm-db"
|
||||
@ -24,3 +27,22 @@ func DefaultContext(key storetypes.StoreKey, tkey storetypes.StoreKey) sdk.Conte
|
||||
|
||||
return ctx
|
||||
}
|
||||
|
||||
type TestContext struct {
|
||||
Ctx sdk.Context
|
||||
DB *dbm.MemDB
|
||||
CMS store.CommitMultiStore
|
||||
}
|
||||
|
||||
func DefaultContextWithDB(t *testing.T, key storetypes.StoreKey, tkey storetypes.StoreKey) TestContext {
|
||||
db := dbm.NewMemDB()
|
||||
cms := store.NewCommitMultiStore(db)
|
||||
cms.MountStoreWithDB(key, storetypes.StoreTypeIAVL, db)
|
||||
cms.MountStoreWithDB(tkey, storetypes.StoreTypeTransient, db)
|
||||
err := cms.LoadLatestVersion()
|
||||
assert.NoError(t, err)
|
||||
|
||||
ctx := sdk.NewContext(cms, tmproto.Header{}, false, log.NewNopLogger())
|
||||
|
||||
return TestContext{ctx, db, cms}
|
||||
}
|
||||
|
||||
@ -3,19 +3,20 @@ package keeper_test
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/golang/mock/gomock"
|
||||
"github.com/stretchr/testify/suite"
|
||||
tmtime "github.com/tendermint/tendermint/libs/time"
|
||||
tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/baseapp"
|
||||
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
|
||||
"github.com/cosmos/cosmos-sdk/testutil"
|
||||
simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper"
|
||||
moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil"
|
||||
"github.com/cosmos/cosmos-sdk/x/nft"
|
||||
"github.com/cosmos/cosmos-sdk/x/nft/keeper"
|
||||
"github.com/cosmos/cosmos-sdk/x/nft/testutil"
|
||||
stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper"
|
||||
"github.com/cosmos/cosmos-sdk/x/nft/module"
|
||||
nfttestutil "github.com/cosmos/cosmos-sdk/x/nft/testutil"
|
||||
)
|
||||
|
||||
const (
|
||||
@ -37,34 +38,32 @@ type TestSuite struct {
|
||||
addrs []sdk.AccAddress
|
||||
queryClient nft.QueryClient
|
||||
nftKeeper keeper.Keeper
|
||||
|
||||
encCfg moduletestutil.TestEncodingConfig
|
||||
}
|
||||
|
||||
func (s *TestSuite) SetupTest() {
|
||||
var (
|
||||
interfaceRegistry codectypes.InterfaceRegistry
|
||||
bankKeeper bankkeeper.Keeper
|
||||
stakingKeeper *stakingkeeper.Keeper
|
||||
nftKeeper keeper.Keeper
|
||||
)
|
||||
// suite setup
|
||||
s.addrs = simtestutil.CreateIncrementalAccounts(3)
|
||||
s.encCfg = moduletestutil.MakeTestEncodingConfig(module.AppModuleBasic{})
|
||||
|
||||
app, err := simtestutil.Setup(
|
||||
testutil.AppConfig,
|
||||
&interfaceRegistry,
|
||||
&nftKeeper,
|
||||
&bankKeeper,
|
||||
&stakingKeeper,
|
||||
)
|
||||
s.Require().NoError(err)
|
||||
key := sdk.NewKVStoreKey(nft.StoreKey)
|
||||
testCtx := testutil.DefaultContextWithDB(s.T(), key, sdk.NewTransientStoreKey("transient_test"))
|
||||
ctx := testCtx.Ctx.WithBlockHeader(tmproto.Header{Time: tmtime.Now()})
|
||||
|
||||
ctx := app.BaseApp.NewContext(false, tmproto.Header{})
|
||||
ctx = ctx.WithBlockHeader(tmproto.Header{Time: tmtime.Now()})
|
||||
queryHelper := baseapp.NewQueryServerTestHelper(ctx, interfaceRegistry)
|
||||
// gomock initializations
|
||||
ctrl := gomock.NewController(s.T())
|
||||
accountKeeper := nfttestutil.NewMockAccountKeeper(ctrl)
|
||||
bankKeeper := nfttestutil.NewMockBankKeeper(ctrl)
|
||||
accountKeeper.EXPECT().GetModuleAddress("nft").Return(s.addrs[0]).AnyTimes()
|
||||
|
||||
nftKeeper := keeper.NewKeeper(key, s.encCfg.Codec, accountKeeper, bankKeeper)
|
||||
queryHelper := baseapp.NewQueryServerTestHelper(ctx, s.encCfg.InterfaceRegistry)
|
||||
nft.RegisterQueryServer(queryHelper, nftKeeper)
|
||||
|
||||
s.ctx = ctx
|
||||
s.queryClient = nft.NewQueryClient(queryHelper)
|
||||
s.addrs = simtestutil.AddTestAddrsIncremental(bankKeeper, stakingKeeper, ctx, 3, sdk.NewInt(30000000))
|
||||
s.nftKeeper = nftKeeper
|
||||
s.queryClient = nft.NewQueryClient(queryHelper)
|
||||
s.ctx = ctx
|
||||
}
|
||||
|
||||
func TestTestSuite(t *testing.T) {
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
package nft
|
||||
package module
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
@ -6,15 +6,14 @@ import (
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/codec"
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keys/ed25519"
|
||||
"github.com/cosmos/cosmos-sdk/depinject"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
"github.com/cosmos/cosmos-sdk/types/kv"
|
||||
moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil"
|
||||
"github.com/cosmos/cosmos-sdk/x/nft"
|
||||
"github.com/cosmos/cosmos-sdk/x/nft/keeper"
|
||||
"github.com/cosmos/cosmos-sdk/x/nft/module"
|
||||
"github.com/cosmos/cosmos-sdk/x/nft/simulation"
|
||||
"github.com/cosmos/cosmos-sdk/x/nft/testutil"
|
||||
)
|
||||
|
||||
var (
|
||||
@ -23,9 +22,8 @@ var (
|
||||
)
|
||||
|
||||
func TestDecodeStore(t *testing.T) {
|
||||
var cdc codec.Codec
|
||||
depinject.Inject(testutil.AppConfig, &cdc)
|
||||
dec := simulation.NewDecodeStore(cdc)
|
||||
encCfg := moduletestutil.MakeTestEncodingConfig(module.AppModuleBasic{})
|
||||
dec := simulation.NewDecodeStore(encCfg.Codec)
|
||||
|
||||
class := nft.Class{
|
||||
Id: "ClassID",
|
||||
@ -34,7 +32,7 @@ func TestDecodeStore(t *testing.T) {
|
||||
Description: "ClassDescription",
|
||||
Uri: "ClassURI",
|
||||
}
|
||||
classBz, err := cdc.Marshal(&class)
|
||||
classBz, err := encCfg.Codec.Marshal(&class)
|
||||
require.NoError(t, err)
|
||||
|
||||
nft := nft.NFT{
|
||||
@ -42,7 +40,7 @@ func TestDecodeStore(t *testing.T) {
|
||||
Id: "NFTID",
|
||||
Uri: "NFTURI",
|
||||
}
|
||||
nftBz, err := cdc.Marshal(&nft)
|
||||
nftBz, err := encCfg.Codec.Marshal(&nft)
|
||||
require.NoError(t, err)
|
||||
|
||||
nftOfClassByOwnerValue := []byte{0x01}
|
||||
|
||||
@ -8,25 +8,23 @@ import (
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
sdkmath "cosmossdk.io/math"
|
||||
"github.com/cosmos/cosmos-sdk/codec"
|
||||
"github.com/cosmos/cosmos-sdk/depinject"
|
||||
"github.com/cosmos/cosmos-sdk/types/module"
|
||||
moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil"
|
||||
simtypes "github.com/cosmos/cosmos-sdk/types/simulation"
|
||||
"github.com/cosmos/cosmos-sdk/x/nft"
|
||||
nftmodule "github.com/cosmos/cosmos-sdk/x/nft/module"
|
||||
"github.com/cosmos/cosmos-sdk/x/nft/simulation"
|
||||
"github.com/cosmos/cosmos-sdk/x/nft/testutil"
|
||||
)
|
||||
|
||||
func TestRandomizedGenState(t *testing.T) {
|
||||
var cdc codec.Codec
|
||||
depinject.Inject(testutil.AppConfig, &cdc)
|
||||
encCfg := moduletestutil.MakeTestEncodingConfig(nftmodule.AppModuleBasic{})
|
||||
|
||||
s := rand.NewSource(1)
|
||||
r := rand.New(s)
|
||||
|
||||
simState := module.SimulationState{
|
||||
AppParams: make(simtypes.AppParams),
|
||||
Cdc: cdc,
|
||||
Cdc: encCfg.Codec,
|
||||
Rand: r,
|
||||
NumBonded: 3,
|
||||
Accounts: simtypes.RandomAccounts(r, 3),
|
||||
|
||||
@ -5,72 +5,104 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/suite"
|
||||
|
||||
abci "github.com/tendermint/tendermint/abci/types"
|
||||
tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/baseapp"
|
||||
"github.com/cosmos/cosmos-sdk/codec"
|
||||
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
|
||||
"github.com/cosmos/cosmos-sdk/runtime"
|
||||
"github.com/cosmos/cosmos-sdk/testutil"
|
||||
simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
moduletypes "github.com/cosmos/cosmos-sdk/types/module"
|
||||
moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil"
|
||||
simtypes "github.com/cosmos/cosmos-sdk/types/simulation"
|
||||
authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper"
|
||||
bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper"
|
||||
banktestutil "github.com/cosmos/cosmos-sdk/x/bank/testutil"
|
||||
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
|
||||
"github.com/cosmos/cosmos-sdk/x/nft"
|
||||
"github.com/cosmos/cosmos-sdk/x/nft/keeper"
|
||||
nftkeeper "github.com/cosmos/cosmos-sdk/x/nft/keeper"
|
||||
"github.com/cosmos/cosmos-sdk/x/nft/module"
|
||||
"github.com/cosmos/cosmos-sdk/x/nft/simulation"
|
||||
"github.com/cosmos/cosmos-sdk/x/nft/testutil"
|
||||
stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper"
|
||||
nfttestutil "github.com/cosmos/cosmos-sdk/x/nft/testutil"
|
||||
"github.com/golang/mock/gomock"
|
||||
"github.com/stretchr/testify/suite"
|
||||
abci "github.com/tendermint/tendermint/abci/types"
|
||||
"github.com/tendermint/tendermint/libs/log"
|
||||
tmtime "github.com/tendermint/tendermint/libs/time"
|
||||
tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
|
||||
)
|
||||
|
||||
type SimTestSuite struct {
|
||||
suite.Suite
|
||||
|
||||
ctx sdk.Context
|
||||
|
||||
app *runtime.App
|
||||
codec codec.Codec
|
||||
interfaceRegistry codectypes.InterfaceRegistry
|
||||
accountKeeper authkeeper.AccountKeeper
|
||||
bankKeeper bankkeeper.Keeper
|
||||
stakingKeeper *stakingkeeper.Keeper
|
||||
nftKeeper nftkeeper.Keeper
|
||||
ctx sdk.Context
|
||||
baseApp *baseapp.BaseApp
|
||||
accountKeeper *nfttestutil.MockAccountKeeper
|
||||
bankKeeper *nfttestutil.MockBankKeeper
|
||||
nftKeeper nftkeeper.Keeper
|
||||
encCfg moduletestutil.TestEncodingConfig
|
||||
}
|
||||
|
||||
func (suite *SimTestSuite) SetupTest() {
|
||||
app, err := simtestutil.Setup(
|
||||
testutil.AppConfig,
|
||||
&suite.codec,
|
||||
&suite.interfaceRegistry,
|
||||
&suite.accountKeeper,
|
||||
&suite.bankKeeper,
|
||||
&suite.stakingKeeper,
|
||||
&suite.nftKeeper,
|
||||
)
|
||||
suite.Require().NoError(err)
|
||||
key := sdk.NewKVStoreKey(nft.StoreKey)
|
||||
// suite setup
|
||||
addrs := simtestutil.CreateIncrementalAccounts(3)
|
||||
suite.encCfg = moduletestutil.MakeTestEncodingConfig(module.AppModuleBasic{})
|
||||
|
||||
// gomock initializations
|
||||
ctrl := gomock.NewController(suite.T())
|
||||
suite.accountKeeper = nfttestutil.NewMockAccountKeeper(ctrl)
|
||||
suite.bankKeeper = nfttestutil.NewMockBankKeeper(ctrl)
|
||||
|
||||
suite.accountKeeper.EXPECT().GetModuleAddress(nft.ModuleName).Return(addrs[0]).AnyTimes()
|
||||
|
||||
testCtx := testutil.DefaultContextWithDB(suite.T(), key, sdk.NewTransientStoreKey("transient_test"))
|
||||
suite.baseApp = baseapp.NewBaseApp(
|
||||
"nft",
|
||||
log.NewNopLogger(),
|
||||
testCtx.DB,
|
||||
suite.encCfg.TxConfig.TxDecoder(),
|
||||
)
|
||||
|
||||
suite.baseApp.SetCMS(testCtx.CMS)
|
||||
|
||||
suite.baseApp.SetInterfaceRegistry(suite.encCfg.InterfaceRegistry)
|
||||
suite.ctx = testCtx.Ctx.WithBlockHeader(tmproto.Header{Time: tmtime.Now()})
|
||||
|
||||
suite.nftKeeper = keeper.NewKeeper(key, suite.encCfg.Codec, suite.accountKeeper, suite.bankKeeper)
|
||||
queryHelper := baseapp.NewQueryServerTestHelper(suite.ctx, suite.encCfg.InterfaceRegistry)
|
||||
nft.RegisterQueryServer(queryHelper, suite.nftKeeper)
|
||||
|
||||
cfg := moduletypes.NewConfigurator(suite.encCfg.Codec, suite.baseApp.MsgServiceRouter(), suite.baseApp.GRPCQueryRouter())
|
||||
|
||||
appModule := module.NewAppModule(suite.encCfg.Codec, suite.nftKeeper, suite.accountKeeper, suite.bankKeeper, suite.encCfg.InterfaceRegistry)
|
||||
appModule.RegisterServices(cfg)
|
||||
appModule.RegisterInterfaces(suite.encCfg.InterfaceRegistry)
|
||||
|
||||
suite.app = app
|
||||
suite.ctx = app.BaseApp.NewContext(false, tmproto.Header{})
|
||||
}
|
||||
|
||||
func (suite *SimTestSuite) TestWeightedOperations() {
|
||||
weightedOps := simulation.WeightedOperations(
|
||||
suite.interfaceRegistry,
|
||||
suite.encCfg.InterfaceRegistry,
|
||||
make(simtypes.AppParams),
|
||||
suite.codec,
|
||||
suite.encCfg.Codec,
|
||||
suite.accountKeeper,
|
||||
suite.bankKeeper,
|
||||
suite.nftKeeper,
|
||||
)
|
||||
|
||||
// begin new block
|
||||
suite.baseApp.BeginBlock(abci.RequestBeginBlock{
|
||||
Header: tmproto.Header{
|
||||
Height: suite.baseApp.LastBlockHeight() + 1,
|
||||
AppHash: suite.baseApp.LastCommitID().Hash,
|
||||
},
|
||||
})
|
||||
|
||||
// setup 3 accounts
|
||||
s := rand.NewSource(1)
|
||||
r := rand.New(s)
|
||||
accs := suite.getTestingAccounts(r, 3)
|
||||
|
||||
suite.accountKeeper.EXPECT().GetAccount(suite.ctx, accs[2].Address).Return(authtypes.NewBaseAccount(accs[2].Address, accs[2].PubKey, 0, 0)).Times(1)
|
||||
suite.bankKeeper.EXPECT().SpendableCoins(suite.ctx, accs[2].Address).Return(sdk.Coins{sdk.NewInt64Coin("stake", 10)}).Times(1)
|
||||
|
||||
expected := []struct {
|
||||
weight int
|
||||
opMsgRoute string
|
||||
@ -80,7 +112,7 @@ func (suite *SimTestSuite) TestWeightedOperations() {
|
||||
}
|
||||
|
||||
for i, w := range weightedOps {
|
||||
operationMsg, _, err := w.Op()(r, suite.app.BaseApp, suite.ctx, accs, "")
|
||||
operationMsg, _, err := w.Op()(r, suite.baseApp, suite.ctx, accs, "")
|
||||
suite.Require().NoError(err)
|
||||
|
||||
// the following checks are very much dependent from the ordering of the output given
|
||||
@ -94,17 +126,6 @@ func (suite *SimTestSuite) TestWeightedOperations() {
|
||||
|
||||
func (suite *SimTestSuite) getTestingAccounts(r *rand.Rand, n int) []simtypes.Account {
|
||||
accounts := simtypes.RandomAccounts(r, n)
|
||||
|
||||
initAmt := suite.stakingKeeper.TokensFromConsensusPower(suite.ctx, 200000)
|
||||
initCoins := sdk.NewCoins(sdk.NewCoin("stake", initAmt))
|
||||
|
||||
// add coins to the accounts
|
||||
for _, account := range accounts {
|
||||
acc := suite.accountKeeper.NewAccountWithAddress(suite.ctx, account.Address)
|
||||
suite.accountKeeper.SetAccount(suite.ctx, acc)
|
||||
suite.Require().NoError(banktestutil.FundAccount(suite.bankKeeper, suite.ctx, account.Address, initCoins))
|
||||
}
|
||||
|
||||
return accounts
|
||||
}
|
||||
|
||||
@ -115,22 +136,26 @@ func (suite *SimTestSuite) TestSimulateMsgSend() {
|
||||
blockTime := time.Now().UTC()
|
||||
ctx := suite.ctx.WithBlockTime(blockTime)
|
||||
|
||||
acc := authtypes.NewBaseAccount(accounts[0].Address, accounts[0].PubKey, 0, 0)
|
||||
suite.accountKeeper.EXPECT().GetAccount(ctx, accounts[0].Address).Return(acc).Times(1)
|
||||
suite.bankKeeper.EXPECT().SpendableCoins(ctx, accounts[0].Address).Return(sdk.Coins{sdk.NewInt64Coin("stake", 10)}).Times(1)
|
||||
|
||||
// begin new block
|
||||
suite.app.BeginBlock(abci.RequestBeginBlock{
|
||||
suite.baseApp.BeginBlock(abci.RequestBeginBlock{
|
||||
Header: tmproto.Header{
|
||||
Height: suite.app.LastBlockHeight() + 1,
|
||||
AppHash: suite.app.LastCommitID().Hash,
|
||||
Height: suite.baseApp.LastBlockHeight() + 1,
|
||||
AppHash: suite.baseApp.LastCommitID().Hash,
|
||||
},
|
||||
})
|
||||
|
||||
// execute operation
|
||||
registry := suite.interfaceRegistry
|
||||
registry := suite.encCfg.InterfaceRegistry
|
||||
op := simulation.SimulateMsgSend(codec.NewProtoCodec(registry), suite.accountKeeper, suite.bankKeeper, suite.nftKeeper)
|
||||
operationMsg, futureOperations, err := op(r, suite.app.BaseApp, ctx, accounts, "")
|
||||
operationMsg, futureOperations, err := op(r, suite.baseApp, ctx, accounts, "")
|
||||
suite.Require().NoError(err)
|
||||
|
||||
var msg nft.MsgSend
|
||||
suite.codec.UnmarshalJSON(operationMsg.Msg, &msg)
|
||||
suite.encCfg.Codec.UnmarshalJSON(operationMsg.Msg, &msg)
|
||||
suite.Require().True(operationMsg.OK)
|
||||
suite.Require().Len(futureOperations, 0)
|
||||
}
|
||||
|
||||
@ -1,52 +0,0 @@
|
||||
modules:
|
||||
- name: runtime
|
||||
config:
|
||||
"@type": cosmos.app.runtime.v1alpha1.Module
|
||||
|
||||
app_name: NFTApp
|
||||
|
||||
begin_blockers: [staking, auth, bank, mint, genutil, nft, params]
|
||||
end_blockers: [staking, auth, bank, mint, genutil, nft, params]
|
||||
init_genesis: [auth, bank, staking, mint, genutil, nft, params]
|
||||
|
||||
- name: auth
|
||||
config:
|
||||
"@type": cosmos.auth.module.v1.Module
|
||||
bech32_prefix: cosmos
|
||||
module_account_permissions:
|
||||
- account: fee_collector
|
||||
- account: mint
|
||||
permissions: [minter]
|
||||
- account: bonded_tokens_pool
|
||||
permissions: [burner, staking]
|
||||
- account: not_bonded_tokens_pool
|
||||
permissions: [burner, staking]
|
||||
- account: nft
|
||||
|
||||
- name: bank
|
||||
config:
|
||||
"@type": cosmos.bank.module.v1.Module
|
||||
|
||||
- name: params
|
||||
config:
|
||||
"@type": cosmos.params.module.v1.Module
|
||||
|
||||
- name: tx
|
||||
config:
|
||||
"@type": cosmos.tx.module.v1.Module
|
||||
|
||||
- name: staking
|
||||
config:
|
||||
"@type": cosmos.staking.module.v1.Module
|
||||
|
||||
- name: genutil
|
||||
config:
|
||||
"@type": cosmos.genutil.module.v1.Module
|
||||
|
||||
- name: mint
|
||||
config:
|
||||
"@type": cosmos.mint.module.v1.Module
|
||||
|
||||
- name: nft
|
||||
config:
|
||||
"@type": cosmos.nft.module.v1.Module
|
||||
@ -1,20 +1,108 @@
|
||||
package testutil
|
||||
|
||||
import (
|
||||
_ "embed"
|
||||
|
||||
"cosmossdk.io/core/appconfig"
|
||||
_ "github.com/cosmos/cosmos-sdk/x/auth"
|
||||
_ "github.com/cosmos/cosmos-sdk/x/auth/tx/module"
|
||||
_ "github.com/cosmos/cosmos-sdk/x/bank"
|
||||
_ "github.com/cosmos/cosmos-sdk/x/genutil"
|
||||
_ "github.com/cosmos/cosmos-sdk/x/mint"
|
||||
_ "github.com/cosmos/cosmos-sdk/x/nft/module"
|
||||
_ "github.com/cosmos/cosmos-sdk/x/params"
|
||||
_ "github.com/cosmos/cosmos-sdk/x/staking"
|
||||
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
|
||||
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
|
||||
genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types"
|
||||
minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
|
||||
"github.com/cosmos/cosmos-sdk/x/nft"
|
||||
paramstypes "github.com/cosmos/cosmos-sdk/x/params/types"
|
||||
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
|
||||
|
||||
runtimev1alpha1 "cosmossdk.io/api/cosmos/app/runtime/v1alpha1"
|
||||
appv1alpha1 "cosmossdk.io/api/cosmos/app/v1alpha1"
|
||||
authmodulev1 "cosmossdk.io/api/cosmos/auth/module/v1"
|
||||
bankmodulev1 "cosmossdk.io/api/cosmos/bank/module/v1"
|
||||
genutilmodulev1 "cosmossdk.io/api/cosmos/genutil/module/v1"
|
||||
mintmodulev1 "cosmossdk.io/api/cosmos/mint/module/v1"
|
||||
nftmodulev1 "cosmossdk.io/api/cosmos/nft/module/v1"
|
||||
paramsmodulev1 "cosmossdk.io/api/cosmos/params/module/v1"
|
||||
stakingmodulev1 "cosmossdk.io/api/cosmos/staking/module/v1"
|
||||
txmodulev1 "cosmossdk.io/api/cosmos/tx/module/v1"
|
||||
)
|
||||
|
||||
//go:embed app.yaml
|
||||
var appConfig []byte
|
||||
|
||||
var AppConfig = appconfig.LoadYAML(appConfig)
|
||||
var AppConfig = appconfig.Compose(&appv1alpha1.Config{
|
||||
Modules: []*appv1alpha1.ModuleConfig{
|
||||
{
|
||||
Name: "runtime",
|
||||
Config: appconfig.WrapAny(&runtimev1alpha1.Module{
|
||||
AppName: "NFTApp",
|
||||
BeginBlockers: []string{
|
||||
minttypes.ModuleName,
|
||||
stakingtypes.ModuleName,
|
||||
authtypes.ModuleName,
|
||||
banktypes.ModuleName,
|
||||
genutiltypes.ModuleName,
|
||||
nft.ModuleName,
|
||||
paramstypes.ModuleName,
|
||||
},
|
||||
EndBlockers: []string{
|
||||
stakingtypes.ModuleName,
|
||||
authtypes.ModuleName,
|
||||
banktypes.ModuleName,
|
||||
minttypes.ModuleName,
|
||||
genutiltypes.ModuleName,
|
||||
nft.ModuleName,
|
||||
paramstypes.ModuleName,
|
||||
},
|
||||
OverrideStoreKeys: []*runtimev1alpha1.StoreKeyConfig{
|
||||
{
|
||||
ModuleName: authtypes.ModuleName,
|
||||
KvStoreKey: "acc",
|
||||
},
|
||||
},
|
||||
InitGenesis: []string{
|
||||
authtypes.ModuleName,
|
||||
banktypes.ModuleName,
|
||||
stakingtypes.ModuleName,
|
||||
minttypes.ModuleName,
|
||||
genutiltypes.ModuleName,
|
||||
nft.ModuleName,
|
||||
paramstypes.ModuleName,
|
||||
},
|
||||
}),
|
||||
},
|
||||
{
|
||||
Name: authtypes.ModuleName,
|
||||
Config: appconfig.WrapAny(&authmodulev1.Module{
|
||||
Bech32Prefix: "cosmos",
|
||||
ModuleAccountPermissions: []*authmodulev1.ModuleAccountPermission{
|
||||
{Account: authtypes.FeeCollectorName},
|
||||
{Account: minttypes.ModuleName, Permissions: []string{authtypes.Minter}},
|
||||
{Account: stakingtypes.BondedPoolName, Permissions: []string{authtypes.Burner, stakingtypes.ModuleName}},
|
||||
{Account: stakingtypes.NotBondedPoolName, Permissions: []string{authtypes.Burner, stakingtypes.ModuleName}},
|
||||
{Account: nft.ModuleName},
|
||||
},
|
||||
}),
|
||||
},
|
||||
{
|
||||
Name: banktypes.ModuleName,
|
||||
Config: appconfig.WrapAny(&bankmodulev1.Module{}),
|
||||
},
|
||||
{
|
||||
Name: stakingtypes.ModuleName,
|
||||
Config: appconfig.WrapAny(&stakingmodulev1.Module{}),
|
||||
},
|
||||
{
|
||||
Name: paramstypes.ModuleName,
|
||||
Config: appconfig.WrapAny(¶msmodulev1.Module{}),
|
||||
},
|
||||
{
|
||||
Name: "tx",
|
||||
Config: appconfig.WrapAny(&txmodulev1.Module{}),
|
||||
},
|
||||
{
|
||||
Name: genutiltypes.ModuleName,
|
||||
Config: appconfig.WrapAny(&genutilmodulev1.Module{}),
|
||||
},
|
||||
{
|
||||
Name: minttypes.ModuleName,
|
||||
Config: appconfig.WrapAny(&mintmodulev1.Module{}),
|
||||
},
|
||||
{
|
||||
Name: nft.ModuleName,
|
||||
Config: appconfig.WrapAny(&nftmodulev1.Module{}),
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
101
x/nft/testutil/expected_keepers_mocks.go
Normal file
101
x/nft/testutil/expected_keepers_mocks.go
Normal file
@ -0,0 +1,101 @@
|
||||
// Code generated by MockGen. DO NOT EDIT.
|
||||
// Source: x/nft/expected_keepers.go
|
||||
|
||||
// Package testutil is a generated GoMock package.
|
||||
package testutil
|
||||
|
||||
import (
|
||||
reflect "reflect"
|
||||
|
||||
types "github.com/cosmos/cosmos-sdk/types"
|
||||
types0 "github.com/cosmos/cosmos-sdk/x/auth/types"
|
||||
gomock "github.com/golang/mock/gomock"
|
||||
)
|
||||
|
||||
// MockBankKeeper is a mock of BankKeeper interface.
|
||||
type MockBankKeeper struct {
|
||||
ctrl *gomock.Controller
|
||||
recorder *MockBankKeeperMockRecorder
|
||||
}
|
||||
|
||||
// MockBankKeeperMockRecorder is the mock recorder for MockBankKeeper.
|
||||
type MockBankKeeperMockRecorder struct {
|
||||
mock *MockBankKeeper
|
||||
}
|
||||
|
||||
// NewMockBankKeeper creates a new mock instance.
|
||||
func NewMockBankKeeper(ctrl *gomock.Controller) *MockBankKeeper {
|
||||
mock := &MockBankKeeper{ctrl: ctrl}
|
||||
mock.recorder = &MockBankKeeperMockRecorder{mock}
|
||||
return mock
|
||||
}
|
||||
|
||||
// EXPECT returns an object that allows the caller to indicate expected use.
|
||||
func (m *MockBankKeeper) EXPECT() *MockBankKeeperMockRecorder {
|
||||
return m.recorder
|
||||
}
|
||||
|
||||
// SpendableCoins mocks base method.
|
||||
func (m *MockBankKeeper) SpendableCoins(ctx types.Context, addr types.AccAddress) types.Coins {
|
||||
m.ctrl.T.Helper()
|
||||
ret := m.ctrl.Call(m, "SpendableCoins", ctx, addr)
|
||||
ret0, _ := ret[0].(types.Coins)
|
||||
return ret0
|
||||
}
|
||||
|
||||
// SpendableCoins indicates an expected call of SpendableCoins.
|
||||
func (mr *MockBankKeeperMockRecorder) SpendableCoins(ctx, addr interface{}) *gomock.Call {
|
||||
mr.mock.ctrl.T.Helper()
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SpendableCoins", reflect.TypeOf((*MockBankKeeper)(nil).SpendableCoins), ctx, addr)
|
||||
}
|
||||
|
||||
// MockAccountKeeper is a mock of AccountKeeper interface.
|
||||
type MockAccountKeeper struct {
|
||||
ctrl *gomock.Controller
|
||||
recorder *MockAccountKeeperMockRecorder
|
||||
}
|
||||
|
||||
// MockAccountKeeperMockRecorder is the mock recorder for MockAccountKeeper.
|
||||
type MockAccountKeeperMockRecorder struct {
|
||||
mock *MockAccountKeeper
|
||||
}
|
||||
|
||||
// NewMockAccountKeeper creates a new mock instance.
|
||||
func NewMockAccountKeeper(ctrl *gomock.Controller) *MockAccountKeeper {
|
||||
mock := &MockAccountKeeper{ctrl: ctrl}
|
||||
mock.recorder = &MockAccountKeeperMockRecorder{mock}
|
||||
return mock
|
||||
}
|
||||
|
||||
// EXPECT returns an object that allows the caller to indicate expected use.
|
||||
func (m *MockAccountKeeper) EXPECT() *MockAccountKeeperMockRecorder {
|
||||
return m.recorder
|
||||
}
|
||||
|
||||
// GetAccount mocks base method.
|
||||
func (m *MockAccountKeeper) GetAccount(ctx types.Context, addr types.AccAddress) types0.AccountI {
|
||||
m.ctrl.T.Helper()
|
||||
ret := m.ctrl.Call(m, "GetAccount", ctx, addr)
|
||||
ret0, _ := ret[0].(types0.AccountI)
|
||||
return ret0
|
||||
}
|
||||
|
||||
// GetAccount indicates an expected call of GetAccount.
|
||||
func (mr *MockAccountKeeperMockRecorder) GetAccount(ctx, addr interface{}) *gomock.Call {
|
||||
mr.mock.ctrl.T.Helper()
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAccount", reflect.TypeOf((*MockAccountKeeper)(nil).GetAccount), ctx, addr)
|
||||
}
|
||||
|
||||
// GetModuleAddress mocks base method.
|
||||
func (m *MockAccountKeeper) GetModuleAddress(name string) types.AccAddress {
|
||||
m.ctrl.T.Helper()
|
||||
ret := m.ctrl.Call(m, "GetModuleAddress", name)
|
||||
ret0, _ := ret[0].(types.AccAddress)
|
||||
return ret0
|
||||
}
|
||||
|
||||
// GetModuleAddress indicates an expected call of GetModuleAddress.
|
||||
func (mr *MockAccountKeeperMockRecorder) GetModuleAddress(name interface{}) *gomock.Call {
|
||||
mr.mock.ctrl.T.Helper()
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetModuleAddress", reflect.TypeOf((*MockAccountKeeper)(nil).GetModuleAddress), name)
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user