github.com/KiraCore/sekai@v0.3.43/x/gov/handler_test.go (about) 1 package gov_test 2 3 import ( 4 "fmt" 5 "os" 6 "testing" 7 "time" 8 9 simapp "github.com/KiraCore/sekai/app" 10 appparams "github.com/KiraCore/sekai/app/params" 11 kiratypes "github.com/KiraCore/sekai/types" 12 "github.com/KiraCore/sekai/x/gov" 13 "github.com/KiraCore/sekai/x/gov/types" 14 tokenstypes "github.com/KiraCore/sekai/x/tokens/types" 15 tmproto "github.com/cometbft/cometbft/proto/tendermint/types" 16 sdk "github.com/cosmos/cosmos-sdk/types" 17 "github.com/cosmos/cosmos-sdk/types/errors" 18 "github.com/gogo/protobuf/proto" 19 "github.com/stretchr/testify/require" 20 ) 21 22 func TestMain(m *testing.M) { 23 appparams.SetConfig() 24 os.Exit(m.Run()) 25 } 26 27 // When a network actor has not been saved before, it creates one with default params 28 // and sets the permissions. 29 func TestHandler_MsgWhitelistPermissions_ActorDoesNotExist(t *testing.T) { 30 proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f") 31 require.NoError(t, err) 32 33 addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d") 34 require.NoError(t, err) 35 36 tests := []struct { 37 name string 38 msg sdk.Msg 39 checkWhitelisted bool 40 }{ 41 { 42 "Msg Whitelist Permissions", 43 &types.MsgWhitelistPermissions{ 44 Proposer: proposerAddr, 45 Address: addr, 46 Permission: uint32(types.PermClaimValidator), 47 }, 48 true, 49 }, 50 { 51 "Msg Blacklist Permissions", 52 &types.MsgBlacklistPermissions{ 53 Proposer: proposerAddr, 54 Address: addr, 55 Permission: uint32(types.PermClaimValidator), 56 }, 57 false, 58 }, 59 } 60 61 for _, tt := range tests { 62 tt := tt 63 t.Run(tt.name, func(t *testing.T) { 64 app := simapp.Setup(false) 65 ctx := app.NewContext(false, tmproto.Header{}) 66 67 err := setPermissionToAddr(t, app, ctx, proposerAddr, types.PermSetPermissions) 68 require.NoError(t, err) 69 70 handler := gov.NewHandler(app.CustomGovKeeper) 71 _, err = handler(ctx, tt.msg) 72 require.NoError(t, err) 73 74 actor, found := app.CustomGovKeeper.GetNetworkActorByAddress(ctx, addr) 75 require.True(t, found) 76 77 if tt.checkWhitelisted { 78 require.True(t, actor.Permissions.IsWhitelisted(types.PermClaimValidator)) 79 } else { 80 require.True(t, actor.Permissions.IsBlacklisted(types.PermClaimValidator)) 81 } 82 }) 83 } 84 } 85 86 // When a network actor has already permissions it just appends the permission. 87 func TestNewHandler_SetPermissions_ActorWithPerms(t *testing.T) { 88 addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d") 89 require.NoError(t, err) 90 91 proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f") 92 require.NoError(t, err) 93 94 tests := []struct { 95 name string 96 msg sdk.Msg 97 checkWhitelisted bool 98 }{ 99 { 100 name: "actor with Whitelist Permissions", 101 msg: &types.MsgWhitelistPermissions{ 102 Proposer: proposerAddr, 103 Address: addr, 104 Permission: uint32(types.PermClaimValidator), 105 }, 106 checkWhitelisted: true, 107 }, 108 { 109 name: "actor with Blacklist Permissions", 110 msg: &types.MsgBlacklistPermissions{ 111 Proposer: proposerAddr, 112 Address: addr, 113 Permission: uint32(types.PermClaimValidator), 114 }, 115 checkWhitelisted: false, 116 }, 117 } 118 119 for _, tt := range tests { 120 tt := tt 121 t.Run(tt.name, func(t *testing.T) { 122 app := simapp.Setup(false) 123 ctx := app.NewContext(false, tmproto.Header{}) 124 125 err := setPermissionToAddr(t, app, ctx, proposerAddr, types.PermSetPermissions) 126 require.NoError(t, err) 127 128 // Add some perms before to the actor. 129 actor := types.NewDefaultActor(addr) 130 if tt.checkWhitelisted { 131 err = actor.Permissions.AddToWhitelist(types.PermSetPermissions) 132 } else { 133 err = actor.Permissions.AddToBlacklist(types.PermSetPermissions) 134 } 135 require.NoError(t, err) 136 137 app.CustomGovKeeper.SaveNetworkActor(ctx, actor) 138 139 // Call the handler to add some permissions. 140 handler := gov.NewHandler(app.CustomGovKeeper) 141 _, err = handler(ctx, tt.msg) 142 require.NoError(t, err) 143 144 actor, found := app.CustomGovKeeper.GetNetworkActorByAddress(ctx, addr) 145 require.True(t, found) 146 147 if tt.checkWhitelisted { 148 require.True(t, actor.Permissions.IsWhitelisted(types.PermClaimValidator)) 149 require.True(t, actor.Permissions.IsWhitelisted(types.PermSetPermissions)) // This permission was already set before callid add permission. 150 } else { 151 require.True(t, actor.Permissions.IsBlacklisted(types.PermClaimValidator)) 152 require.True(t, actor.Permissions.IsBlacklisted(types.PermSetPermissions)) // This permission was already set before callid add permission. 153 } 154 }) 155 } 156 } 157 158 func TestNewHandler_SetPermissionsWithoutSetPermissions(t *testing.T) { 159 addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d") 160 require.NoError(t, err) 161 162 proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f") 163 require.NoError(t, err) 164 165 tests := []struct { 166 name string 167 msg sdk.Msg 168 }{ 169 { 170 name: "MsgWhitelist", 171 msg: &types.MsgWhitelistPermissions{ 172 Proposer: proposerAddr, 173 Address: addr, 174 Permission: uint32(types.PermClaimValidator), 175 }, 176 }, 177 { 178 name: "MsgBlacklist", 179 msg: &types.MsgBlacklistPermissions{ 180 Proposer: proposerAddr, 181 Address: addr, 182 Permission: uint32(types.PermClaimValidator), 183 }, 184 }, 185 } 186 187 for _, tt := range tests { 188 tt := tt 189 t.Run(tt.name, func(t *testing.T) { 190 app := simapp.Setup(false) 191 ctx := app.NewContext(false, tmproto.Header{}) 192 193 handler := gov.NewHandler(app.CustomGovKeeper) 194 _, err = handler(ctx, tt.msg) 195 require.EqualError(t, err, "PermSetPermissions || (ClaimValidatorPermission && ClaimValidatorPermMsg): not enough permissions") 196 }) 197 } 198 } 199 200 func TestNewHandler_SetPermissions_ProposerHasRoleSudo(t *testing.T) { 201 addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d") 202 require.NoError(t, err) 203 204 proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f") 205 require.NoError(t, err) 206 207 tests := []struct { 208 name string 209 msg sdk.Msg 210 checkWhitelist bool 211 }{ 212 { 213 name: "MsgWhitelist", 214 msg: &types.MsgWhitelistPermissions{ 215 Proposer: proposerAddr, 216 Address: addr, 217 Permission: uint32(types.PermClaimValidator), 218 }, 219 checkWhitelist: true, 220 }, 221 { 222 name: "MsgBlacklist", 223 msg: &types.MsgBlacklistPermissions{ 224 Proposer: proposerAddr, 225 Address: addr, 226 Permission: uint32(types.PermClaimValidator), 227 }, 228 checkWhitelist: false, 229 }, 230 } 231 232 for _, tt := range tests { 233 tt := tt 234 t.Run(tt.name, func(t *testing.T) { 235 app := simapp.Setup(false) 236 ctx := app.NewContext(false, tmproto.Header{}) 237 238 // First we set Role Sudo to proposer Actor 239 proposerActor := types.NewDefaultActor(proposerAddr) 240 proposerActor.SetRole(types.RoleSudo) 241 require.NoError(t, err) 242 app.CustomGovKeeper.SaveNetworkActor(ctx, proposerActor) 243 244 handler := gov.NewHandler(app.CustomGovKeeper) 245 _, err = handler(ctx, tt.msg) 246 require.NoError(t, err) 247 248 actor, found := app.CustomGovKeeper.GetNetworkActorByAddress(ctx, addr) 249 require.True(t, found) 250 251 if tt.checkWhitelist { 252 require.True(t, actor.Permissions.IsWhitelisted(types.PermClaimValidator)) 253 } else { 254 require.True(t, actor.Permissions.IsBlacklisted(types.PermClaimValidator)) 255 } 256 }) 257 } 258 } 259 260 func TestNewHandler_SetNetworkProperties(t *testing.T) { 261 changeFeeAddr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d") 262 require.NoError(t, err) 263 264 sudoAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f") 265 require.NoError(t, err) 266 267 tests := []struct { 268 name string 269 msg sdk.Msg 270 desiredErr string 271 }{ 272 { 273 name: "Success run with ChangeTxFee permission", 274 msg: &types.MsgSetNetworkProperties{ 275 NetworkProperties: &types.NetworkProperties{ 276 MinTxFee: 100, 277 MaxTxFee: 1000, 278 }, 279 Proposer: changeFeeAddr, 280 }, 281 desiredErr: "", 282 }, 283 { 284 name: "Failure run without ChangeTxFee permission", 285 msg: &types.MsgSetNetworkProperties{ 286 NetworkProperties: &types.NetworkProperties{ 287 MinTxFee: 100, 288 MaxTxFee: 1000, 289 }, 290 Proposer: sudoAddr, 291 }, 292 desiredErr: "not enough permissions", 293 }, 294 } 295 296 for _, tt := range tests { 297 tt := tt 298 t.Run(tt.name, func(t *testing.T) { 299 app := simapp.Setup(false) 300 ctx := app.NewContext(false, tmproto.Header{}) 301 // First we set Role Sudo to proposer Actor 302 proposerActor := types.NewDefaultActor(sudoAddr) 303 proposerActor.SetRole(types.RoleSudo) 304 app.CustomGovKeeper.SaveNetworkActor(ctx, proposerActor) 305 306 handler := gov.NewHandler(app.CustomGovKeeper) 307 308 // set change fee permission to addr 309 _, err = handler(ctx, &types.MsgWhitelistPermissions{ 310 Proposer: sudoAddr, 311 Address: changeFeeAddr, 312 Permission: uint32(types.PermChangeTxFee), 313 }) 314 require.NoError(t, err) 315 316 _, err = handler(ctx, tt.msg) 317 if tt.desiredErr == "" { 318 require.NoError(t, err) 319 } else { 320 require.Error(t, err) 321 require.Contains(t, err.Error(), tt.desiredErr) 322 } 323 }) 324 } 325 } 326 327 func TestNewHandler_SetExecutionFee(t *testing.T) { 328 execFeeSetAddr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d") 329 require.NoError(t, err) 330 331 sudoAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f") 332 require.NoError(t, err) 333 334 tests := []struct { 335 name string 336 msg types.MsgSetExecutionFee 337 desiredErr string 338 }{ 339 { 340 name: "Success run with ChangeTxFee permission", 341 msg: types.MsgSetExecutionFee{ 342 TransactionType: "network-properties", 343 ExecutionFee: 10000, 344 FailureFee: 1000, 345 Timeout: 1, 346 DefaultParameters: 2, 347 Proposer: execFeeSetAddr, 348 }, 349 desiredErr: "", 350 }, 351 { 352 name: "Success run without ChangeTxFee permission", 353 msg: types.MsgSetExecutionFee{ 354 TransactionType: "network-properties-2", 355 ExecutionFee: 10000, 356 FailureFee: 1000, 357 Timeout: 1, 358 DefaultParameters: 2, 359 Proposer: sudoAddr, 360 }, 361 desiredErr: "PermChangeTxFee: not enough permissions", 362 }, 363 } 364 365 for _, tt := range tests { 366 tt := tt 367 t.Run(tt.name, func(t *testing.T) { 368 app := simapp.Setup(false) 369 ctx := app.NewContext(false, tmproto.Header{}) 370 // First we set Role Sudo to proposer Actor 371 proposerActor := types.NewDefaultActor(sudoAddr) 372 proposerActor.SetRole(types.RoleSudo) 373 require.NoError(t, err) 374 app.CustomGovKeeper.SaveNetworkActor(ctx, proposerActor) 375 376 handler := gov.NewHandler(app.CustomGovKeeper) 377 378 // set change fee permission to addr 379 _, err = handler(ctx, &types.MsgWhitelistPermissions{ 380 Proposer: sudoAddr, 381 Address: execFeeSetAddr, 382 Permission: uint32(types.PermChangeTxFee), 383 }) 384 require.NoError(t, err) 385 386 _, err = handler(ctx, &tt.msg) 387 if tt.desiredErr == "" { 388 require.NoError(t, err) 389 execFee := app.CustomGovKeeper.GetExecutionFee(ctx, tt.msg.TransactionType) 390 require.Equal(t, tt.msg.TransactionType, execFee.TransactionType) 391 require.Equal(t, tt.msg.ExecutionFee, execFee.ExecutionFee) 392 require.Equal(t, tt.msg.FailureFee, execFee.FailureFee) 393 require.Equal(t, tt.msg.Timeout, execFee.Timeout) 394 require.Equal(t, tt.msg.DefaultParameters, execFee.DefaultParameters) 395 } else { 396 require.Error(t, err) 397 require.Contains(t, err.Error(), tt.desiredErr) 398 } 399 }) 400 } 401 } 402 403 func TestHandler_ClaimCouncilor_Fails(t *testing.T) { 404 addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d") 405 require.NoError(t, err) 406 407 tests := []struct { 408 name string 409 msg sdk.Msg 410 expectedErr error 411 }{ 412 { 413 name: "not enough permissions", 414 msg: &types.MsgClaimCouncilor{ 415 Moniker: "", 416 Address: addr, 417 }, 418 expectedErr: fmt.Errorf("PermClaimCouncilor: not enough permissions"), 419 }, 420 } 421 422 for _, tt := range tests { 423 tt := tt 424 t.Run(tt.name, func(t *testing.T) { 425 app := simapp.Setup(false) 426 ctx := app.NewContext(false, tmproto.Header{}) 427 428 handler := gov.NewHandler(app.CustomGovKeeper) 429 _, err := handler(ctx, tt.msg) 430 require.EqualError(t, err, tt.expectedErr.Error()) 431 }) 432 } 433 } 434 435 func TestHandler_ClaimCouncilor_HappyPath(t *testing.T) { 436 addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d") 437 require.NoError(t, err) 438 439 tests := []struct { 440 name string 441 msg *types.MsgClaimCouncilor 442 }{ 443 { 444 name: "all correct", 445 msg: &types.MsgClaimCouncilor{ 446 Address: addr, 447 }, 448 }, 449 } 450 451 for _, tt := range tests { 452 tt := tt 453 t.Run(tt.name, func(t *testing.T) { 454 app := simapp.Setup(false) 455 ctx := app.NewContext(false, tmproto.Header{}) 456 457 err = setPermissionToAddr(t, app, ctx, addr, types.PermClaimCouncilor) 458 require.NoError(t, err) 459 460 handler := gov.NewHandler(app.CustomGovKeeper) 461 _, err := handler(ctx, tt.msg) 462 require.NoError(t, err) 463 464 expectedCouncilor := types.NewCouncilor( 465 tt.msg.Address, 466 types.CouncilorActive, 467 ) 468 469 councilor, found := app.CustomGovKeeper.GetCouncilor(ctx, addr) 470 require.True(t, found) 471 472 require.Equal(t, expectedCouncilor, councilor) 473 }) 474 } 475 } 476 477 func TestHandler_WhitelistRolePermissions_Errors(t *testing.T) { 478 addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d") 479 require.NoError(t, err) 480 481 tests := []struct { 482 name string 483 msg *types.MsgWhitelistRolePermission 484 preparePerms func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) 485 expectedErr error 486 }{ 487 { 488 name: "address without SetPermissions perm", 489 msg: types.NewMsgWhitelistRolePermission( 490 addr, 491 fmt.Sprintf("%d", types.RoleValidator), 492 uint32(types.PermSetPermissions), 493 ), 494 preparePerms: func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) { 495 return 496 }, 497 expectedErr: fmt.Errorf("%s: not enough permissions", types.PermUpsertRole.String()), 498 }, 499 { 500 name: "role does not exist", 501 msg: types.NewMsgWhitelistRolePermission( 502 addr, 503 "10000", 504 1, 505 ), 506 preparePerms: func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) { 507 err2 := setPermissionToAddr(t, app, ctx, addr, types.PermUpsertRole) 508 require.NoError(t, err2) 509 }, 510 expectedErr: fmt.Errorf("role does not exist"), 511 }, 512 { 513 name: "permission is blacklisted", 514 msg: types.NewMsgWhitelistRolePermission( 515 addr, 516 fmt.Sprintf("%d", types.RoleValidator), 517 uint32(types.PermSetPermissions), 518 ), 519 preparePerms: func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) { 520 err2 := setPermissionToAddr(t, app, ctx, addr, types.PermUpsertRole) 521 require.NoError(t, err2) 522 523 _, found := app.CustomGovKeeper.GetPermissionsForRole(ctx, types.RoleValidator) 524 require.True(t, found) 525 526 err2 = app.CustomGovKeeper.BlacklistRolePermission(ctx, types.RoleValidator, types.PermSetPermissions) 527 require.NoError(t, err2) 528 }, 529 expectedErr: fmt.Errorf("permission is blacklisted"), 530 }, 531 } 532 533 for _, tt := range tests { 534 tt := tt 535 t.Run(tt.name, func(t *testing.T) { 536 app := simapp.Setup(false) 537 ctx := app.NewContext(false, tmproto.Header{}) 538 539 tt.preparePerms(t, app, ctx) 540 541 handler := gov.NewHandler(app.CustomGovKeeper) 542 _, err := handler(ctx, tt.msg) 543 require.EqualError(t, err, tt.expectedErr.Error()) 544 }) 545 } 546 } 547 548 func TestHandler_WhitelistRolePermissions(t *testing.T) { 549 addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d") 550 require.NoError(t, err) 551 552 app := simapp.Setup(false) 553 ctx := app.NewContext(false, tmproto.Header{}) 554 555 err = setPermissionToAddr(t, app, ctx, addr, types.PermUpsertRole) 556 require.NoError(t, err) 557 558 perms, found := app.CustomGovKeeper.GetPermissionsForRole(ctx, types.RoleValidator) 559 require.True(t, found) 560 require.False(t, perms.IsWhitelisted(types.PermSetPermissions)) 561 562 msg := types.NewMsgWhitelistRolePermission( 563 addr, 564 fmt.Sprintf("%d", types.RoleValidator), 565 uint32(types.PermSetPermissions), 566 ) 567 568 handler := gov.NewHandler(app.CustomGovKeeper) 569 _, err = handler(ctx, msg) 570 require.NoError(t, err) 571 572 perms, found = app.CustomGovKeeper.GetPermissionsForRole(ctx, types.RoleValidator) 573 require.True(t, found) 574 require.True(t, perms.IsWhitelisted(types.PermSetPermissions)) 575 } 576 577 func TestHandler_BlacklistRolePermissions_Errors(t *testing.T) { 578 addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d") 579 require.NoError(t, err) 580 581 tests := []struct { 582 name string 583 msg *types.MsgBlacklistRolePermission 584 preparePerms func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) 585 expectedErr error 586 }{ 587 { 588 name: "address without SetPermissions perm", 589 msg: types.NewMsgBlacklistRolePermission( 590 addr, 591 fmt.Sprintf("%d", types.RoleValidator), 592 uint32(types.PermSetPermissions), 593 ), 594 preparePerms: func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {}, 595 expectedErr: fmt.Errorf("%s: not enough permissions", types.PermUpsertRole.String()), 596 }, 597 { 598 name: "role does not exist", 599 msg: types.NewMsgBlacklistRolePermission( 600 addr, 601 "10000", 602 1, 603 ), 604 preparePerms: func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) { 605 err2 := setPermissionToAddr(t, app, ctx, addr, types.PermUpsertRole) 606 require.NoError(t, err2) 607 }, 608 expectedErr: fmt.Errorf("role does not exist"), 609 }, 610 { 611 name: "permission is whitelisted", 612 msg: types.NewMsgBlacklistRolePermission( 613 addr, 614 fmt.Sprintf("%d", types.RoleValidator), 615 uint32(types.PermSetPermissions), 616 ), 617 preparePerms: func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) { 618 err2 := setPermissionToAddr(t, app, ctx, addr, types.PermUpsertRole) 619 require.NoError(t, err2) 620 621 _, found := app.CustomGovKeeper.GetPermissionsForRole(ctx, types.RoleValidator) 622 require.True(t, found) 623 624 err2 = app.CustomGovKeeper.WhitelistRolePermission(ctx, types.RoleValidator, types.PermSetPermissions) 625 require.NoError(t, err2) 626 }, 627 expectedErr: fmt.Errorf("permission is whitelisted"), 628 }, 629 } 630 631 for _, tt := range tests { 632 tt := tt 633 t.Run(tt.name, func(t *testing.T) { 634 app := simapp.Setup(false) 635 ctx := app.NewContext(false, tmproto.Header{}) 636 637 tt.preparePerms(t, app, ctx) 638 639 handler := gov.NewHandler(app.CustomGovKeeper) 640 _, err := handler(ctx, tt.msg) 641 require.EqualError(t, err, tt.expectedErr.Error()) 642 }) 643 } 644 } 645 646 func TestHandler_BlacklistRolePermissions(t *testing.T) { 647 addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d") 648 require.NoError(t, err) 649 650 app := simapp.Setup(false) 651 ctx := app.NewContext(false, tmproto.Header{}) 652 653 err = setPermissionToAddr(t, app, ctx, addr, types.PermUpsertRole) 654 require.NoError(t, err) 655 656 perms, found := app.CustomGovKeeper.GetPermissionsForRole(ctx, types.RoleValidator) 657 require.True(t, found) 658 require.False(t, perms.IsBlacklisted(types.PermSetPermissions)) 659 660 msg := types.NewMsgBlacklistRolePermission( 661 addr, 662 fmt.Sprintf("%d", types.RoleValidator), 663 uint32(types.PermSetPermissions), 664 ) 665 666 handler := gov.NewHandler(app.CustomGovKeeper) 667 _, err = handler(ctx, msg) 668 require.NoError(t, err) 669 670 perms, found = app.CustomGovKeeper.GetPermissionsForRole(ctx, types.RoleValidator) 671 require.True(t, found) 672 require.True(t, perms.IsBlacklisted(types.PermSetPermissions)) 673 } 674 675 func TestHandler_RemoveWhitelistRolePermissions_Errors(t *testing.T) { 676 addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d") 677 require.NoError(t, err) 678 679 tests := []struct { 680 name string 681 msg *types.MsgRemoveWhitelistRolePermission 682 preparePerms func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) 683 expectedErr error 684 }{ 685 { 686 name: "address without SetPermissions perm", 687 msg: types.NewMsgRemoveWhitelistRolePermission( 688 addr, 689 fmt.Sprintf("%d", types.RoleValidator), 690 uint32(types.PermSetPermissions), 691 ), 692 preparePerms: func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {}, 693 expectedErr: fmt.Errorf("%s: not enough permissions", types.PermUpsertRole.String()), 694 }, 695 { 696 name: "role does not exist", 697 msg: types.NewMsgRemoveWhitelistRolePermission( 698 addr, 699 "10000", 700 1, 701 ), 702 preparePerms: func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) { 703 err2 := setPermissionToAddr(t, app, ctx, addr, types.PermUpsertRole) 704 require.NoError(t, err2) 705 }, 706 expectedErr: fmt.Errorf("role does not exist"), 707 }, 708 } 709 710 for _, tt := range tests { 711 tt := tt 712 t.Run(tt.name, func(t *testing.T) { 713 app := simapp.Setup(false) 714 ctx := app.NewContext(false, tmproto.Header{}) 715 716 tt.preparePerms(t, app, ctx) 717 718 handler := gov.NewHandler(app.CustomGovKeeper) 719 _, err := handler(ctx, tt.msg) 720 require.EqualError(t, err, tt.expectedErr.Error()) 721 }) 722 } 723 } 724 725 func TestHandler_RemoveWhitelistRolePermissions(t *testing.T) { 726 addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d") 727 require.NoError(t, err) 728 729 app := simapp.Setup(false) 730 ctx := app.NewContext(false, tmproto.Header{}) 731 732 err = setPermissionToAddr(t, app, ctx, addr, types.PermUpsertRole) 733 require.NoError(t, err) 734 735 perms, found := app.CustomGovKeeper.GetPermissionsForRole(ctx, types.RoleValidator) 736 require.True(t, found) 737 require.True(t, perms.IsWhitelisted(types.PermClaimValidator)) 738 739 msg := types.NewMsgRemoveWhitelistRolePermission( 740 addr, 741 fmt.Sprintf("%d", types.RoleValidator), 742 uint32(types.PermClaimValidator), 743 ) 744 745 handler := gov.NewHandler(app.CustomGovKeeper) 746 _, err = handler(ctx, msg) 747 require.NoError(t, err) 748 749 perms, found = app.CustomGovKeeper.GetPermissionsForRole(ctx, types.RoleValidator) 750 require.True(t, found) 751 require.False(t, perms.IsWhitelisted(types.PermClaimValidator)) 752 } 753 754 func TestHandler_RemoveBlacklistRolePermissions_Errors(t *testing.T) { 755 addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d") 756 require.NoError(t, err) 757 758 tests := []struct { 759 name string 760 msg *types.MsgRemoveBlacklistRolePermission 761 preparePerms func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) 762 expectedErr error 763 }{ 764 { 765 name: "address without SetPermissions perm", 766 msg: types.NewMsgRemoveBlacklistRolePermission( 767 addr, 768 fmt.Sprintf("%d", types.RoleValidator), 769 uint32(types.PermSetPermissions), 770 ), 771 preparePerms: func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {}, 772 expectedErr: fmt.Errorf("%s: not enough permissions", types.PermUpsertRole.String()), 773 }, 774 { 775 name: "role does not exist", 776 msg: types.NewMsgRemoveBlacklistRolePermission( 777 addr, 778 "10000", 779 1, 780 ), 781 preparePerms: func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) { 782 err2 := setPermissionToAddr(t, app, ctx, addr, types.PermUpsertRole) 783 require.NoError(t, err2) 784 }, 785 expectedErr: fmt.Errorf("role does not exist"), 786 }, 787 } 788 789 for _, tt := range tests { 790 tt := tt 791 t.Run(tt.name, func(t *testing.T) { 792 app := simapp.Setup(false) 793 ctx := app.NewContext(false, tmproto.Header{}) 794 795 tt.preparePerms(t, app, ctx) 796 797 handler := gov.NewHandler(app.CustomGovKeeper) 798 _, err := handler(ctx, tt.msg) 799 require.EqualError(t, err, tt.expectedErr.Error()) 800 }) 801 } 802 } 803 804 func TestHandler_RemoveBlacklistRolePermissions(t *testing.T) { 805 addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d") 806 require.NoError(t, err) 807 808 app := simapp.Setup(false) 809 ctx := app.NewContext(false, tmproto.Header{}) 810 811 err = setPermissionToAddr(t, app, ctx, addr, types.PermUpsertRole) 812 require.NoError(t, err) 813 814 _, found := app.CustomGovKeeper.GetPermissionsForRole(ctx, types.RoleValidator) 815 require.True(t, found) 816 817 // Set some blacklist value 818 err = app.CustomGovKeeper.BlacklistRolePermission(ctx, types.RoleValidator, types.PermClaimCouncilor) 819 require.NoError(t, err) 820 821 // Check if it is blacklisted. 822 perms, found := app.CustomGovKeeper.GetPermissionsForRole(ctx, types.RoleValidator) 823 require.True(t, found) 824 require.True(t, perms.IsBlacklisted(types.PermClaimCouncilor)) 825 826 msg := types.NewMsgRemoveBlacklistRolePermission( 827 addr, 828 fmt.Sprintf("%d", types.RoleValidator), 829 uint32(types.PermClaimCouncilor), 830 ) 831 832 handler := gov.NewHandler(app.CustomGovKeeper) 833 _, err = handler(ctx, msg) 834 require.NoError(t, err) 835 836 perms, found = app.CustomGovKeeper.GetPermissionsForRole(ctx, types.RoleValidator) 837 require.True(t, found) 838 require.False(t, perms.IsBlacklisted(types.PermClaimCouncilor)) 839 } 840 841 func TestHandler_CreateRole_Errors(t *testing.T) { 842 addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d") 843 require.NoError(t, err) 844 845 tests := []struct { 846 name string 847 msg *types.MsgCreateRole 848 preparePerms func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) 849 expectedErr error 850 }{ 851 { 852 "fails when no perms", 853 types.NewMsgCreateRole( 854 addr, 855 "role10", 856 "role10desc", 857 ), 858 func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {}, 859 fmt.Errorf("PermUpsertRole: not enough permissions"), 860 }, 861 { 862 "fails when role already exists", 863 types.NewMsgCreateRole( 864 addr, 865 "role1234", 866 "role1234desc", 867 ), 868 func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) { 869 err2 := setPermissionToAddr(t, app, ctx, addr, types.PermUpsertRole) 870 require.NoError(t, err2) 871 app.CustomGovKeeper.CreateRole(ctx, "role1234", "role1234desc") 872 }, 873 fmt.Errorf("role already exist"), 874 }, 875 } 876 877 for _, tt := range tests { 878 app := simapp.Setup(false) 879 ctx := app.NewContext(false, tmproto.Header{}) 880 881 tt.preparePerms(t, app, ctx) 882 883 handler := gov.NewHandler(app.CustomGovKeeper) 884 _, err := handler(ctx, tt.msg) 885 require.EqualError(t, err, tt.expectedErr.Error()) 886 } 887 } 888 889 func TestHandler_CreateRole(t *testing.T) { 890 addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d") 891 require.NoError(t, err) 892 893 app := simapp.Setup(false) 894 ctx := app.NewContext(false, tmproto.Header{}) 895 896 err = setPermissionToAddr(t, app, ctx, addr, types.PermUpsertRole) 897 require.NoError(t, err) 898 899 _, found := app.CustomGovKeeper.GetPermissionsForRole(ctx, 1234) 900 require.False(t, found) 901 902 handler := gov.NewHandler(app.CustomGovKeeper) 903 _, err = handler(ctx, types.NewMsgCreateRole( 904 addr, 905 "role1234", 906 "role1234desc", 907 )) 908 require.NoError(t, err) 909 910 _, err = app.CustomGovKeeper.GetRoleBySid(ctx, "role1234") 911 require.NoError(t, err) 912 } 913 914 func TestHandler_AssignRole_Errors(t *testing.T) { 915 proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f") 916 require.NoError(t, err) 917 918 addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d") 919 require.NoError(t, err) 920 921 tests := []struct { 922 name string 923 msg *types.MsgAssignRole 924 preparePerms func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) 925 expectedErr error 926 }{ 927 { 928 "fails when no perms", 929 types.NewMsgAssignRole( 930 proposerAddr, addr, 3, 931 ), 932 func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {}, 933 fmt.Errorf("%s: not enough permissions", types.PermUpsertRole.String()), 934 }, 935 { 936 "fails when role does not exist", 937 types.NewMsgAssignRole( 938 proposerAddr, addr, 3, 939 ), 940 func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) { 941 err2 := setPermissionToAddr(t, app, ctx, proposerAddr, types.PermUpsertRole) 942 require.NoError(t, err2) 943 }, 944 types.ErrRoleDoesNotExist, 945 }, 946 { 947 "role already assigned", 948 types.NewMsgAssignRole( 949 proposerAddr, addr, 3, 950 ), 951 func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) { 952 err2 := setPermissionToAddr(t, app, ctx, proposerAddr, types.PermUpsertRole) 953 require.NoError(t, err2) 954 955 app.CustomGovKeeper.SetRole(ctx, types.Role{ 956 Id: 3, 957 Sid: "3", 958 Description: "3", 959 }) 960 err2 = app.CustomGovKeeper.WhitelistRolePermission(ctx, 3, types.PermClaimValidator) 961 require.NoError(t, err2) 962 963 networkActor := types.NewDefaultActor(addr) 964 app.CustomGovKeeper.AssignRoleToActor(ctx, networkActor, 3) 965 }, 966 types.ErrRoleAlreadyAssigned, 967 }, 968 } 969 970 for _, tt := range tests { 971 app := simapp.Setup(false) 972 ctx := app.NewContext(false, tmproto.Header{}) 973 974 tt.preparePerms(t, app, ctx) 975 976 handler := gov.NewHandler(app.CustomGovKeeper) 977 _, err := handler(ctx, tt.msg) 978 require.EqualError(t, err, tt.expectedErr.Error()) 979 } 980 } 981 982 func TestHandler_AssignRole(t *testing.T) { 983 proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f") 984 require.NoError(t, err) 985 986 addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d") 987 require.NoError(t, err) 988 989 app := simapp.Setup(false) 990 ctx := app.NewContext(false, tmproto.Header{}) 991 992 // Set permissions to proposer. 993 err = setPermissionToAddr(t, app, ctx, proposerAddr, types.PermUpsertRole) 994 require.NoError(t, err) 995 996 // Create role 997 app.CustomGovKeeper.SetRole(ctx, types.Role{ 998 Id: 3, 999 Sid: "3", 1000 Description: "3", 1001 }) 1002 err = app.CustomGovKeeper.WhitelistRolePermission(ctx, 3, types.PermSetPermissions) 1003 require.NoError(t, err) 1004 1005 msg := types.NewMsgAssignRole(proposerAddr, addr, 3) 1006 1007 handler := gov.NewHandler(app.CustomGovKeeper) 1008 _, err = handler(ctx, msg) 1009 require.NoError(t, err) 1010 1011 actor, found := app.CustomGovKeeper.GetNetworkActorByAddress(ctx, addr) 1012 require.True(t, found) 1013 1014 require.True(t, actor.HasRole(3)) 1015 } 1016 1017 func TestHandler_UnassignRole_Errors(t *testing.T) { 1018 proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f") 1019 require.NoError(t, err) 1020 1021 addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d") 1022 require.NoError(t, err) 1023 1024 tests := []struct { 1025 name string 1026 msg *types.MsgUnassignRole 1027 preparePerms func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) 1028 expectedErr error 1029 }{ 1030 { 1031 "fails when no perms", 1032 types.NewMsgUnassignRole( 1033 proposerAddr, addr, 3, 1034 ), 1035 func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {}, 1036 fmt.Errorf("%s: not enough permissions", types.PermUpsertRole.String()), 1037 }, 1038 { 1039 "fails when role does not exist", 1040 types.NewMsgUnassignRole( 1041 proposerAddr, addr, 3, 1042 ), 1043 func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) { 1044 err2 := setPermissionToAddr(t, app, ctx, proposerAddr, types.PermUpsertRole) 1045 require.NoError(t, err2) 1046 }, 1047 types.ErrRoleDoesNotExist, 1048 }, 1049 { 1050 "role not assigned", 1051 types.NewMsgUnassignRole( 1052 proposerAddr, addr, 3, 1053 ), 1054 func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) { 1055 err2 := setPermissionToAddr(t, app, ctx, proposerAddr, types.PermUpsertRole) 1056 require.NoError(t, err2) 1057 1058 app.CustomGovKeeper.SetRole(ctx, types.Role{ 1059 Id: 3, 1060 Sid: "3", 1061 Description: "3", 1062 }) 1063 err2 = app.CustomGovKeeper.WhitelistRolePermission(ctx, 3, types.PermClaimValidator) 1064 require.NoError(t, err2) 1065 networkActor := types.NewDefaultActor(addr) 1066 app.CustomGovKeeper.SaveNetworkActor(ctx, networkActor) 1067 }, 1068 types.ErrRoleNotAssigned, 1069 }, 1070 } 1071 1072 for _, tt := range tests { 1073 app := simapp.Setup(false) 1074 ctx := app.NewContext(false, tmproto.Header{}) 1075 1076 tt.preparePerms(t, app, ctx) 1077 1078 handler := gov.NewHandler(app.CustomGovKeeper) 1079 _, err := handler(ctx, tt.msg) 1080 require.EqualError(t, err, tt.expectedErr.Error()) 1081 } 1082 } 1083 1084 func TestHandler_UnassignRoles(t *testing.T) { 1085 proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f") 1086 require.NoError(t, err) 1087 1088 addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d") 1089 require.NoError(t, err) 1090 1091 app := simapp.Setup(false) 1092 ctx := app.NewContext(false, tmproto.Header{}) 1093 1094 // Set permissions to proposer. 1095 err = setPermissionToAddr(t, app, ctx, proposerAddr, types.PermUpsertRole) 1096 require.NoError(t, err) 1097 1098 // Set new role and set permission to actor. 1099 app.CustomGovKeeper.SetRole(ctx, types.Role{ 1100 Id: 3, 1101 Sid: "3", 1102 Description: "3", 1103 }) 1104 err = app.CustomGovKeeper.WhitelistRolePermission(ctx, 3, types.PermSetPermissions) 1105 require.NoError(t, err) 1106 1107 actor := types.NewDefaultActor(addr) 1108 app.CustomGovKeeper.AssignRoleToActor(ctx, actor, 3) 1109 1110 actor, found := app.CustomGovKeeper.GetNetworkActorByAddress(ctx, addr) 1111 require.True(t, found) 1112 require.True(t, actor.HasRole(3)) 1113 1114 msg := types.NewMsgUnassignRole(proposerAddr, addr, 3) 1115 handler := gov.NewHandler(app.CustomGovKeeper) 1116 _, err = handler(ctx, msg) 1117 require.NoError(t, err) 1118 1119 actor, found = app.CustomGovKeeper.GetNetworkActorByAddress(ctx, addr) 1120 require.True(t, found) 1121 1122 require.False(t, actor.HasRole(3)) 1123 } 1124 1125 func TestHandler_CreateProposalAssignPermission_Errors(t *testing.T) { 1126 proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f") 1127 require.NoError(t, err) 1128 1129 addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d") 1130 require.NoError(t, err) 1131 1132 tests := []struct { 1133 name string 1134 content types.Content 1135 preparePerms func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) 1136 expectedErr error 1137 }{ 1138 { 1139 "Proposer does not have Perm", 1140 types.NewWhitelistAccountPermissionProposal( 1141 addr, types.PermClaimValidator, 1142 ), 1143 func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {}, 1144 errors.Wrap(types.ErrNotEnoughPermissions, types.PermWhitelistAccountPermissionProposal.String()), 1145 }, 1146 { 1147 "address already has that permission", 1148 types.NewWhitelistAccountPermissionProposal( 1149 addr, types.PermClaimValidator, 1150 ), 1151 func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) { 1152 proposerActor := types.NewDefaultActor(proposerAddr) 1153 err2 := app.CustomGovKeeper.AddWhitelistPermission(ctx, proposerActor, types.PermWhitelistAccountPermissionProposal) 1154 require.NoError(t, err2) 1155 1156 actor := types.NewDefaultActor(addr) 1157 err2 = app.CustomGovKeeper.AddWhitelistPermission(ctx, actor, types.PermClaimValidator) 1158 require.NoError(t, err2) 1159 }, 1160 fmt.Errorf("permission already whitelisted: error adding to whitelist"), 1161 }, 1162 } 1163 1164 for _, tt := range tests { 1165 tt := tt 1166 t.Run(tt.name, func(t *testing.T) { 1167 app := simapp.Setup(false) 1168 ctx := app.NewContext(false, tmproto.Header{}) 1169 1170 tt.preparePerms(t, app, ctx) 1171 1172 handler := gov.NewHandler(app.CustomGovKeeper) 1173 msg, err := types.NewMsgSubmitProposal(proposerAddr, "title", "some desc", tt.content) 1174 require.NoError(t, err) 1175 _, err = handler(ctx, msg) 1176 require.EqualError(t, err, tt.expectedErr.Error()) 1177 }) 1178 } 1179 } 1180 1181 func TestHandler_ProposalAssignPermission(t *testing.T) { 1182 proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f") 1183 require.NoError(t, err) 1184 1185 addr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d") 1186 require.NoError(t, err) 1187 1188 app := simapp.Setup(false) 1189 ctx := app.NewContext(false, tmproto.Header{ 1190 Time: time.Now(), 1191 }) 1192 1193 // Set proposer Permissions 1194 proposerActor := types.NewDefaultActor(proposerAddr) 1195 err2 := app.CustomGovKeeper.AddWhitelistPermission(ctx, proposerActor, types.PermWhitelistAccountPermissionProposal) 1196 require.NoError(t, err2) 1197 1198 properties := app.CustomGovKeeper.GetNetworkProperties(ctx) 1199 properties.MinimumProposalEndTime = 600 // Seconds, 10 mins 1200 app.CustomGovKeeper.SetNetworkProperties(ctx, properties) 1201 1202 handler := gov.NewHandler(app.CustomGovKeeper) 1203 proposal := types.NewWhitelistAccountPermissionProposal(addr, types.PermValue(1)) 1204 msg, err := types.NewMsgSubmitProposal(proposerAddr, "title", "some desc", proposal) 1205 require.NoError(t, err) 1206 res, err := handler( 1207 ctx, 1208 msg, 1209 ) 1210 require.NoError(t, err) 1211 1212 expData, _ := proto.Marshal(&types.MsgSubmitProposalResponse{ProposalID: 1}) 1213 require.Equal(t, expData, res.Data) 1214 1215 savedProposal, found := app.CustomGovKeeper.GetProposal(ctx, 1) 1216 require.True(t, found) 1217 1218 expectedSavedProposal, err := types.NewProposal( 1219 1, 1220 "title", 1221 "some desc", 1222 types.NewWhitelistAccountPermissionProposal( 1223 addr, 1224 types.PermValue(1), 1225 ), 1226 ctx.BlockTime(), 1227 ctx.BlockTime().Add(time.Second*time.Duration(properties.MinimumProposalEndTime)), 1228 ctx.BlockTime().Add((time.Second*time.Duration(properties.MinimumProposalEndTime))+(time.Second*time.Duration(properties.ProposalEnactmentTime))), 1229 ctx.BlockHeight()+2, 1230 ctx.BlockHeight()+3, 1231 ) 1232 require.NoError(t, err) 1233 require.Equal(t, expectedSavedProposal, savedProposal) 1234 1235 // Next proposal ID is increased. 1236 id := app.CustomGovKeeper.GetNextProposalID(ctx) 1237 require.Equal(t, uint64(2), id) 1238 1239 // Is not on finished active proposals. 1240 iterator := app.CustomGovKeeper.GetActiveProposalsWithFinishedVotingEndTimeIterator(ctx, ctx.BlockTime()) 1241 require.False(t, iterator.Valid()) 1242 1243 ctx = ctx.WithBlockTime(ctx.BlockTime().Add(time.Minute * 10)) 1244 iterator = app.CustomGovKeeper.GetActiveProposalsWithFinishedVotingEndTimeIterator(ctx, ctx.BlockTime()) 1245 require.True(t, iterator.Valid()) 1246 } 1247 1248 func TestHandler_CreateProposalUpsertDataRegistry_Errors(t *testing.T) { 1249 proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f") 1250 require.NoError(t, err) 1251 1252 tests := []struct { 1253 name string 1254 content types.Content 1255 preparePerms func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) 1256 expectedErr error 1257 }{ 1258 { 1259 "Proposer does not have Perm", 1260 types.NewUpsertDataRegistryProposal( 1261 "theKey", 1262 "theHash", 1263 "theReference", 1264 "theEncoding", 1265 1234, 1266 ), 1267 func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {}, 1268 errors.Wrap(types.ErrNotEnoughPermissions, types.PermCreateUpsertDataRegistryProposal.String()), 1269 }, 1270 } 1271 1272 for _, tt := range tests { 1273 tt := tt 1274 t.Run(tt.name, func(t *testing.T) { 1275 app := simapp.Setup(false) 1276 ctx := app.NewContext(false, tmproto.Header{}) 1277 1278 tt.preparePerms(t, app, ctx) 1279 1280 handler := gov.NewHandler(app.CustomGovKeeper) 1281 msg, err := types.NewMsgSubmitProposal(proposerAddr, "title", "some desc", tt.content) 1282 require.NoError(t, err) 1283 _, err = handler(ctx, msg) 1284 require.EqualError(t, err, tt.expectedErr.Error()) 1285 }) 1286 } 1287 } 1288 1289 func TestHandler_ProposalUpsertDataRegistry(t *testing.T) { 1290 proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f") 1291 require.NoError(t, err) 1292 1293 app := simapp.Setup(false) 1294 ctx := app.NewContext(false, tmproto.Header{ 1295 Time: time.Now(), 1296 }) 1297 1298 // Set proposer Permissions 1299 proposerActor := types.NewDefaultActor(proposerAddr) 1300 err2 := app.CustomGovKeeper.AddWhitelistPermission(ctx, proposerActor, types.PermCreateUpsertDataRegistryProposal) 1301 require.NoError(t, err2) 1302 1303 properties := app.CustomGovKeeper.GetNetworkProperties(ctx) 1304 properties.MinimumProposalEndTime = 10 1305 app.CustomGovKeeper.SetNetworkProperties(ctx, properties) 1306 1307 handler := gov.NewHandler(app.CustomGovKeeper) 1308 proposal := types.NewUpsertDataRegistryProposal( 1309 "theKey", 1310 "theHash", 1311 "theReference", 1312 "theEncoding", 1313 1234, 1314 ) 1315 msg, err := types.NewMsgSubmitProposal(proposerAddr, "title", "some desc", proposal) 1316 require.NoError(t, err) 1317 res, err := handler( 1318 ctx, msg, 1319 ) 1320 require.NoError(t, err) 1321 1322 expData, _ := proto.Marshal(&types.MsgSubmitProposalResponse{ProposalID: 1}) 1323 require.Equal(t, expData, res.Data) 1324 1325 savedProposal, found := app.CustomGovKeeper.GetProposal(ctx, 1) 1326 require.True(t, found) 1327 1328 expectedSavedProposal, err := types.NewProposal( 1329 1, 1330 "title", 1331 "some desc", 1332 types.NewUpsertDataRegistryProposal( 1333 "theKey", 1334 "theHash", 1335 "theReference", 1336 "theEncoding", 1337 1234, 1338 ), 1339 ctx.BlockTime(), 1340 ctx.BlockTime().Add(time.Second*time.Duration(properties.MinimumProposalEndTime)), 1341 ctx.BlockTime().Add(time.Second*time.Duration(properties.ProposalEnactmentTime)+time.Second*time.Duration(properties.MinimumProposalEndTime)), 1342 ctx.BlockHeight()+2, 1343 ctx.BlockHeight()+3, 1344 ) 1345 require.NoError(t, err) 1346 require.Equal(t, expectedSavedProposal, savedProposal) 1347 1348 // Next proposal ID is increased. 1349 id := app.CustomGovKeeper.GetNextProposalID(ctx) 1350 require.Equal(t, uint64(2), id) 1351 1352 // Is not on finished active proposals. 1353 iterator := app.CustomGovKeeper.GetActiveProposalsWithFinishedVotingEndTimeIterator(ctx, ctx.BlockTime()) 1354 require.False(t, iterator.Valid()) 1355 1356 ctx = ctx.WithBlockTime(ctx.BlockTime().Add(time.Minute * 10)) 1357 iterator = app.CustomGovKeeper.GetActiveProposalsWithFinishedVotingEndTimeIterator(ctx, ctx.BlockTime()) 1358 require.True(t, iterator.Valid()) 1359 } 1360 1361 func TestHandler_VoteProposal_Errors(t *testing.T) { 1362 voterAddr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d") 1363 require.NoError(t, err) 1364 1365 tests := []struct { 1366 name string 1367 msg *types.MsgVoteProposal 1368 preparePerms func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) 1369 expectedErr error 1370 }{ 1371 { 1372 "voting time has finished", 1373 types.NewMsgVoteProposal( 1374 1, voterAddr, types.OptionAbstain, sdk.ZeroDec(), 1375 ), 1376 func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) { 1377 actor := types.NewNetworkActor( 1378 voterAddr, 1379 []uint64{}, 1380 types.Active, 1381 []types.VoteOption{}, 1382 types.NewPermissions(nil, nil), 1383 1, 1384 ) 1385 app.CustomGovKeeper.SaveNetworkActor(ctx, actor) 1386 1387 err = app.CustomGovKeeper.AddWhitelistPermission(ctx, actor, types.PermVoteWhitelistAccountPermissionProposal) 1388 require.NoError(t, err) 1389 1390 // Create proposal 1391 proposal, err := types.NewProposal( 1392 1, 1393 "title", 1394 "some desc", 1395 types.NewWhitelistAccountPermissionProposal( 1396 voterAddr, 1397 types.PermClaimCouncilor, 1398 ), 1399 ctx.BlockTime(), 1400 ctx.BlockTime().Add(time.Second*9), 1401 ctx.BlockTime().Add(time.Second*20), 1402 ctx.BlockHeight()+2, 1403 ctx.BlockHeight()+3, 1404 ) 1405 1406 require.NoError(t, err) 1407 app.CustomGovKeeper.SaveProposal(ctx, proposal) 1408 }, 1409 types.ErrVotingTimeEnded, 1410 }, 1411 { 1412 "Voter does not have permission to vote this proposal: Assign Permission", 1413 types.NewMsgVoteProposal( 1414 1, voterAddr, types.OptionAbstain, sdk.ZeroDec(), 1415 ), 1416 func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) { 1417 actor := types.NewNetworkActor( 1418 voterAddr, 1419 []uint64{}, 1420 types.Active, 1421 []types.VoteOption{}, 1422 types.NewPermissions(nil, nil), 1423 1, 1424 ) 1425 app.CustomGovKeeper.SaveNetworkActor(ctx, actor) 1426 1427 // Create proposal 1428 proposal, err := types.NewProposal( 1429 1, 1430 "title", 1431 "some desc", 1432 types.NewWhitelistAccountPermissionProposal( 1433 voterAddr, 1434 types.PermClaimCouncilor, 1435 ), 1436 ctx.BlockTime(), 1437 ctx.BlockTime().Add(time.Second*20), 1438 ctx.BlockTime().Add(time.Second*30), 1439 ctx.BlockHeight()+2, 1440 ctx.BlockHeight()+3, 1441 ) 1442 require.NoError(t, err) 1443 app.CustomGovKeeper.SaveProposal(ctx, proposal) 1444 }, 1445 fmt.Errorf("%s: not enough permissions", types.PermVoteWhitelistAccountPermissionProposal.String()), 1446 }, 1447 { 1448 "Voter does not have permission to vote this proposal: Change Data Registry", 1449 types.NewMsgVoteProposal( 1450 1, voterAddr, types.OptionAbstain, sdk.ZeroDec(), 1451 ), 1452 func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) { 1453 actor := types.NewNetworkActor( 1454 voterAddr, 1455 []uint64{}, 1456 types.Active, 1457 []types.VoteOption{}, 1458 types.NewPermissions(nil, nil), 1459 1, 1460 ) 1461 app.CustomGovKeeper.SaveNetworkActor(ctx, actor) 1462 1463 // Create proposal 1464 proposal, err := types.NewProposal( 1465 1, 1466 "title", 1467 "some desc", 1468 types.NewUpsertDataRegistryProposal( 1469 "theKey", 1470 "theHash", 1471 "theReference", 1472 "theEncoding", 1473 1234, 1474 ), 1475 ctx.BlockTime(), 1476 ctx.BlockTime().Add(time.Second*20), 1477 ctx.BlockTime().Add(time.Second*30), 1478 ctx.BlockHeight()+2, 1479 ctx.BlockHeight()+3, 1480 ) 1481 require.NoError(t, err) 1482 app.CustomGovKeeper.SaveProposal(ctx, proposal) 1483 }, 1484 fmt.Errorf("%s: not enough permissions", types.PermVoteUpsertDataRegistryProposal.String()), 1485 }, 1486 { 1487 "Proposal does not exist", 1488 types.NewMsgVoteProposal( 1489 1, voterAddr, types.OptionAbstain, sdk.ZeroDec(), 1490 ), 1491 func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) { 1492 actor := types.NewNetworkActor( 1493 voterAddr, 1494 []uint64{}, 1495 types.Active, 1496 []types.VoteOption{}, 1497 types.NewPermissions(nil, nil), 1498 1, 1499 ) 1500 app.CustomGovKeeper.SaveNetworkActor(ctx, actor) 1501 err2 := app.CustomGovKeeper.AddWhitelistPermission(ctx, actor, types.PermVoteWhitelistAccountPermissionProposal) 1502 require.NoError(t, err2) 1503 }, 1504 types.ErrProposalDoesNotExist, 1505 }, 1506 { 1507 "Voter is not active", 1508 types.NewMsgVoteProposal( 1509 1, voterAddr, types.OptionAbstain, sdk.ZeroDec(), 1510 ), 1511 func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) { 1512 actor := types.NewDefaultActor(voterAddr) 1513 actor.Deactivate() 1514 app.CustomGovKeeper.SaveNetworkActor(ctx, actor) 1515 err2 := app.CustomGovKeeper.AddWhitelistPermission(ctx, actor, types.PermVoteWhitelistAccountPermissionProposal) 1516 require.NoError(t, err2) 1517 }, 1518 types.ErrActorIsNotActive, 1519 }, 1520 { 1521 "Voter does not have permission to vote this proposal: Change Network Property", 1522 types.NewMsgVoteProposal( 1523 1, voterAddr, types.OptionAbstain, sdk.ZeroDec(), 1524 ), 1525 func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) { 1526 actor := types.NewNetworkActor( 1527 voterAddr, 1528 []uint64{}, 1529 types.Active, 1530 []types.VoteOption{}, 1531 types.NewPermissions(nil, nil), 1532 1, 1533 ) 1534 app.CustomGovKeeper.SaveNetworkActor(ctx, actor) 1535 1536 // Create proposal 1537 proposal, err := types.NewProposal( 1538 1, 1539 "title", 1540 "some desc", 1541 types.NewSetNetworkPropertyProposal( 1542 types.MinTxFee, 1543 types.NetworkPropertyValue{Value: 1234}, 1544 ), 1545 ctx.BlockTime(), 1546 ctx.BlockTime().Add(time.Second*20), 1547 ctx.BlockTime().Add(time.Second*30), 1548 ctx.BlockHeight()+2, 1549 ctx.BlockHeight()+3, 1550 ) 1551 require.NoError(t, err) 1552 app.CustomGovKeeper.SaveProposal(ctx, proposal) 1553 }, 1554 fmt.Errorf("%s: not enough permissions", types.PermVoteSetNetworkPropertyProposal.String()), 1555 }, 1556 { 1557 "Voter does not have permission to vote this proposal: UpsertTokenAlias", 1558 types.NewMsgVoteProposal( 1559 1, voterAddr, types.OptionAbstain, sdk.ZeroDec(), 1560 ), 1561 func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) { 1562 actor := types.NewNetworkActor( 1563 voterAddr, 1564 []uint64{}, 1565 types.Active, 1566 []types.VoteOption{}, 1567 types.NewPermissions(nil, nil), 1568 1, 1569 ) 1570 app.CustomGovKeeper.SaveNetworkActor(ctx, actor) 1571 1572 // Create proposal 1573 proposal, err := types.NewProposal( 1574 1, 1575 "title", 1576 "some desc", 1577 tokenstypes.NewUpsertTokenAliasProposal( 1578 "eur", 1579 "Euro", 1580 "theIcon", 1581 12, 1582 []string{}, 1583 false, 1584 ), 1585 ctx.BlockTime(), 1586 ctx.BlockTime().Add(time.Second*20), 1587 ctx.BlockTime().Add(time.Second*30), 1588 ctx.BlockHeight()+2, 1589 ctx.BlockHeight()+3, 1590 ) 1591 require.NoError(t, err) 1592 app.CustomGovKeeper.SaveProposal(ctx, proposal) 1593 }, 1594 fmt.Errorf("%s: not enough permissions", types.PermVoteUpsertTokenAliasProposal.String()), 1595 }, 1596 } 1597 1598 for _, tt := range tests { 1599 tt := tt 1600 t.Run(tt.name, func(t *testing.T) { 1601 app := simapp.Setup(false) 1602 ctx := app.NewContext(false, tmproto.Header{}).WithBlockTime(time.Now()) 1603 1604 tt.preparePerms(t, app, ctx) 1605 1606 // Add some BlockTime. 1607 ctx = ctx.WithBlockTime(ctx.BlockTime().Add(time.Second * 10)) 1608 1609 handler := gov.NewHandler(app.CustomGovKeeper) 1610 _, err := handler(ctx, tt.msg) 1611 require.EqualError(t, err, tt.expectedErr.Error()) 1612 }) 1613 } 1614 } 1615 1616 func TestHandler_VoteProposal(t *testing.T) { 1617 voterAddr, err := sdk.AccAddressFromBech32("kira15ky9du8a2wlstz6fpx3p4mqpjyrm5cgqzp4f3d") 1618 require.NoError(t, err) 1619 1620 app := simapp.Setup(false) 1621 ctx := app.NewContext(false, tmproto.Header{}) 1622 1623 // Create Voter as active actor. 1624 actor := types.NewNetworkActor( 1625 voterAddr, 1626 []uint64{}, 1627 types.Active, 1628 []types.VoteOption{}, 1629 types.NewPermissions(nil, nil), 1630 1, 1631 ) 1632 app.CustomGovKeeper.SaveNetworkActor(ctx, actor) 1633 err2 := app.CustomGovKeeper.AddWhitelistPermission(ctx, actor, types.PermVoteWhitelistAccountPermissionProposal) 1634 require.NoError(t, err2) 1635 1636 // Create proposal 1637 proposal, err := types.NewProposal( 1638 1, 1639 "title", 1640 "some desc", 1641 types.NewWhitelistAccountPermissionProposal( 1642 voterAddr, 1643 types.PermClaimCouncilor, 1644 ), 1645 ctx.BlockTime(), 1646 ctx.BlockTime().Add(time.Second*1), 1647 ctx.BlockTime().Add(time.Second*10), 1648 ctx.BlockHeight()+2, 1649 ctx.BlockHeight()+3, 1650 ) 1651 require.NoError(t, err) 1652 app.CustomGovKeeper.SaveProposal(ctx, proposal) 1653 1654 msg := types.NewMsgVoteProposal(proposal.ProposalId, voterAddr, types.OptionAbstain, sdk.ZeroDec()) 1655 handler := gov.NewHandler(app.CustomGovKeeper) 1656 _, err = handler(ctx, msg) 1657 require.NoError(t, err) 1658 1659 vote, found := app.CustomGovKeeper.GetVote(ctx, proposal.ProposalId, voterAddr) 1660 require.True(t, found) 1661 require.Equal(t, types.NewVote(proposal.ProposalId, voterAddr, types.OptionAbstain, sdk.ZeroDec()), vote) 1662 } 1663 1664 func setPermissionToAddr(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context, addr sdk.AccAddress, perm types.PermValue) error { 1665 proposerActor := types.NewDefaultActor(addr) 1666 err := app.CustomGovKeeper.AddWhitelistPermission(ctx, proposerActor, perm) 1667 require.NoError(t, err) 1668 1669 return nil 1670 } 1671 1672 func TestHandler_CreateProposalSetNetworkProperty_Errors(t *testing.T) { 1673 proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f") 1674 require.NoError(t, err) 1675 1676 tests := []struct { 1677 name string 1678 content types.Content 1679 preparePerms func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) 1680 expectedErr error 1681 }{ 1682 { 1683 "Proposer does not have Perm", 1684 types.NewSetNetworkPropertyProposal( 1685 types.MaxTxFee, 1686 types.NetworkPropertyValue{Value: 100000}, 1687 ), 1688 func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {}, 1689 errors.Wrap(types.ErrNotEnoughPermissions, types.PermCreateSetNetworkPropertyProposal.String()), 1690 }, 1691 } 1692 1693 for _, tt := range tests { 1694 tt := tt 1695 t.Run(tt.name, func(t *testing.T) { 1696 app := simapp.Setup(false) 1697 ctx := app.NewContext(false, tmproto.Header{}) 1698 1699 tt.preparePerms(t, app, ctx) 1700 1701 handler := gov.NewHandler(app.CustomGovKeeper) 1702 msg, err := types.NewMsgSubmitProposal(proposerAddr, "title", "some desc", tt.content) 1703 require.NoError(t, err) 1704 _, err = handler(ctx, msg) 1705 require.EqualError(t, err, tt.expectedErr.Error()) 1706 }) 1707 } 1708 } 1709 1710 func TestHandler_ProposalSetNetworkProperty(t *testing.T) { 1711 proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f") 1712 require.NoError(t, err) 1713 1714 app := simapp.Setup(false) 1715 ctx := app.NewContext(false, tmproto.Header{ 1716 Time: time.Now(), 1717 }) 1718 1719 // Set proposer Permissions 1720 proposerActor := types.NewDefaultActor(proposerAddr) 1721 err2 := app.CustomGovKeeper.AddWhitelistPermission(ctx, proposerActor, types.PermCreateSetNetworkPropertyProposal) 1722 require.NoError(t, err2) 1723 1724 properties := app.CustomGovKeeper.GetNetworkProperties(ctx) 1725 properties.MinimumProposalEndTime = 10 1726 app.CustomGovKeeper.SetNetworkProperties(ctx, properties) 1727 1728 handler := gov.NewHandler(app.CustomGovKeeper) 1729 proposal := types.NewSetNetworkPropertyProposal( 1730 types.MinTxFee, 1731 types.NetworkPropertyValue{Value: 1234}, 1732 ) 1733 msg, err := types.NewMsgSubmitProposal(proposerAddr, "title", "some desc", proposal) 1734 require.NoError(t, err) 1735 res, err := handler( 1736 ctx, 1737 msg, 1738 ) 1739 require.NoError(t, err) 1740 1741 expData, _ := proto.Marshal(&types.MsgSubmitProposalResponse{ProposalID: 1}) 1742 require.Equal(t, expData, res.Data) 1743 1744 savedProposal, found := app.CustomGovKeeper.GetProposal(ctx, 1) 1745 require.True(t, found) 1746 1747 expectedSavedProposal, err := types.NewProposal( 1748 1, 1749 "title", 1750 "some desc", 1751 types.NewSetNetworkPropertyProposal( 1752 types.MinTxFee, 1753 types.NetworkPropertyValue{Value: 1234}, 1754 ), 1755 ctx.BlockTime(), 1756 ctx.BlockTime().Add(time.Second*time.Duration(properties.MinimumProposalEndTime)), 1757 ctx.BlockTime().Add(time.Second*time.Duration(properties.ProposalEnactmentTime)+time.Second*time.Duration(properties.MinimumProposalEndTime)), 1758 ctx.BlockHeight()+2, 1759 ctx.BlockHeight()+3, 1760 ) 1761 require.NoError(t, err) 1762 require.Equal(t, expectedSavedProposal, savedProposal) 1763 1764 // Next proposal ID is increased. 1765 id := app.CustomGovKeeper.GetNextProposalID(ctx) 1766 require.Equal(t, uint64(2), id) 1767 1768 // Is not on finished active proposals. 1769 iterator := app.CustomGovKeeper.GetActiveProposalsWithFinishedVotingEndTimeIterator(ctx, ctx.BlockTime()) 1770 require.False(t, iterator.Valid()) 1771 1772 ctx = ctx.WithBlockTime(ctx.BlockTime().Add(time.Minute * 10)) 1773 iterator = app.CustomGovKeeper.GetActiveProposalsWithFinishedVotingEndTimeIterator(ctx, ctx.BlockTime()) 1774 require.True(t, iterator.Valid()) 1775 } 1776 1777 func TestHandler_CreateProposalCreateRole_Errors(t *testing.T) { 1778 proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f") 1779 require.NoError(t, err) 1780 1781 tests := []struct { 1782 name string 1783 content types.Content 1784 preparePerms func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) 1785 expectedErr error 1786 }{ 1787 { 1788 "Proposer does not have Perm", 1789 types.NewCreateRoleProposal( 1790 "role1", 1791 "role1 description", 1792 []types.PermValue{}, 1793 []types.PermValue{types.PermClaimValidator}, 1794 ), 1795 func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) {}, 1796 errors.Wrap(types.ErrNotEnoughPermissions, types.PermCreateRoleProposal.String()), 1797 }, 1798 { 1799 "role already exist", 1800 types.NewCreateRoleProposal( 1801 "role1", 1802 "role1 description", 1803 []types.PermValue{types.PermClaimCouncilor}, 1804 []types.PermValue{}, 1805 ), 1806 func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) { 1807 proposerActor := types.NewDefaultActor(proposerAddr) 1808 err := app.CustomGovKeeper.AddWhitelistPermission( 1809 ctx, 1810 proposerActor, 1811 types.PermCreateRoleProposal, 1812 ) 1813 require.NoError(t, err) 1814 1815 app.CustomGovKeeper.SetRole(ctx, types.Role{ 1816 Id: 1, 1817 Sid: "role1", 1818 Description: "role1 description", 1819 }) 1820 }, 1821 types.ErrRoleExist, 1822 }, 1823 { 1824 "permissions are empty", 1825 types.NewCreateRoleProposal( 1826 "role1000", 1827 "role1000 description", 1828 []types.PermValue{}, 1829 []types.PermValue{}, 1830 ), 1831 func(t *testing.T, app *simapp.SekaiApp, ctx sdk.Context) { 1832 proposerActor := types.NewDefaultActor(proposerAddr) 1833 err := app.CustomGovKeeper.AddWhitelistPermission( 1834 ctx, 1835 proposerActor, 1836 types.PermCreateRoleProposal, 1837 ) 1838 require.NoError(t, err) 1839 }, 1840 types.ErrEmptyPermissions, 1841 }, 1842 } 1843 1844 for _, tt := range tests { 1845 tt := tt 1846 t.Run(tt.name, func(t *testing.T) { 1847 app := simapp.Setup(false) 1848 ctx := app.NewContext(false, tmproto.Header{}) 1849 1850 tt.preparePerms(t, app, ctx) 1851 1852 handler := gov.NewHandler(app.CustomGovKeeper) 1853 msg, err := types.NewMsgSubmitProposal(proposerAddr, "title", "some desc", tt.content) 1854 require.NoError(t, err) 1855 _, err = handler(ctx, msg) 1856 require.EqualError(t, err, tt.expectedErr.Error()) 1857 }) 1858 } 1859 } 1860 1861 func TestHandler_ProposalCreateRole(t *testing.T) { 1862 proposerAddr, err := sdk.AccAddressFromBech32("kira1alzyfq40zjsveat87jlg8jxetwqmr0a29sgd0f") 1863 require.NoError(t, err) 1864 1865 app := simapp.Setup(false) 1866 ctx := app.NewContext(false, tmproto.Header{ 1867 Time: time.Now(), 1868 }) 1869 1870 // Set proposer Permissions 1871 proposerActor := types.NewDefaultActor(proposerAddr) 1872 err2 := app.CustomGovKeeper.AddWhitelistPermission(ctx, proposerActor, types.PermCreateRoleProposal) 1873 require.NoError(t, err2) 1874 1875 properties := app.CustomGovKeeper.GetNetworkProperties(ctx) 1876 properties.MinimumProposalEndTime = 10 1877 app.CustomGovKeeper.SetNetworkProperties(ctx, properties) 1878 1879 handler := gov.NewHandler(app.CustomGovKeeper) 1880 proposal := types.NewCreateRoleProposal( 1881 "role1000", 1882 "role1000 description", 1883 []types.PermValue{ 1884 types.PermClaimValidator, 1885 }, 1886 []types.PermValue{ 1887 types.PermChangeTxFee, 1888 }, 1889 ) 1890 msg, err := types.NewMsgSubmitProposal(proposerAddr, "title", "some desc", proposal) 1891 require.NoError(t, err) 1892 res, err := handler( 1893 ctx, 1894 msg, 1895 ) 1896 require.NoError(t, err) 1897 1898 expData, _ := proto.Marshal(&types.MsgSubmitProposalResponse{ProposalID: 1}) 1899 require.Equal(t, expData, res.Data) 1900 1901 savedProposal, found := app.CustomGovKeeper.GetProposal(ctx, 1) 1902 require.True(t, found) 1903 1904 expectedSavedProposal, err := types.NewProposal( 1905 1, 1906 "title", 1907 "some desc", 1908 types.NewCreateRoleProposal( 1909 "role1000", 1910 "role1000 description", 1911 []types.PermValue{ 1912 types.PermClaimValidator, 1913 }, 1914 []types.PermValue{ 1915 types.PermChangeTxFee, 1916 }, 1917 ), 1918 ctx.BlockTime(), 1919 ctx.BlockTime().Add(time.Second*time.Duration(properties.MinimumProposalEndTime)), 1920 ctx.BlockTime().Add(time.Second*time.Duration(properties.ProposalEnactmentTime)+time.Second*time.Duration(properties.MinimumProposalEndTime)), 1921 ctx.BlockHeight()+2, 1922 ctx.BlockHeight()+3, 1923 ) 1924 require.NoError(t, err) 1925 require.Equal(t, expectedSavedProposal, savedProposal) 1926 1927 // Next proposal ID is increased. 1928 id := app.CustomGovKeeper.GetNextProposalID(ctx) 1929 require.Equal(t, uint64(2), id) 1930 1931 // Is not on finished active proposals. 1932 iterator := app.CustomGovKeeper.GetActiveProposalsWithFinishedVotingEndTimeIterator(ctx, ctx.BlockTime()) 1933 require.False(t, iterator.Valid()) 1934 1935 ctx = ctx.WithBlockTime(ctx.BlockTime().Add(time.Minute * 10)) 1936 iterator = app.CustomGovKeeper.GetActiveProposalsWithFinishedVotingEndTimeIterator(ctx, ctx.BlockTime()) 1937 require.True(t, iterator.Valid()) 1938 } 1939 1940 func TestHandler_SetProposalDurationsProposal(t *testing.T) { 1941 app := simapp.Setup(false) 1942 ctx := app.NewContext(false, tmproto.Header{ 1943 Time: time.Now(), 1944 }) 1945 1946 proposal := types.NewSetProposalDurationsProposal( 1947 []string{kiratypes.ProposalTypeCreateRole, kiratypes.ProposalTypeSetNetworkProperty}, 1948 []uint64{1200, 2400}, // 20 min, 40min 1949 ) 1950 1951 router := app.CustomGovKeeper.GetProposalRouter() 1952 err := router.ApplyProposal(ctx, 1, proposal, sdk.ZeroDec()) 1953 require.NoError(t, err) 1954 1955 duration := app.CustomGovKeeper.GetProposalDuration(ctx, kiratypes.ProposalTypeCreateRole) 1956 require.Equal(t, duration, uint64(1200)) 1957 1958 duration = app.CustomGovKeeper.GetProposalDuration(ctx, kiratypes.ProposalTypeSetNetworkProperty) 1959 require.Equal(t, duration, uint64(2400)) 1960 }