github.com/Finschia/finschia-sdk@v0.48.1/x/distribution/client/testutil/suite.go (about) 1 package testutil 2 3 import ( 4 "fmt" 5 "strings" 6 "time" 7 8 "github.com/gogo/protobuf/proto" 9 "github.com/stretchr/testify/suite" 10 11 ostcli "github.com/Finschia/ostracon/libs/cli" 12 13 "github.com/Finschia/finschia-sdk/client/flags" 14 "github.com/Finschia/finschia-sdk/testutil" 15 clitestutil "github.com/Finschia/finschia-sdk/testutil/cli" 16 "github.com/Finschia/finschia-sdk/testutil/network" 17 sdk "github.com/Finschia/finschia-sdk/types" 18 "github.com/Finschia/finschia-sdk/x/distribution/client/cli" 19 minttypes "github.com/Finschia/finschia-sdk/x/mint/types" 20 ) 21 22 type IntegrationTestSuite struct { 23 suite.Suite 24 25 cfg network.Config 26 network *network.Network 27 } 28 29 func NewIntegrationTestSuite(cfg network.Config) *IntegrationTestSuite { 30 return &IntegrationTestSuite{cfg: cfg} 31 } 32 33 // SetupTest creates a new network for _each_ integration test. We create a new 34 // network for each test because there are some state modifications that are 35 // needed to be made in order to make useful queries. However, we don't want 36 // these state changes to be present in other tests. 37 func (s *IntegrationTestSuite) SetupTest() { 38 s.T().Log("setting up integration test suite") 39 40 genesisState := s.cfg.GenesisState 41 var mintData minttypes.GenesisState 42 s.Require().NoError(s.cfg.Codec.UnmarshalJSON(genesisState[minttypes.ModuleName], &mintData)) 43 44 inflation := sdk.MustNewDecFromStr("1.0") 45 mintData.Minter.Inflation = inflation 46 mintData.Params.InflationMin = inflation 47 mintData.Params.InflationMax = inflation 48 49 mintDataBz, err := s.cfg.Codec.MarshalJSON(&mintData) 50 s.Require().NoError(err) 51 genesisState[minttypes.ModuleName] = mintDataBz 52 s.cfg.GenesisState = genesisState 53 54 s.network = network.New(s.T(), s.cfg) 55 56 _, err = s.network.WaitForHeight(1) 57 s.Require().NoError(err) 58 } 59 60 // TearDownTest cleans up the curret test network after _each_ test. 61 func (s *IntegrationTestSuite) TearDownTest() { 62 s.T().Log("tearing down integration test suite") 63 s.network.Cleanup() 64 } 65 66 func (s *IntegrationTestSuite) TestGetCmdQueryParams() { 67 val := s.network.Validators[0] 68 69 testCases := []struct { 70 name string 71 args []string 72 expectedOutput string 73 }{ 74 { 75 "json output", 76 []string{fmt.Sprintf("--%s=json", ostcli.OutputFlag)}, 77 `{"community_tax":"0.020000000000000000","base_proposer_reward":"0.010000000000000000","bonus_proposer_reward":"0.040000000000000000","withdraw_addr_enabled":true}`, 78 }, 79 { 80 "text output", 81 []string{fmt.Sprintf("--%s=text", ostcli.OutputFlag)}, 82 `base_proposer_reward: "0.010000000000000000" 83 bonus_proposer_reward: "0.040000000000000000" 84 community_tax: "0.020000000000000000" 85 withdraw_addr_enabled: true`, 86 }, 87 } 88 89 for _, tc := range testCases { 90 tc := tc 91 92 s.Run(tc.name, func() { 93 cmd := cli.GetCmdQueryParams() 94 clientCtx := val.ClientCtx 95 96 out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) 97 s.Require().NoError(err) 98 s.Require().Equal(tc.expectedOutput, strings.TrimSpace(out.String())) 99 }) 100 } 101 } 102 103 func (s *IntegrationTestSuite) TestGetCmdQueryValidatorOutstandingRewards() { 104 val := s.network.Validators[0] 105 106 _, err := s.network.WaitForHeight(4) 107 s.Require().NoError(err) 108 109 testCases := []struct { 110 name string 111 args []string 112 expectErr bool 113 expectedOutput string 114 }{ 115 { 116 "invalid validator address", 117 []string{ 118 fmt.Sprintf("--%s=3", flags.FlagHeight), 119 "foo", 120 }, 121 true, 122 "", 123 }, 124 { 125 "json output", 126 []string{ 127 fmt.Sprintf("--%s=3", flags.FlagHeight), 128 sdk.ValAddress(val.Address).String(), 129 fmt.Sprintf("--%s=json", ostcli.OutputFlag), 130 }, 131 false, 132 `{"rewards":[{"denom":"stake","amount":"1164.240000000000000000"}]}`, 133 }, 134 { 135 "text output", 136 []string{ 137 fmt.Sprintf("--%s=text", ostcli.OutputFlag), 138 fmt.Sprintf("--%s=3", flags.FlagHeight), 139 sdk.ValAddress(val.Address).String(), 140 }, 141 false, 142 `rewards: 143 - amount: "1164.240000000000000000" 144 denom: stake`, 145 }, 146 } 147 148 for _, tc := range testCases { 149 tc := tc 150 151 s.Run(tc.name, func() { 152 cmd := cli.GetCmdQueryValidatorOutstandingRewards() 153 clientCtx := val.ClientCtx 154 155 out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) 156 if tc.expectErr { 157 s.Require().Error(err) 158 } else { 159 s.Require().NoError(err) 160 s.Require().Equal(tc.expectedOutput, strings.TrimSpace(out.String())) 161 } 162 }) 163 } 164 } 165 166 func (s *IntegrationTestSuite) TestGetCmdQueryValidatorCommission() { 167 val := s.network.Validators[0] 168 169 _, err := s.network.WaitForHeight(4) 170 s.Require().NoError(err) 171 172 testCases := []struct { 173 name string 174 args []string 175 expectErr bool 176 expectedOutput string 177 }{ 178 { 179 "invalid validator address", 180 []string{ 181 fmt.Sprintf("--%s=3", flags.FlagHeight), 182 "foo", 183 }, 184 true, 185 "", 186 }, 187 { 188 "json output", 189 []string{ 190 fmt.Sprintf("--%s=3", flags.FlagHeight), 191 sdk.ValAddress(val.Address).String(), 192 fmt.Sprintf("--%s=json", ostcli.OutputFlag), 193 }, 194 false, 195 `{"commission":[{"denom":"stake","amount":"464.520000000000000000"}]}`, 196 }, 197 { 198 "text output", 199 []string{ 200 fmt.Sprintf("--%s=text", ostcli.OutputFlag), 201 fmt.Sprintf("--%s=3", flags.FlagHeight), 202 sdk.ValAddress(val.Address).String(), 203 }, 204 false, 205 `commission: 206 - amount: "464.520000000000000000" 207 denom: stake`, 208 }, 209 } 210 211 for _, tc := range testCases { 212 tc := tc 213 214 s.Run(tc.name, func() { 215 cmd := cli.GetCmdQueryValidatorCommission() 216 clientCtx := val.ClientCtx 217 218 out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) 219 if tc.expectErr { 220 s.Require().Error(err) 221 } else { 222 s.Require().NoError(err) 223 s.Require().Equal(tc.expectedOutput, strings.TrimSpace(out.String())) 224 } 225 }) 226 } 227 } 228 229 func (s *IntegrationTestSuite) TestGetCmdQueryValidatorSlashes() { 230 val := s.network.Validators[0] 231 232 _, err := s.network.WaitForHeight(4) 233 s.Require().NoError(err) 234 235 testCases := []struct { 236 name string 237 args []string 238 expectErr bool 239 expectedOutput string 240 }{ 241 { 242 "invalid validator address", 243 []string{ 244 fmt.Sprintf("--%s=3", flags.FlagHeight), 245 "foo", "1", "3", 246 }, 247 true, 248 "", 249 }, 250 { 251 "invalid start height", 252 []string{ 253 fmt.Sprintf("--%s=3", flags.FlagHeight), 254 sdk.ValAddress(val.Address).String(), "-1", "3", 255 }, 256 true, 257 "", 258 }, 259 { 260 "invalid end height", 261 []string{ 262 fmt.Sprintf("--%s=3", flags.FlagHeight), 263 sdk.ValAddress(val.Address).String(), "1", "-3", 264 }, 265 true, 266 "", 267 }, 268 { 269 "json output", 270 []string{ 271 fmt.Sprintf("--%s=3", flags.FlagHeight), 272 sdk.ValAddress(val.Address).String(), "1", "3", 273 fmt.Sprintf("--%s=json", ostcli.OutputFlag), 274 }, 275 false, 276 "{\"slashes\":[],\"pagination\":{\"next_key\":null,\"total\":\"0\"}}", 277 }, 278 { 279 "text output", 280 []string{ 281 fmt.Sprintf("--%s=text", ostcli.OutputFlag), 282 fmt.Sprintf("--%s=3", flags.FlagHeight), 283 sdk.ValAddress(val.Address).String(), "1", "3", 284 }, 285 false, 286 "pagination:\n next_key: null\n total: \"0\"\nslashes: []", 287 }, 288 } 289 290 for _, tc := range testCases { 291 tc := tc 292 293 s.Run(tc.name, func() { 294 cmd := cli.GetCmdQueryValidatorSlashes() 295 clientCtx := val.ClientCtx 296 297 out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) 298 if tc.expectErr { 299 s.Require().Error(err) 300 } else { 301 s.Require().NoError(err) 302 s.Require().Equal(tc.expectedOutput, strings.TrimSpace(out.String())) 303 } 304 }) 305 } 306 } 307 308 func (s *IntegrationTestSuite) TestGetCmdQueryDelegatorRewards() { 309 val := s.network.Validators[0] 310 addr := val.Address 311 valAddr := sdk.ValAddress(addr) 312 313 _, err := s.network.WaitForHeightWithTimeout(11, time.Minute) 314 s.Require().NoError(err) 315 316 testCases := []struct { 317 name string 318 args []string 319 expectErr bool 320 expectedOutput string 321 }{ 322 { 323 "invalid delegator address", 324 []string{ 325 fmt.Sprintf("--%s=5", flags.FlagHeight), 326 "foo", valAddr.String(), 327 }, 328 true, 329 "", 330 }, 331 { 332 "invalid validator address", 333 []string{ 334 fmt.Sprintf("--%s=5", flags.FlagHeight), 335 addr.String(), "foo", 336 }, 337 true, 338 "", 339 }, 340 { 341 "json output", 342 []string{ 343 fmt.Sprintf("--%s=5", flags.FlagHeight), 344 addr.String(), 345 fmt.Sprintf("--%s=json", ostcli.OutputFlag), 346 }, 347 false, 348 fmt.Sprintf(`{"rewards":[{"validator_address":"%s","reward":[{"denom":"stake","amount":"387.100000000000000000"}]}],"total":[{"denom":"stake","amount":"387.100000000000000000"}]}`, valAddr.String()), 349 }, 350 { 351 "json output (specific validator)", 352 []string{ 353 fmt.Sprintf("--%s=5", flags.FlagHeight), 354 addr.String(), valAddr.String(), 355 fmt.Sprintf("--%s=json", ostcli.OutputFlag), 356 }, 357 false, 358 `{"rewards":[{"denom":"stake","amount":"387.100000000000000000"}]}`, 359 }, 360 { 361 "text output", 362 []string{ 363 fmt.Sprintf("--%s=text", ostcli.OutputFlag), 364 fmt.Sprintf("--%s=5", flags.FlagHeight), 365 addr.String(), 366 }, 367 false, 368 fmt.Sprintf(`rewards: 369 - reward: 370 - amount: "387.100000000000000000" 371 denom: stake 372 validator_address: %s 373 total: 374 - amount: "387.100000000000000000" 375 denom: stake`, valAddr.String()), 376 }, 377 { 378 "text output (specific validator)", 379 []string{ 380 fmt.Sprintf("--%s=text", ostcli.OutputFlag), 381 fmt.Sprintf("--%s=5", flags.FlagHeight), 382 addr.String(), valAddr.String(), 383 }, 384 false, 385 `rewards: 386 - amount: "387.100000000000000000" 387 denom: stake`, 388 }, 389 } 390 391 for _, tc := range testCases { 392 tc := tc 393 394 s.Run(tc.name, func() { 395 cmd := cli.GetCmdQueryDelegatorRewards() 396 clientCtx := val.ClientCtx 397 398 out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) 399 if tc.expectErr { 400 s.Require().Error(err) 401 } else { 402 s.Require().NoError(err) 403 s.Require().Equal(tc.expectedOutput, strings.TrimSpace(out.String())) 404 } 405 }) 406 } 407 } 408 409 func (s *IntegrationTestSuite) TestGetCmdQueryCommunityPool() { 410 val := s.network.Validators[0] 411 412 _, err := s.network.WaitForHeight(4) 413 s.Require().NoError(err) 414 415 testCases := []struct { 416 name string 417 args []string 418 expectedOutput string 419 }{ 420 { 421 "json output", 422 []string{fmt.Sprintf("--%s=3", flags.FlagHeight), fmt.Sprintf("--%s=json", ostcli.OutputFlag)}, 423 `{"pool":[{"denom":"stake","amount":"4.740000000000000000"}]}`, 424 }, 425 { 426 "text output", 427 []string{fmt.Sprintf("--%s=text", ostcli.OutputFlag), fmt.Sprintf("--%s=3", flags.FlagHeight)}, 428 `pool: 429 - amount: "4.740000000000000000" 430 denom: stake`, 431 }, 432 } 433 434 for _, tc := range testCases { 435 tc := tc 436 437 s.Run(tc.name, func() { 438 cmd := cli.GetCmdQueryCommunityPool() 439 clientCtx := val.ClientCtx 440 441 out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) 442 s.Require().NoError(err) 443 s.Require().Equal(tc.expectedOutput, strings.TrimSpace(out.String())) 444 }) 445 } 446 } 447 448 func (s *IntegrationTestSuite) TestNewWithdrawRewardsCmd() { 449 val := s.network.Validators[0] 450 451 testCases := []struct { 452 name string 453 valAddr fmt.Stringer 454 args []string 455 expectErr bool 456 expectedCode uint32 457 respType proto.Message 458 }{ 459 { 460 "invalid validator address", 461 val.Address, 462 []string{ 463 fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), 464 fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), 465 fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), 466 fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), 467 }, 468 true, 0, nil, 469 }, 470 { 471 "valid transaction", 472 sdk.ValAddress(val.Address), 473 []string{ 474 fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), 475 fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), 476 fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), 477 fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), 478 }, 479 false, 0, &sdk.TxResponse{}, 480 }, 481 { 482 "valid transaction (with commission)", 483 sdk.ValAddress(val.Address), 484 []string{ 485 fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), 486 fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), 487 fmt.Sprintf("--%s=true", cli.FlagCommission), 488 fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), 489 fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), 490 }, 491 false, 0, &sdk.TxResponse{}, 492 }, 493 } 494 495 for _, tc := range testCases { 496 tc := tc 497 498 s.Run(tc.name, func() { 499 clientCtx := val.ClientCtx 500 501 bz, err := MsgWithdrawDelegatorRewardExec(clientCtx, tc.valAddr, tc.args...) 502 if tc.expectErr { 503 s.Require().Error(err) 504 } else { 505 s.Require().NoError(err) 506 s.Require().NoError(clientCtx.Codec.UnmarshalJSON(bz, tc.respType), string(bz)) 507 508 txResp := tc.respType.(*sdk.TxResponse) 509 s.Require().Equal(tc.expectedCode, txResp.Code) 510 } 511 }) 512 } 513 } 514 515 func (s *IntegrationTestSuite) TestNewWithdrawAllRewardsCmd() { 516 val := s.network.Validators[0] 517 518 testCases := []struct { 519 name string 520 args []string 521 expectErr bool 522 expectedCode uint32 523 respType proto.Message 524 }{ 525 { 526 "valid transaction (offline)", 527 []string{ 528 fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), 529 fmt.Sprintf("--%s=true", flags.FlagOffline), 530 fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), 531 fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), 532 }, 533 true, 0, nil, 534 }, 535 { 536 "valid transaction", 537 []string{ 538 fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), 539 fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), 540 fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), 541 fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), 542 }, 543 false, 0, &sdk.TxResponse{}, 544 }, 545 } 546 547 for _, tc := range testCases { 548 tc := tc 549 550 s.Run(tc.name, func() { 551 cmd := cli.NewWithdrawAllRewardsCmd() 552 clientCtx := val.ClientCtx 553 554 out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) 555 if tc.expectErr { 556 s.Require().Error(err) 557 } else { 558 s.Require().NoError(err) 559 s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) 560 561 txResp := tc.respType.(*sdk.TxResponse) 562 s.Require().Equal(tc.expectedCode, txResp.Code) 563 } 564 }) 565 } 566 } 567 568 func (s *IntegrationTestSuite) TestNewSetWithdrawAddrCmd() { 569 val := s.network.Validators[0] 570 571 testCases := []struct { 572 name string 573 args []string 574 expectErr bool 575 expectedCode uint32 576 respType proto.Message 577 }{ 578 { 579 "invalid withdraw address", 580 []string{ 581 "foo", 582 fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), 583 fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), 584 fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), 585 fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), 586 }, 587 true, 0, nil, 588 }, 589 { 590 "valid transaction", 591 []string{ 592 val.Address.String(), 593 fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), 594 fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), 595 fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), 596 fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), 597 }, 598 false, 0, &sdk.TxResponse{}, 599 }, 600 } 601 602 for _, tc := range testCases { 603 tc := tc 604 605 s.Run(tc.name, func() { 606 cmd := cli.NewSetWithdrawAddrCmd() 607 clientCtx := val.ClientCtx 608 609 out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) 610 if tc.expectErr { 611 s.Require().Error(err) 612 } else { 613 s.Require().NoError(err) 614 s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) 615 616 txResp := tc.respType.(*sdk.TxResponse) 617 s.Require().Equal(tc.expectedCode, txResp.Code) 618 } 619 }) 620 } 621 } 622 623 func (s *IntegrationTestSuite) TestNewFundCommunityPoolCmd() { 624 val := s.network.Validators[0] 625 626 testCases := []struct { 627 name string 628 args []string 629 expectErr bool 630 expectedCode uint32 631 respType proto.Message 632 }{ 633 { 634 "invalid funding amount", 635 []string{ 636 "-43foocoin", 637 fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), 638 fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), 639 fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), 640 fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), 641 }, 642 true, 0, nil, 643 }, 644 { 645 "valid transaction", 646 []string{ 647 sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(5431))).String(), 648 fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), 649 fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), 650 fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), 651 fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), 652 }, 653 false, 0, &sdk.TxResponse{}, 654 }, 655 } 656 657 for _, tc := range testCases { 658 tc := tc 659 660 s.Run(tc.name, func() { 661 cmd := cli.NewFundCommunityPoolCmd() 662 clientCtx := val.ClientCtx 663 664 out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) 665 if tc.expectErr { 666 s.Require().Error(err) 667 } else { 668 s.Require().NoError(err) 669 s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) 670 671 txResp := tc.respType.(*sdk.TxResponse) 672 s.Require().Equal(tc.expectedCode, txResp.Code) 673 } 674 }) 675 } 676 } 677 678 func (s *IntegrationTestSuite) TestGetCmdSubmitProposal() { 679 val := s.network.Validators[0] 680 invalidProp := `{ 681 "title": "", 682 "description": "Pay me some Atoms!", 683 "recipient": "foo", 684 "amount": "-343foocoin", 685 "deposit": -324foocoin 686 }` 687 688 invalidPropFile := testutil.WriteToNewTempFile(s.T(), invalidProp) 689 690 validProp := fmt.Sprintf(`{ 691 "title": "Community Pool Spend", 692 "description": "Pay me some Atoms!", 693 "recipient": "%s", 694 "amount": "%s", 695 "deposit": "%s" 696 }`, val.Address.String(), sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(5431)), sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(5431))) 697 698 validPropFile := testutil.WriteToNewTempFile(s.T(), validProp) 699 testCases := []struct { 700 name string 701 args []string 702 expectErr bool 703 expectedCode uint32 704 respType proto.Message 705 }{ 706 { 707 "invalid proposal", 708 []string{ 709 invalidPropFile.Name(), 710 fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), 711 fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), 712 fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), 713 fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), 714 }, 715 true, 0, nil, 716 }, 717 { 718 "valid transaction", 719 []string{ 720 validPropFile.Name(), 721 fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), 722 fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), 723 fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), // sync mode as there are no funds yet 724 fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), 725 }, 726 false, 0, &sdk.TxResponse{}, 727 }, 728 } 729 730 for _, tc := range testCases { 731 tc := tc 732 733 s.Run(tc.name, func() { 734 cmd := cli.GetCmdSubmitProposal() 735 clientCtx := val.ClientCtx 736 flags.AddTxFlagsToCmd(cmd) 737 738 out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) 739 if tc.expectErr { 740 s.Require().Error(err) 741 } else { 742 s.Require().NoError(err) 743 s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) 744 745 txResp := tc.respType.(*sdk.TxResponse) 746 s.Require().Equal(tc.expectedCode, txResp.Code, out.String()) 747 } 748 }) 749 } 750 }