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  }