package keeper_test import ( "context" "testing" "github.com/stretchr/testify/suite" "go.uber.org/mock/gomock" "cosmossdk.io/collections" "cosmossdk.io/core/appmodule" "cosmossdk.io/log" "cosmossdk.io/math" storetypes "cosmossdk.io/store/types" "cosmossdk.io/x/mint" "cosmossdk.io/x/mint/keeper" minttestutil "cosmossdk.io/x/mint/testutil" "cosmossdk.io/x/mint/types" "github.com/cosmos/cosmos-sdk/codec" codectestutil "github.com/cosmos/cosmos-sdk/codec/testutil" "github.com/cosmos/cosmos-sdk/runtime" "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" ) var minterAcc = authtypes.NewEmptyModuleAccount(types.ModuleName, authtypes.Minter) type GenesisTestSuite struct { suite.Suite sdkCtx sdk.Context keeper *keeper.Keeper cdc codec.BinaryCodec accountKeeper types.AccountKeeper key *storetypes.KVStoreKey } func TestGenesisTestSuite(t *testing.T) { suite.Run(t, new(GenesisTestSuite)) } func (s *GenesisTestSuite) SetupTest() { key := storetypes.NewKVStoreKey(types.StoreKey) testCtx := testutil.DefaultContextWithDB(s.T(), key, storetypes.NewTransientStoreKey("transient_test")) encCfg := moduletestutil.MakeTestEncodingConfig(codectestutil.CodecOptions{}, mint.AppModule{}) // gomock initializations ctrl := gomock.NewController(s.T()) s.cdc = codec.NewProtoCodec(encCfg.InterfaceRegistry) s.sdkCtx = testCtx.Ctx s.key = key accountKeeper := minttestutil.NewMockAccountKeeper(ctrl) bankKeeper := minttestutil.NewMockBankKeeper(ctrl) s.accountKeeper = accountKeeper accountKeeper.EXPECT().GetModuleAddress(minterAcc.Name).Return(minterAcc.GetAddress()) accountKeeper.EXPECT().GetModuleAccount(s.sdkCtx, minterAcc.Name).Return(minterAcc) s.keeper = keeper.NewKeeper(s.cdc, runtime.NewEnvironment(runtime.NewKVStoreService(key), log.NewNopLogger()), accountKeeper, bankKeeper, "", "") err := s.keeper.SetMintFn(func(ctx context.Context, env appmodule.Environment, minter *types.Minter, epochId string, epochNumber int64) error { return nil }) s.NoError(err) } func (s *GenesisTestSuite) TestImportExportGenesis() { genesisState := types.DefaultGenesisState() genesisState.Minter = types.NewMinter(math.LegacyNewDecWithPrec(20, 2), math.LegacyNewDec(1)) genesisState.Params = types.NewParams( "testDenom", math.LegacyNewDecWithPrec(15, 2), math.LegacyNewDecWithPrec(22, 2), math.LegacyNewDecWithPrec(9, 2), math.LegacyNewDecWithPrec(69, 2), uint64(60*60*8766/5), math.ZeroInt(), ) err := s.keeper.InitGenesis(s.sdkCtx, s.accountKeeper, genesisState) s.NoError(err) minter, err := s.keeper.Minter.Get(s.sdkCtx) s.Equal(genesisState.Minter, minter) s.NoError(err) invalidCtx := testutil.DefaultContextWithDB(s.T(), s.key, storetypes.NewTransientStoreKey("transient_test")) _, err = s.keeper.Minter.Get(invalidCtx.Ctx) s.ErrorIs(err, collections.ErrNotFound) params, err := s.keeper.Params.Get(s.sdkCtx) s.Equal(genesisState.Params, params) s.NoError(err) genesisState2, err := s.keeper.ExportGenesis(s.sdkCtx) s.NoError(err) s.Equal(genesisState, genesisState2) }