github.com/Finschia/finschia-sdk@v0.48.1/x/crisis/handler_test.go (about) 1 package crisis_test 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/stretchr/testify/require" 8 tmproto "github.com/tendermint/tendermint/proto/tendermint/types" 9 10 "github.com/Finschia/finschia-sdk/simapp" 11 "github.com/Finschia/finschia-sdk/testutil/testdata" 12 sdk "github.com/Finschia/finschia-sdk/types" 13 "github.com/Finschia/finschia-sdk/x/crisis" 14 "github.com/Finschia/finschia-sdk/x/crisis/types" 15 distrtypes "github.com/Finschia/finschia-sdk/x/distribution/types" 16 stakingtypes "github.com/Finschia/finschia-sdk/x/staking/types" 17 ) 18 19 var ( 20 testModuleName = "dummy" 21 dummyRouteWhichPasses = types.NewInvarRoute(testModuleName, "which-passes", func(_ sdk.Context) (string, bool) { return "", false }) 22 dummyRouteWhichFails = types.NewInvarRoute(testModuleName, "which-fails", func(_ sdk.Context) (string, bool) { return "whoops", true }) 23 ) 24 25 func createTestApp() (*simapp.SimApp, sdk.Context, []sdk.AccAddress) { 26 app := simapp.Setup(false) 27 ctx := app.NewContext(false, tmproto.Header{}) 28 29 constantFee := sdk.NewInt64Coin(sdk.DefaultBondDenom, 10) 30 app.CrisisKeeper.SetConstantFee(ctx, constantFee) 31 app.StakingKeeper.SetParams(ctx, stakingtypes.DefaultParams()) 32 33 app.CrisisKeeper.RegisterRoute(testModuleName, dummyRouteWhichPasses.Route, dummyRouteWhichPasses.Invar) 34 app.CrisisKeeper.RegisterRoute(testModuleName, dummyRouteWhichFails.Route, dummyRouteWhichFails.Invar) 35 36 feePool := distrtypes.InitialFeePool() 37 feePool.CommunityPool = sdk.NewDecCoinsFromCoins(sdk.NewCoins(constantFee)...) 38 app.DistrKeeper.SetFeePool(ctx, feePool) 39 40 addrs := simapp.AddTestAddrs(app, ctx, 1, sdk.NewInt(10000)) 41 42 return app, ctx, addrs 43 } 44 45 func TestHandleMsgVerifyInvariant(t *testing.T) { 46 app, ctx, addrs := createTestApp() 47 sender := addrs[0] 48 49 cases := []struct { 50 name string 51 msg sdk.Msg 52 expectedResult string 53 }{ 54 {"bad invariant route", types.NewMsgVerifyInvariant(sender, testModuleName, "route-that-doesnt-exist"), "fail"}, 55 {"invariant broken", types.NewMsgVerifyInvariant(sender, testModuleName, dummyRouteWhichFails.Route), "panic"}, 56 {"invariant passing", types.NewMsgVerifyInvariant(sender, testModuleName, dummyRouteWhichPasses.Route), "pass"}, 57 {"invalid msg", testdata.NewTestMsg(), "fail"}, 58 } 59 60 for _, tc := range cases { 61 tc := tc 62 t.Run(tc.name, func(t *testing.T) { 63 h := crisis.NewHandler(app.CrisisKeeper) 64 65 switch tc.expectedResult { 66 case "fail": 67 res, err := h(ctx, tc.msg) 68 require.Error(t, err) 69 require.Nil(t, res) 70 71 case "pass": 72 res, err := h(ctx, tc.msg) 73 require.NoError(t, err) 74 require.NotNil(t, res) 75 76 case "panic": 77 require.Panics(t, func() { 78 h(ctx, tc.msg) // nolint:errcheck 79 }) 80 } 81 }) 82 } 83 } 84 85 func TestHandleMsgVerifyInvariantWithNotEnoughSenderCoins(t *testing.T) { 86 app, ctx, addrs := createTestApp() 87 sender := addrs[0] 88 coin := app.BankKeeper.GetAllBalances(ctx, sender)[0] 89 excessCoins := sdk.NewCoin(coin.Denom, coin.Amount.AddRaw(1)) 90 app.CrisisKeeper.SetConstantFee(ctx, excessCoins) 91 92 h := crisis.NewHandler(app.CrisisKeeper) 93 msg := types.NewMsgVerifyInvariant(sender, testModuleName, dummyRouteWhichPasses.Route) 94 95 res, err := h(ctx, msg) 96 require.Error(t, err) 97 require.Nil(t, res) 98 } 99 100 func TestHandleMsgVerifyInvariantWithInvariantBrokenAndNotEnoughPoolCoins(t *testing.T) { 101 app, ctx, addrs := createTestApp() 102 sender := addrs[0] 103 104 // set the community pool to empty 105 feePool := app.DistrKeeper.GetFeePool(ctx) 106 feePool.CommunityPool = sdk.DecCoins{} 107 app.DistrKeeper.SetFeePool(ctx, feePool) 108 109 h := crisis.NewHandler(app.CrisisKeeper) 110 msg := types.NewMsgVerifyInvariant(sender, testModuleName, dummyRouteWhichFails.Route) 111 112 var res *sdk.Result 113 require.Panics(t, func() { 114 res, _ = h(ctx, msg) 115 }, fmt.Sprintf("%v", res)) 116 }