github.com/Finschia/finschia-sdk@v0.49.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 t.Run(tc.name, func(t *testing.T) { 62 h := crisis.NewHandler(app.CrisisKeeper) 63 64 switch tc.expectedResult { 65 case "fail": 66 res, err := h(ctx, tc.msg) 67 require.Error(t, err) 68 require.Nil(t, res) 69 70 case "pass": 71 res, err := h(ctx, tc.msg) 72 require.NoError(t, err) 73 require.NotNil(t, res) 74 75 case "panic": 76 require.Panics(t, func() { 77 h(ctx, tc.msg) // nolint:errcheck 78 }) 79 } 80 }) 81 } 82 } 83 84 func TestHandleMsgVerifyInvariantWithNotEnoughSenderCoins(t *testing.T) { 85 app, ctx, addrs := createTestApp() 86 sender := addrs[0] 87 coin := app.BankKeeper.GetAllBalances(ctx, sender)[0] 88 excessCoins := sdk.NewCoin(coin.Denom, coin.Amount.AddRaw(1)) 89 app.CrisisKeeper.SetConstantFee(ctx, excessCoins) 90 91 h := crisis.NewHandler(app.CrisisKeeper) 92 msg := types.NewMsgVerifyInvariant(sender, testModuleName, dummyRouteWhichPasses.Route) 93 94 res, err := h(ctx, msg) 95 require.Error(t, err) 96 require.Nil(t, res) 97 } 98 99 func TestHandleMsgVerifyInvariantWithInvariantBrokenAndNotEnoughPoolCoins(t *testing.T) { 100 app, ctx, addrs := createTestApp() 101 sender := addrs[0] 102 103 // set the community pool to empty 104 feePool := app.DistrKeeper.GetFeePool(ctx) 105 feePool.CommunityPool = sdk.DecCoins{} 106 app.DistrKeeper.SetFeePool(ctx, feePool) 107 108 h := crisis.NewHandler(app.CrisisKeeper) 109 msg := types.NewMsgVerifyInvariant(sender, testModuleName, dummyRouteWhichFails.Route) 110 111 var res *sdk.Result 112 require.Panics(t, func() { 113 res, _ = h(ctx, msg) 114 }, fmt.Sprintf("%v", res)) 115 }