diff --git a/app/export_test.go b/app/export_test.go index 5198f7146..e76d3c91b 100644 --- a/app/export_test.go +++ b/app/export_test.go @@ -24,7 +24,7 @@ func TestExportAppStateAndValidators(t *testing.T) { t.Run(tc.name, func(t *testing.T) { app := Setup(t, false) app.Commit() - _, err := app.ExportAppStateAndValidators(tc.forZeroHeight, []string{}) + _, err := app.ExportAppStateAndValidators(tc.forZeroHeight, []string{}, []string{}) require.NoError(t, err, "ExportAppStateAndValidators should not have an error") }) } diff --git a/app/sim_test.go b/app/sim_test.go index 92686c612..642e87e26 100644 --- a/app/sim_test.go +++ b/app/sim_test.go @@ -19,6 +19,7 @@ import ( "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/store" storetypes "github.com/cosmos/cosmos-sdk/store/types" + simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" sdk "github.com/cosmos/cosmos-sdk/types" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -31,6 +32,7 @@ import ( minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" "github.com/cosmos/cosmos-sdk/x/simulation" + simcli "github.com/cosmos/cosmos-sdk/x/simulation/client/cli" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" nfttypes "github.com/crypto-org-chain/chain-main/v4/x/nft/types" @@ -38,7 +40,7 @@ import ( // Get flags every time the simulator is run func init() { - simapp.GetSimulatorFlags() + simcli.GetSimulatorFlags() } type StoreKeysPrefixes struct { @@ -60,20 +62,21 @@ func interBlockCacheOpt() func(*baseapp.BaseApp) { } func TestFullAppSimulation(t *testing.T) { - config, db, dir, logger, skip, err := simapp.SetupSimulation("leveldb-app-sim", "Simulation") + config := simcli.NewConfigFromFlags() + config.ChainID = SimAppChainID + + db, dir, logger, skip, err := simtestutil.SetupSimulation(config, "leveldb-app-sim", "Simulation", simcli.FlagVerboseValue, simcli.FlagEnabledValue) if skip { t.Skip("skipping application simulation") } require.NoError(t, err, "simulation setup failed") - config.ChainID = simapp.SimAppChainID - defer func() { db.Close() require.NoError(t, os.RemoveAll(dir)) }() app := New(logger, db, nil, true, map[int64]bool{}, - dir, simapp.FlagPeriodValue, MakeEncodingConfig(), EmptyAppOptions{}, fauxMerkleModeOpt) + dir, simcli.FlagPeriodValue, MakeEncodingConfig(), EmptyAppOptions{}, fauxMerkleModeOpt) require.Equal(t, "chain-maind", app.Name()) // run randomized simulation @@ -83,38 +86,39 @@ func TestFullAppSimulation(t *testing.T) { app.BaseApp, AppStateFn(app.AppCodec(), app.SimulationManager()), simtypes.RandomAccounts, // Replace with own random account function if using keys other than secp256k1 - simapp.SimulationOperations(app, app.AppCodec(), config), + simtestutil.SimulationOperations(app, app.AppCodec(), config), app.ModuleAccountAddrs(), config, app.AppCodec(), ) // export state and simParams before the simulation error is checked - err = simapp.CheckExportSimulation(app, config, simParams) + err = simtestutil.CheckExportSimulation(app, config, simParams) require.NoError(t, err) require.NoError(t, simErr) if config.Commit { - simapp.PrintStats(db) + simtestutil.PrintStats(db) } } func TestAppImportExport(t *testing.T) { - config, db, dir, logger, skip, err := simapp.SetupSimulation("leveldb-app-sim", "Simulation") + config := simcli.NewConfigFromFlags() + config.ChainID = SimAppChainID + + db, dir, logger, skip, err := simtestutil.SetupSimulation(config, "leveldb-app-sim", "Simulation", simcli.FlagVerboseValue, simcli.FlagEnabledValue) if skip { t.Skip("skipping application import/export simulation") } require.NoError(t, err, "simulation setup failed") - config.ChainID = simapp.SimAppChainID - defer func() { db.Close() require.NoError(t, os.RemoveAll(dir)) }() app := New(logger, db, nil, true, map[int64]bool{}, - dir, simapp.FlagPeriodValue, MakeEncodingConfig(), EmptyAppOptions{}, fauxMerkleModeOpt) + dir, simcli.FlagPeriodValue, MakeEncodingConfig(), EmptyAppOptions{}, fauxMerkleModeOpt) require.Equal(t, "chain-maind", app.Name()) // Run randomized simulation @@ -124,30 +128,30 @@ func TestAppImportExport(t *testing.T) { app.BaseApp, AppStateFn(app.AppCodec(), app.SimulationManager()), simtypes.RandomAccounts, // Replace with own random account function if using keys other than secp256k1 - simapp.SimulationOperations(app, app.AppCodec(), config), + simtestutil.SimulationOperations(app, app.AppCodec(), config), app.ModuleAccountAddrs(), config, app.AppCodec(), ) // export state and simParams before the simulation error is checked - err = simapp.CheckExportSimulation(app, config, simParams) + err = simtestutil.CheckExportSimulation(app, config, simParams) require.NoError(t, err) require.NoError(t, simErr) if config.Commit { - simapp.PrintStats(db) + simtestutil.PrintStats(db) } fmt.Printf("exporting genesis...\n") - exported, err := app.ExportAppStateAndValidators(false, []string{}) + exported, err := app.ExportAppStateAndValidators(false, []string{}, []string{}) require.NoError(t, err) fmt.Printf("importing genesis...\n") // nolint: dogsled - _, newDB, newDir, _, _, err := simapp.SetupSimulation("leveldb-app-sim-2", "Simulation-2") + newDB, newDir, _, _, err := simtestutil.SetupSimulation(config, "leveldb-app-sim-2", "Simulation-2", simcli.FlagVerboseValue, simcli.FlagEnabledValue) require.NoError(t, err, "simulation setup failed") defer func() { @@ -156,7 +160,7 @@ func TestAppImportExport(t *testing.T) { }() newApp := New(log.NewNopLogger(), newDB, nil, true, map[int64]bool{}, - newDir, simapp.FlagPeriodValue, MakeEncodingConfig(), EmptyAppOptions{}, fauxMerkleModeOpt) + newDir, simcli.FlagPeriodValue, MakeEncodingConfig(), EmptyAppOptions{}, fauxMerkleModeOpt) require.Equal(t, "chain-maind", newApp.Name()) var genesisState GenesisState @@ -174,7 +178,7 @@ func TestAppImportExport(t *testing.T) { } }() - header := tmproto.Header{Height: app.LastBlockHeight(), ChainID: simapp.SimAppChainID} + header := tmproto.Header{Height: app.LastBlockHeight(), ChainID: SimAppChainID} ctxA := app.NewContext(true, header) ctxB := newApp.NewContext(true, header) newApp.mm.InitGenesis(ctxB, app.AppCodec(), genesisState) @@ -216,13 +220,13 @@ func TestAppImportExport(t *testing.T) { } func TestAppSimulationAfterImport(t *testing.T) { - config, db, dir, logger, skip, err := simapp.SetupSimulation("leveldb-app-sim", "Simulation") + config, db, dir, logger, skip, err := simtestutil.SetupSimulation(config, "leveldb-app-sim", "Simulation") if skip { t.Skip("skipping application simulation after import") } require.NoError(t, err, "simulation setup failed") - config.ChainID = simapp.SimAppChainID + config.ChainID = SimAppChainID defer func() { db.Close() @@ -230,7 +234,7 @@ func TestAppSimulationAfterImport(t *testing.T) { }() app := New(logger, db, nil, true, map[int64]bool{}, - dir, simapp.FlagPeriodValue, MakeEncodingConfig(), EmptyAppOptions{}, fauxMerkleModeOpt) + dir, simcli.FlagPeriodValue, MakeEncodingConfig(), EmptyAppOptions{}, fauxMerkleModeOpt) require.Equal(t, "chain-maind", app.Name()) // Run randomized simulation @@ -240,19 +244,19 @@ func TestAppSimulationAfterImport(t *testing.T) { app.BaseApp, AppStateFn(app.AppCodec(), app.SimulationManager()), simtypes.RandomAccounts, // Replace with own random account function if using keys other than secp256k1 - simapp.SimulationOperations(app, app.AppCodec(), config), + simtestutil.SimulationOperations(app, app.AppCodec(), config), app.ModuleAccountAddrs(), config, app.AppCodec(), ) // export state and simParams before the simulation error is checked - err = simapp.CheckExportSimulation(app, config, simParams) + err = simtestutil.CheckExportSimulation(app, config, simParams) require.NoError(t, err) require.NoError(t, simErr) if config.Commit { - simapp.PrintStats(db) + simtestutil.PrintStats(db) } if stopEarly { @@ -262,13 +266,13 @@ func TestAppSimulationAfterImport(t *testing.T) { fmt.Printf("exporting genesis...\n") - exported, err := app.ExportAppStateAndValidators(true, []string{}) + exported, err := app.ExportAppStateAndValidators(true, []string{}, []string{}) require.NoError(t, err) fmt.Printf("importing genesis...\n") // nolint: dogsled - _, newDB, newDir, _, _, err := simapp.SetupSimulation("leveldb-app-sim-2", "Simulation-2") + newDB, newDir, _, _, err := simtestutil.SetupSimulation(config, "leveldb-app-sim-2", "Simulation-2", simcli.FlagVerboseValue, simcli.FlagEnabledValue) require.NoError(t, err, "simulation setup failed") defer func() { @@ -277,11 +281,11 @@ func TestAppSimulationAfterImport(t *testing.T) { }() newApp := New(log.NewNopLogger(), newDB, nil, true, map[int64]bool{}, - newDir, simapp.FlagPeriodValue, MakeEncodingConfig(), EmptyAppOptions{}, fauxMerkleModeOpt) + newDir, simcli.FlagPeriodValue, MakeEncodingConfig(), EmptyAppOptions{}, fauxMerkleModeOpt) require.Equal(t, "chain-maind", newApp.Name()) newApp.InitChain(abci.RequestInitChain{ - ChainId: simapp.SimAppChainID, + ChainId: SimAppChainID, AppStateBytes: exported.AppState, }) @@ -291,7 +295,7 @@ func TestAppSimulationAfterImport(t *testing.T) { newApp.BaseApp, AppStateFn(app.AppCodec(), app.SimulationManager()), simtypes.RandomAccounts, // Replace with own random account function if using keys other than secp256k1 - simapp.SimulationOperations(newApp, newApp.AppCodec(), config), + simtestutil.SimulationOperations(newApp, newApp.AppCodec(), config), app.ModuleAccountAddrs(), config, app.AppCodec(), @@ -311,7 +315,7 @@ func TestAppStateDeterminism(t *testing.T) { config.ExportParamsPath = "" config.OnOperation = false config.AllInvariants = false - config.ChainID = simapp.SimAppChainID + config.ChainID = SimAppChainID numSeeds := 3 numTimesToRunPerSeed := 5 @@ -323,7 +327,7 @@ func TestAppStateDeterminism(t *testing.T) { for j := 0; j < numTimesToRunPerSeed; j++ { var logger log.Logger - if simapp.FlagVerboseValue { + if simcli.FlagVerboseValue { logger = log.TestingLogger() } else { logger = log.NewNopLogger() @@ -331,7 +335,7 @@ func TestAppStateDeterminism(t *testing.T) { db := dbm.NewMemDB() app := New(logger, db, nil, true, map[int64]bool{}, - simapp.DefaultNodeHome, simapp.FlagPeriodValue, MakeEncodingConfig(), EmptyAppOptions{}, interBlockCacheOpt()) + simapp.DefaultNodeHome, simcli.FlagPeriodValue, MakeEncodingConfig(), EmptyAppOptions{}, interBlockCacheOpt()) fmt.Printf( "running non-determinism simulation; seed %d: %d/%d, attempt: %d/%d\n", @@ -344,7 +348,7 @@ func TestAppStateDeterminism(t *testing.T) { app.BaseApp, AppStateFn(app.AppCodec(), app.SimulationManager()), simtypes.RandomAccounts, // Replace with own random account function if using keys other than secp256k1 - simapp.SimulationOperations(app, app.AppCodec(), config), + simtestutil.SimulationOperations(app, app.AppCodec(), config), app.ModuleAccountAddrs(), config, app.AppCodec(), @@ -352,7 +356,7 @@ func TestAppStateDeterminism(t *testing.T) { require.NoError(t, err) if config.Commit { - simapp.PrintStats(db) + simtestutil.PrintStats(db) } appHash := app.LastCommitID().Hash diff --git a/app/test_helpers.go b/app/test_helpers.go index e81eb2c9a..6e2591634 100644 --- a/app/test_helpers.go +++ b/app/test_helpers.go @@ -36,6 +36,10 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) +const ( + SimAppChainID = "simulation_777-1" +) + // DefaultConsensusParams defines the default Tendermint consensus params used in // ChainApp testing. var DefaultConsensusParams = &tmproto.ConsensusParams{ diff --git a/x/nft/client/cli/cli_test.go b/x/nft/client/cli/cli_test.go index 73777f346..fcf5317c6 100644 --- a/x/nft/client/cli/cli_test.go +++ b/x/nft/client/cli/cli_test.go @@ -10,8 +10,8 @@ import ( "github.com/stretchr/testify/suite" "github.com/tidwall/gjson" + "cosmossdk.io/simapp" "github.com/cometbft/cometbft/crypto" - "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/testutil/network" sdk "github.com/cosmos/cosmos-sdk/types" @@ -33,7 +33,7 @@ func (s *IntegrationTestSuite) SetupSuite() { var err error s.T().Log("setting up integration test suite") - cfg := network.DefaultConfig() + cfg := network.DefaultConfig(simapp.NewTestNetworkFixture) cfg.AppConstructor = nfttestutil.GetApp cfg.NumValidators = 2 @@ -79,7 +79,7 @@ func (s *IntegrationTestSuite) TestNft() { fmt.Sprintf("--%s=%s", nftcli.FlagSchema, schema), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + 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()), } @@ -131,7 +131,7 @@ func (s *IntegrationTestSuite) TestNft() { fmt.Sprintf("--%s=%s", nftcli.FlagTokenName, tokenName), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + 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()), } @@ -191,7 +191,7 @@ func (s *IntegrationTestSuite) TestNft() { fmt.Sprintf("--%s=%s", nftcli.FlagTokenName, newTokenName), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + 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()), } @@ -217,7 +217,7 @@ func (s *IntegrationTestSuite) TestNft() { args = []string{ fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + 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()), } @@ -249,7 +249,7 @@ func (s *IntegrationTestSuite) TestNft() { fmt.Sprintf("--%s=%s", nftcli.FlagTokenName, newTokenName), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + 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()), } @@ -270,7 +270,7 @@ func (s *IntegrationTestSuite) TestNft() { args = []string{ fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + 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()), } respType = proto.Message(&sdk.TxResponse{}) diff --git a/x/nft/client/testutil/test_helpers.go b/x/nft/client/testutil/test_helpers.go index 1108213b4..d5bc46ec7 100644 --- a/x/nft/client/testutil/test_helpers.go +++ b/x/nft/client/testutil/test_helpers.go @@ -18,18 +18,20 @@ import ( "github.com/crypto-org-chain/chain-main/v4/app" nftcli "github.com/crypto-org-chain/chain-main/v4/x/nft/client/cli" + dbm "github.com/cometbft/cometbft-db" servertypes "github.com/cosmos/cosmos-sdk/server/types" pruningtypes "github.com/cosmos/cosmos-sdk/store/pruning/types" - dbm "github.com/cometbft/cometbft-db" ) -func GetApp(val network.Validator) servertypes.Application { +func GetApp(val network.ValidatorI) servertypes.Application { + ctx := val.GetCtx() + appConfig := val.GetAppConfig() return app.New( - val.Ctx.Logger, dbm.NewMemDB(), nil, true, make(map[int64]bool), val.Ctx.Config.RootDir, 0, + ctx.Logger, dbm.NewMemDB(), nil, true, make(map[int64]bool), ctx.Config.RootDir, 0, app.MakeEncodingConfig(), simtestutil.EmptyAppOptions{}, - baseapp.SetPruning(pruningtypes.NewPruningOptionsFromString(val.AppConfig.Pruning)), - baseapp.SetMinGasPrices(val.AppConfig.MinGasPrices), + baseapp.SetPruning(pruningtypes.NewPruningOptionsFromString(appConfig.Pruning)), + baseapp.SetMinGasPrices(appConfig.MinGasPrices), ) } diff --git a/x/nft/keeper/querier_test.go b/x/nft/keeper/querier_test.go deleted file mode 100644 index 5cb30def6..000000000 --- a/x/nft/keeper/querier_test.go +++ /dev/null @@ -1,220 +0,0 @@ -// Copyright (c) 2016-2021 Shanghai Bianjie AI Technology Inc. (licensed under the Apache License, Version 2.0) -// Modifications Copyright (c) 2021-present Crypto.org (licensed under the Apache License, Version 2.0) -package keeper_test - -import ( - "encoding/binary" - - abci "github.com/cometbft/cometbft/abci/types" - - "github.com/crypto-org-chain/chain-main/v4/x/nft/exported" - keep "github.com/crypto-org-chain/chain-main/v4/x/nft/keeper" - "github.com/crypto-org-chain/chain-main/v4/x/nft/types" -) - -func (suite *KeeperSuite) TestNewQuerier() { - querier := keep.NewQuerier(suite.keeper, suite.legacyAmino) - query := abci.RequestQuery{ - Path: "", - Data: []byte{}, - } - _, err := querier(suite.ctx, []string{"foo", "bar"}, query) - suite.Error(err) -} - -func (suite *KeeperSuite) TestQuerySupply() { - // MintNFT shouldn't fail when collection does not exist - err := suite.keeper.MintNFT(suite.ctx, denomID, tokenID, tokenNm, tokenURI, tokenData, address, address) - suite.NoError(err) - - querier := keep.NewQuerier(suite.keeper, suite.legacyAmino) - - query := abci.RequestQuery{ - Path: "", - Data: []byte{}, - } - - query.Path = "/custom/nft/supply" - query.Data = []byte("?") - - res, err := querier(suite.ctx, []string{"supply"}, query) - suite.Error(err) - suite.Nil(res) - - queryCollectionParams := types.NewQuerySupplyParams(denomID2, nil) - bz, errRes := suite.legacyAmino.MarshalJSON(queryCollectionParams) - suite.Nil(errRes) - query.Data = bz - res, err = querier(suite.ctx, []string{"supply"}, query) - suite.NoError(err) - supplyResp := binary.LittleEndian.Uint64(res) - suite.Equal(0, int(supplyResp)) - - queryCollectionParams = types.NewQuerySupplyParams(denomID, nil) - bz, errRes = suite.legacyAmino.MarshalJSON(queryCollectionParams) - suite.Nil(errRes) - query.Data = bz - - res, err = querier(suite.ctx, []string{"supply"}, query) - suite.NoError(err) - suite.NotNil(res) - - supplyResp = binary.LittleEndian.Uint64(res) - suite.Equal(1, int(supplyResp)) -} - -func (suite *KeeperSuite) TestQueryCollection() { - // MintNFT shouldn't fail when collection does not exist - err := suite.keeper.MintNFT(suite.ctx, denomID, tokenID, tokenNm, tokenURI, tokenData, address, address) - suite.NoError(err) - - querier := keep.NewQuerier(suite.keeper, suite.legacyAmino) - - query := abci.RequestQuery{ - Path: "", - Data: []byte{}, - } - - query.Path = "/custom/nft/collection" - - query.Data = []byte("?") - res, err := querier(suite.ctx, []string{"collection"}, query) - suite.Error(err) - suite.Nil(res) - - queryCollectionParams := types.NewQuerySupplyParams(denomID2, nil) - bz, errRes := suite.legacyAmino.MarshalJSON(queryCollectionParams) - suite.Nil(errRes) - - query.Data = bz - _, err = querier(suite.ctx, []string{"collection"}, query) - suite.NoError(err) - - queryCollectionParams = types.NewQuerySupplyParams(denomID, nil) - bz, errRes = suite.legacyAmino.MarshalJSON(queryCollectionParams) - suite.Nil(errRes) - - query.Data = bz - res, err = querier(suite.ctx, []string{"collection"}, query) - suite.NoError(err) - suite.NotNil(res) - - var collection types.Collection - types.ModuleCdc.MustUnmarshalJSON(res, &collection) - suite.Len(collection.NFTs, 1) -} - -func (suite *KeeperSuite) TestQueryOwner() { - // MintNFT shouldn't fail when collection does not exist - err := suite.keeper.MintNFT(suite.ctx, denomID, tokenID, tokenNm, tokenURI, tokenData, address, address) - suite.NoError(err) - - err = suite.keeper.MintNFT(suite.ctx, denomID2, tokenID, tokenNm, tokenURI, tokenData, address, address) - suite.NoError(err) - - querier := keep.NewQuerier(suite.keeper, suite.legacyAmino) - query := abci.RequestQuery{ - Path: "/custom/nft/owner", - Data: []byte{}, - } - - query.Data = []byte("?") - _, err = querier(suite.ctx, []string{"owner"}, query) - suite.Error(err) - - // query the balance using no denomID so that all denoms will be returns - params := types.NewQuerySupplyParams("", address) - bz, err2 := suite.legacyAmino.MarshalJSON(params) - suite.Nil(err2) - query.Data = bz - - var out types.Owner - res, err := querier(suite.ctx, []string{"owner"}, query) - suite.NoError(err) - suite.NotNil(res) - - suite.legacyAmino.MustUnmarshalJSON(res, &out) - - // build the owner using both denoms - idCollection1 := types.NewIDCollection(denomID, []string{tokenID}) - idCollection2 := types.NewIDCollection(denomID2, []string{tokenID}) - owner := types.NewOwner(address, idCollection1, idCollection2) - - suite.EqualValues(out.String(), owner.String()) -} - -func (suite *KeeperSuite) TestQueryNFT() { - // MintNFT shouldn't fail when collection does not exist - err := suite.keeper.MintNFT(suite.ctx, denomID, tokenID, tokenNm, tokenURI, tokenData, address, address) - suite.NoError(err) - - querier := keep.NewQuerier(suite.keeper, suite.legacyAmino) - - query := abci.RequestQuery{ - Path: "", - Data: []byte{}, - } - query.Path = "/custom/nft/nft" - var res []byte - - query.Data = []byte("?") - res, err = querier(suite.ctx, []string{"nft"}, query) - suite.Error(err) - suite.Nil(res) - - params := types.NewQueryNFTParams(denomID2, tokenID2) - bz, err2 := suite.legacyAmino.MarshalJSON(params) - suite.Nil(err2) - - query.Data = bz - res, err = querier(suite.ctx, []string{"nft"}, query) - suite.Error(err) - suite.Nil(res) - - params = types.NewQueryNFTParams(denomID, tokenID) - bz, err2 = suite.legacyAmino.MarshalJSON(params) - suite.Nil(err2) - - query.Data = bz - res, err = querier(suite.ctx, []string{"nft"}, query) - suite.NoError(err) - suite.NotNil(res) - - var out exported.NFT - suite.legacyAmino.MustUnmarshalJSON(res, &out) - - suite.Equal(out.GetID(), tokenID) - suite.Equal(out.GetURI(), tokenURI) - suite.Equal(out.GetOwner(), address) -} - -func (suite *KeeperSuite) TestQueryDenoms() { - // MintNFT shouldn't fail when collection does not exist - err := suite.keeper.MintNFT(suite.ctx, denomID, tokenID, tokenNm, tokenURI, tokenData, address, address) - suite.NoError(err) - - err = suite.keeper.MintNFT(suite.ctx, denomID2, tokenID, tokenNm, tokenURI, tokenData, address, address) - suite.NoError(err) - - querier := keep.NewQuerier(suite.keeper, suite.legacyAmino) - - query := abci.RequestQuery{ - Path: "", - Data: []byte{}, - } - var res []byte - query.Path = "/custom/nft/denoms" - - res, err = querier(suite.ctx, []string{"denoms"}, query) - suite.NoError(err) - suite.NotNil(res) - - denoms := []string{denomID, denomID2} - - var out []types.Denom - suite.legacyAmino.MustUnmarshalJSON(res, &out) - - for key, denomInQuestion := range out { - suite.Equal(denomInQuestion.Id, denoms[key]) - } -}