github.com/Finschia/finschia-sdk@v0.49.1/x/feegrant/grant_test.go (about)

     1  package feegrant_test
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	"github.com/stretchr/testify/require"
     8  	tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
     9  
    10  	"github.com/Finschia/finschia-sdk/simapp"
    11  	sdk "github.com/Finschia/finschia-sdk/types"
    12  	"github.com/Finschia/finschia-sdk/x/feegrant"
    13  )
    14  
    15  func TestGrant(t *testing.T) {
    16  	app := simapp.Setup(false)
    17  	addr, err := sdk.AccAddressFromBech32("link1qyqszqgpqyqszqgpqyqszqgpqyqszqgp8apuk5")
    18  	require.NoError(t, err)
    19  	addr2, err := sdk.AccAddressFromBech32("link1ghekyjucln7y67ntx7cf27m9dpuxxemnqk82wt")
    20  	require.NoError(t, err)
    21  	atom := sdk.NewCoins(sdk.NewInt64Coin("atom", 555))
    22  	ctx := app.BaseApp.NewContext(false, tmproto.Header{
    23  		Time: time.Now(),
    24  	})
    25  	now := ctx.BlockTime()
    26  	oneYear := now.AddDate(1, 0, 0)
    27  
    28  	zeroAtoms := sdk.NewCoins(sdk.NewInt64Coin("atom", 0))
    29  	cdc := app.AppCodec()
    30  
    31  	cases := map[string]struct {
    32  		granter sdk.AccAddress
    33  		grantee sdk.AccAddress
    34  		limit   sdk.Coins
    35  		expires time.Time
    36  		valid   bool
    37  	}{
    38  		"good": {
    39  			granter: addr2,
    40  			grantee: addr,
    41  			limit:   atom,
    42  			expires: oneYear,
    43  			valid:   true,
    44  		},
    45  		"no grantee": {
    46  			granter: addr2,
    47  			grantee: nil,
    48  			limit:   atom,
    49  			expires: oneYear,
    50  			valid:   false,
    51  		},
    52  		"no granter": {
    53  			granter: nil,
    54  			grantee: addr,
    55  			limit:   atom,
    56  			expires: oneYear,
    57  			valid:   false,
    58  		},
    59  		"self-grant": {
    60  			granter: addr2,
    61  			grantee: addr2,
    62  			limit:   atom,
    63  			expires: oneYear,
    64  			valid:   false,
    65  		},
    66  		"zero allowance": {
    67  			granter: addr2,
    68  			grantee: addr,
    69  			limit:   zeroAtoms,
    70  			expires: oneYear,
    71  			valid:   false,
    72  		},
    73  	}
    74  
    75  	for name, tc := range cases {
    76  		t.Run(name, func(t *testing.T) {
    77  			grant, err := feegrant.NewGrant(tc.granter, tc.grantee, &feegrant.BasicAllowance{
    78  				SpendLimit: tc.limit,
    79  				Expiration: &tc.expires,
    80  			})
    81  			require.NoError(t, err)
    82  			err = grant.ValidateBasic()
    83  
    84  			if !tc.valid {
    85  				require.Error(t, err)
    86  				return
    87  			}
    88  			require.NoError(t, err)
    89  
    90  			// if it is valid, let's try to serialize, deserialize, and make sure it matches
    91  			bz, err := cdc.Marshal(&grant)
    92  			require.NoError(t, err)
    93  			var loaded feegrant.Grant
    94  			err = cdc.Unmarshal(bz, &loaded)
    95  			require.NoError(t, err)
    96  
    97  			err = loaded.ValidateBasic()
    98  			require.NoError(t, err)
    99  
   100  			require.Equal(t, grant, loaded)
   101  		})
   102  	}
   103  }