package types_test import ( "testing" "github.com/stretchr/testify/require" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/bank/types" ) var ( coins1000 = sdk.NewCoins(sdk.NewCoin("stake", sdk.NewInt(1000))) coins500 = sdk.NewCoins(sdk.NewCoin("stake", sdk.NewInt(500))) fromAddr = sdk.AccAddress("_____from _____") toAddr = sdk.AccAddress("_______to________") ) func TestSendAuthorization(t *testing.T) { app := simapp.Setup(t, false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) authorization := types.NewSendAuthorization(coins1000) t.Log("verify authorization returns valid method name") require.Equal(t, authorization.MsgTypeURL(), "/cosmos.bank.v1beta1.MsgSend") require.NoError(t, authorization.ValidateBasic()) send := types.NewMsgSend(fromAddr, toAddr, coins1000) require.NoError(t, authorization.ValidateBasic()) t.Log("verify updated authorization returns nil") resp, err := authorization.Accept(ctx, send) require.NoError(t, err) require.True(t, resp.Delete) require.Nil(t, resp.Updated) authorization = types.NewSendAuthorization(coins1000) require.Equal(t, authorization.MsgTypeURL(), "/cosmos.bank.v1beta1.MsgSend") require.NoError(t, authorization.ValidateBasic()) send = types.NewMsgSend(fromAddr, toAddr, coins500) require.NoError(t, authorization.ValidateBasic()) resp, err = authorization.Accept(ctx, send) t.Log("verify updated authorization returns remaining spent limit") require.NoError(t, err) require.False(t, resp.Delete) require.NotNil(t, resp.Updated) sendAuth := types.NewSendAuthorization(coins500) require.Equal(t, sendAuth.String(), resp.Updated.String()) t.Log("expect updated authorization nil after spending remaining amount") resp, err = resp.Updated.Accept(ctx, send) require.NoError(t, err) require.True(t, resp.Delete) require.Nil(t, resp.Updated) }