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 }