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

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