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  }