github.com/cosmos/cosmos-sdk@v0.50.10/x/authz/module/abci_test.go (about)

     1  package authz_test
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	"github.com/cometbft/cometbft/proto/tendermint/types"
     8  	"github.com/golang/mock/gomock"
     9  	"github.com/stretchr/testify/require"
    10  
    11  	"cosmossdk.io/log"
    12  	storetypes "cosmossdk.io/store/types"
    13  
    14  	"github.com/cosmos/cosmos-sdk/baseapp"
    15  	"github.com/cosmos/cosmos-sdk/codec/address"
    16  	"github.com/cosmos/cosmos-sdk/runtime"
    17  	"github.com/cosmos/cosmos-sdk/testutil"
    18  	simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims"
    19  	sdk "github.com/cosmos/cosmos-sdk/types"
    20  	moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil"
    21  	authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
    22  	"github.com/cosmos/cosmos-sdk/x/authz"
    23  	"github.com/cosmos/cosmos-sdk/x/authz/keeper"
    24  	authzmodule "github.com/cosmos/cosmos-sdk/x/authz/module"
    25  	authztestutil "github.com/cosmos/cosmos-sdk/x/authz/testutil"
    26  	banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
    27  )
    28  
    29  func TestExpiredGrantsQueue(t *testing.T) {
    30  	key := storetypes.NewKVStoreKey(keeper.StoreKey)
    31  	storeService := runtime.NewKVStoreService(key)
    32  	testCtx := testutil.DefaultContextWithDB(t, key, storetypes.NewTransientStoreKey("transient_test"))
    33  	encCfg := moduletestutil.MakeTestEncodingConfig(authzmodule.AppModuleBasic{})
    34  	ctx := testCtx.Ctx.WithBlockHeader(types.Header{})
    35  
    36  	baseApp := baseapp.NewBaseApp(
    37  		"authz",
    38  		log.NewNopLogger(),
    39  		testCtx.DB,
    40  		encCfg.TxConfig.TxDecoder(),
    41  	)
    42  	baseApp.SetCMS(testCtx.CMS)
    43  	baseApp.SetInterfaceRegistry(encCfg.InterfaceRegistry)
    44  
    45  	banktypes.RegisterInterfaces(encCfg.InterfaceRegistry)
    46  
    47  	addrs := simtestutil.CreateIncrementalAccounts(5)
    48  	granter := addrs[0]
    49  	grantee1 := addrs[1]
    50  	grantee2 := addrs[2]
    51  	grantee3 := addrs[3]
    52  	grantee4 := addrs[4]
    53  	expiration := ctx.BlockTime().AddDate(0, 1, 0)
    54  	expiration2 := expiration.AddDate(1, 0, 0)
    55  	smallCoins := sdk.NewCoins(sdk.NewInt64Coin("stake", 10))
    56  	sendAuthz := banktypes.NewSendAuthorization(smallCoins, nil)
    57  
    58  	ctrl := gomock.NewController(t)
    59  	accountKeeper := authztestutil.NewMockAccountKeeper(ctrl)
    60  	accountKeeper.EXPECT().GetAccount(gomock.Any(), granter).Return(authtypes.NewBaseAccountWithAddress(granter)).AnyTimes()
    61  	accountKeeper.EXPECT().GetAccount(gomock.Any(), grantee1).Return(authtypes.NewBaseAccountWithAddress(grantee1)).AnyTimes()
    62  	accountKeeper.EXPECT().GetAccount(gomock.Any(), grantee2).Return(authtypes.NewBaseAccountWithAddress(grantee2)).AnyTimes()
    63  	accountKeeper.EXPECT().GetAccount(gomock.Any(), grantee3).Return(authtypes.NewBaseAccountWithAddress(grantee3)).AnyTimes()
    64  	accountKeeper.EXPECT().GetAccount(gomock.Any(), grantee4).Return(authtypes.NewBaseAccountWithAddress(grantee4)).AnyTimes()
    65  
    66  	accountKeeper.EXPECT().AddressCodec().Return(address.NewBech32Codec("cosmos")).AnyTimes()
    67  
    68  	authzKeeper := keeper.NewKeeper(storeService, encCfg.Codec, baseApp.MsgServiceRouter(), accountKeeper)
    69  
    70  	save := func(grantee sdk.AccAddress, exp *time.Time) {
    71  		err := authzKeeper.SaveGrant(ctx, grantee, granter, sendAuthz, exp)
    72  		require.NoError(t, err, "Grant from %s", grantee.String())
    73  	}
    74  	save(grantee1, &expiration)
    75  	save(grantee2, &expiration)
    76  	save(grantee3, &expiration2)
    77  	save(grantee4, nil)
    78  
    79  	queryHelper := baseapp.NewQueryServerTestHelper(ctx, encCfg.InterfaceRegistry)
    80  	authz.RegisterQueryServer(queryHelper, authzKeeper)
    81  	queryClient := authz.NewQueryClient(queryHelper)
    82  
    83  	checkGrants := func(ctx sdk.Context, expectedNum int) {
    84  		authzmodule.BeginBlocker(ctx, authzKeeper)
    85  
    86  		res, err := queryClient.GranterGrants(ctx.Context(), &authz.QueryGranterGrantsRequest{
    87  			Granter: granter.String(),
    88  		})
    89  		require.NoError(t, err)
    90  		require.NotNil(t, res)
    91  		require.Equal(t, expectedNum, len(res.Grants))
    92  	}
    93  
    94  	checkGrants(ctx, 4)
    95  
    96  	// expiration is exclusive!
    97  	ctx = ctx.WithBlockTime(expiration)
    98  	checkGrants(ctx, 4)
    99  
   100  	ctx = ctx.WithBlockTime(expiration.AddDate(0, 0, 1))
   101  	checkGrants(ctx, 2)
   102  
   103  	ctx = ctx.WithBlockTime(expiration2.AddDate(0, 0, 1))
   104  	checkGrants(ctx, 1)
   105  }