github.com/Finschia/finschia-sdk@v0.48.1/x/authz/keeper/grpc_query_test.go (about)

     1  package keeper_test
     2  
     3  import (
     4  	gocontext "context"
     5  	"fmt"
     6  	"time"
     7  
     8  	"github.com/stretchr/testify/require"
     9  
    10  	sdk "github.com/Finschia/finschia-sdk/types"
    11  	"github.com/Finschia/finschia-sdk/types/query"
    12  	"github.com/Finschia/finschia-sdk/x/authz"
    13  	banktypes "github.com/Finschia/finschia-sdk/x/bank/types"
    14  )
    15  
    16  func (suite *TestSuite) TestGRPCQueryAuthorization() {
    17  	app, ctx, queryClient, addrs := suite.app, suite.ctx, suite.queryClient, suite.addrs
    18  	var (
    19  		req              *authz.QueryGrantsRequest
    20  		expAuthorization authz.Authorization
    21  	)
    22  	testCases := []struct {
    23  		msg      string
    24  		malleate func(require *require.Assertions)
    25  		expError string
    26  		postTest func(require *require.Assertions, res *authz.QueryGrantsResponse)
    27  	}{
    28  		{
    29  			"fail invalid granter addr",
    30  			func(require *require.Assertions) {
    31  				req = &authz.QueryGrantsRequest{}
    32  			},
    33  			"empty address string is not allowed",
    34  			func(require *require.Assertions, res *authz.QueryGrantsResponse) {},
    35  		},
    36  		{
    37  			"fail invalid grantee addr",
    38  			func(require *require.Assertions) {
    39  				req = &authz.QueryGrantsRequest{
    40  					Granter: addrs[0].String(),
    41  				}
    42  			},
    43  			"empty address string is not allowed",
    44  			func(require *require.Assertions, res *authz.QueryGrantsResponse) {},
    45  		},
    46  		{
    47  			"fail invalid msg-type",
    48  			func(require *require.Assertions) {
    49  				req = &authz.QueryGrantsRequest{
    50  					Granter:    addrs[0].String(),
    51  					Grantee:    addrs[1].String(),
    52  					MsgTypeUrl: "unknown",
    53  				}
    54  			},
    55  			"no authorization found for unknown type",
    56  			func(require *require.Assertions, res *authz.QueryGrantsResponse) {},
    57  		},
    58  		{
    59  			"Success",
    60  			func(require *require.Assertions) {
    61  				now := ctx.BlockHeader().Time
    62  				newCoins := sdk.NewCoins(sdk.NewInt64Coin("steak", 100))
    63  				expAuthorization = &banktypes.SendAuthorization{SpendLimit: newCoins}
    64  				err := app.AuthzKeeper.SaveGrant(ctx, addrs[0], addrs[1], expAuthorization, now.Add(time.Hour))
    65  				require.NoError(err)
    66  				req = &authz.QueryGrantsRequest{
    67  					Granter:    addrs[1].String(),
    68  					Grantee:    addrs[0].String(),
    69  					MsgTypeUrl: expAuthorization.MsgTypeURL(),
    70  				}
    71  			},
    72  			"",
    73  			func(require *require.Assertions, res *authz.QueryGrantsResponse) {
    74  				var auth authz.Authorization
    75  				require.Equal(1, len(res.Grants))
    76  				err := suite.app.InterfaceRegistry().UnpackAny(res.Grants[0].Authorization, &auth)
    77  				require.NoError(err)
    78  				require.NotNil(auth)
    79  				require.Equal(auth.String(), expAuthorization.String())
    80  			},
    81  		},
    82  	}
    83  	for _, tc := range testCases {
    84  		suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
    85  			require := suite.Require()
    86  			tc.malleate(require)
    87  			result, err := queryClient.Grants(gocontext.Background(), req)
    88  			if tc.expError == "" {
    89  				require.NoError(err)
    90  			} else {
    91  				require.Error(err)
    92  				require.Contains(err.Error(), tc.expError)
    93  			}
    94  			tc.postTest(require, result)
    95  		})
    96  	}
    97  }
    98  
    99  func (suite *TestSuite) TestGRPCQueryAuthorizations() {
   100  	app, ctx, queryClient, addrs := suite.app, suite.ctx, suite.queryClient, suite.addrs
   101  	var (
   102  		req              *authz.QueryGrantsRequest
   103  		expAuthorization authz.Authorization
   104  	)
   105  	testCases := []struct {
   106  		msg      string
   107  		malleate func()
   108  		expPass  bool
   109  		postTest func(res *authz.QueryGrantsResponse)
   110  	}{
   111  		{
   112  			"fail invalid granter addr",
   113  			func() {
   114  				req = &authz.QueryGrantsRequest{}
   115  			},
   116  			false,
   117  			func(res *authz.QueryGrantsResponse) {},
   118  		},
   119  		{
   120  			"fail invalid grantee addr",
   121  			func() {
   122  				req = &authz.QueryGrantsRequest{
   123  					Granter: addrs[0].String(),
   124  				}
   125  			},
   126  			false,
   127  			func(res *authz.QueryGrantsResponse) {},
   128  		},
   129  		{
   130  			"Success",
   131  			func() {
   132  				now := ctx.BlockHeader().Time
   133  				newCoins := sdk.NewCoins(sdk.NewInt64Coin("steak", 100))
   134  				expAuthorization = &banktypes.SendAuthorization{SpendLimit: newCoins}
   135  				err := app.AuthzKeeper.SaveGrant(ctx, addrs[0], addrs[1], expAuthorization, now.Add(time.Hour))
   136  				suite.Require().NoError(err)
   137  				req = &authz.QueryGrantsRequest{
   138  					Granter: addrs[1].String(),
   139  					Grantee: addrs[0].String(),
   140  				}
   141  			},
   142  			true,
   143  			func(res *authz.QueryGrantsResponse) {
   144  				var auth authz.Authorization
   145  				suite.Require().Equal(1, len(res.Grants))
   146  				err := suite.app.InterfaceRegistry().UnpackAny(res.Grants[0].Authorization, &auth)
   147  				suite.Require().NoError(err)
   148  				suite.Require().NotNil(auth)
   149  				suite.Require().Equal(auth.String(), expAuthorization.String())
   150  			},
   151  		},
   152  	}
   153  	for _, testCase := range testCases {
   154  		suite.Run(fmt.Sprintf("Case %s", testCase.msg), func() {
   155  			testCase.malleate()
   156  			result, err := queryClient.Grants(gocontext.Background(), req)
   157  			if testCase.expPass {
   158  				suite.Require().NoError(err)
   159  			} else {
   160  				suite.Require().Error(err)
   161  			}
   162  			testCase.postTest(result)
   163  		})
   164  	}
   165  }
   166  
   167  func (suite *TestSuite) TestGRPCQueryGranterGrants() {
   168  	require := suite.Require()
   169  	app, ctx, queryClient, addrs := suite.app, suite.ctx, suite.queryClient, suite.addrs
   170  
   171  	testCases := []struct {
   172  		msg      string
   173  		preRun   func()
   174  		expError bool
   175  		request  authz.QueryGranterGrantsRequest
   176  		numItems int
   177  	}{
   178  		{
   179  			"fail invalid granter addr",
   180  			func() {},
   181  			true,
   182  			authz.QueryGranterGrantsRequest{},
   183  			0,
   184  		},
   185  		{
   186  			"valid case, single authorization",
   187  			func() {
   188  				now := ctx.BlockHeader().Time
   189  				newCoins := sdk.NewCoins(sdk.NewInt64Coin("steak", 100))
   190  				authorization := &banktypes.SendAuthorization{SpendLimit: newCoins}
   191  				err := app.AuthzKeeper.SaveGrant(ctx, addrs[1], addrs[0], authorization, now.Add(time.Hour))
   192  				require.NoError(err)
   193  			},
   194  			false,
   195  			authz.QueryGranterGrantsRequest{
   196  				Granter: addrs[0].String(),
   197  			},
   198  			1,
   199  		},
   200  		{
   201  			"valid case, multiple authorization",
   202  			func() {
   203  				now := ctx.BlockHeader().Time
   204  				newCoins := sdk.NewCoins(sdk.NewInt64Coin("steak", 100))
   205  				authorization := &banktypes.SendAuthorization{SpendLimit: newCoins}
   206  				err := app.AuthzKeeper.SaveGrant(ctx, addrs[2], addrs[0], authorization, now.Add(time.Hour))
   207  				require.NoError(err)
   208  			},
   209  			false,
   210  			authz.QueryGranterGrantsRequest{
   211  				Granter: addrs[0].String(),
   212  			},
   213  			2,
   214  		},
   215  		{
   216  			"valid case, pagination",
   217  			func() {
   218  			},
   219  			false,
   220  			authz.QueryGranterGrantsRequest{
   221  				Granter: addrs[0].String(),
   222  				Pagination: &query.PageRequest{
   223  					Limit: 1,
   224  				},
   225  			},
   226  			1,
   227  		},
   228  	}
   229  
   230  	for _, tc := range testCases {
   231  		suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
   232  			tc.preRun()
   233  			result, err := queryClient.GranterGrants(gocontext.Background(), &tc.request)
   234  			if tc.expError {
   235  				require.Error(err)
   236  			} else {
   237  				require.NoError(err)
   238  				require.Len(result.Grants, tc.numItems)
   239  			}
   240  		})
   241  	}
   242  }
   243  
   244  func (suite *TestSuite) TestGRPCQueryGranteeGrants() {
   245  	require := suite.Require()
   246  	app, ctx, queryClient, addrs := suite.app, suite.ctx, suite.queryClient, suite.addrs
   247  
   248  	testCases := []struct {
   249  		msg      string
   250  		preRun   func()
   251  		expError bool
   252  		request  authz.QueryGranteeGrantsRequest
   253  		numItems int
   254  	}{
   255  		{
   256  			"fail invalid granter addr",
   257  			func() {},
   258  			true,
   259  			authz.QueryGranteeGrantsRequest{},
   260  			0,
   261  		},
   262  		{
   263  			"valid case, single authorization",
   264  			func() {
   265  				now := ctx.BlockHeader().Time
   266  				newCoins := sdk.NewCoins(sdk.NewInt64Coin("steak", 100))
   267  				authorization := &banktypes.SendAuthorization{SpendLimit: newCoins}
   268  				err := app.AuthzKeeper.SaveGrant(ctx, addrs[0], addrs[1], authorization, now.Add(time.Hour))
   269  				require.NoError(err)
   270  			},
   271  			false,
   272  			authz.QueryGranteeGrantsRequest{
   273  				Grantee: addrs[0].String(),
   274  			},
   275  			1,
   276  		},
   277  		{
   278  			"valid case, no authorization found",
   279  			func() {},
   280  			false,
   281  			authz.QueryGranteeGrantsRequest{
   282  				Grantee: addrs[2].String(),
   283  			},
   284  			0,
   285  		},
   286  		{
   287  			"valid case, multiple authorization",
   288  			func() {
   289  				now := ctx.BlockHeader().Time
   290  				newCoins := sdk.NewCoins(sdk.NewInt64Coin("steak", 100))
   291  				authorization := &banktypes.SendAuthorization{SpendLimit: newCoins}
   292  				err := app.AuthzKeeper.SaveGrant(ctx, addrs[0], addrs[2], authorization, now.Add(time.Hour))
   293  				require.NoError(err)
   294  			},
   295  			false,
   296  			authz.QueryGranteeGrantsRequest{
   297  				Grantee: addrs[0].String(),
   298  			},
   299  			2,
   300  		},
   301  		{
   302  			"valid case, pagination",
   303  			func() {},
   304  			false,
   305  			authz.QueryGranteeGrantsRequest{
   306  				Grantee: addrs[0].String(),
   307  				Pagination: &query.PageRequest{
   308  					Limit: 1,
   309  				},
   310  			},
   311  			1,
   312  		},
   313  	}
   314  
   315  	for _, tc := range testCases {
   316  		suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
   317  			tc.preRun()
   318  			result, err := queryClient.GranteeGrants(gocontext.Background(), &tc.request)
   319  			if tc.expError {
   320  				require.Error(err)
   321  			} else {
   322  				require.NoError(err)
   323  				require.Len(result.Grants, tc.numItems)
   324  			}
   325  		})
   326  	}
   327  }