github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/staking/handler_distr_proposal_test.go (about)

     1  package staking
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     8  	"github.com/fibonacci-chain/fbc/libs/tendermint/global"
     9  	tmtypes "github.com/fibonacci-chain/fbc/libs/tendermint/types"
    10  	keep "github.com/fibonacci-chain/fbc/x/staking/keeper"
    11  	"github.com/fibonacci-chain/fbc/x/staking/types"
    12  	"github.com/stretchr/testify/require"
    13  	"github.com/stretchr/testify/suite"
    14  )
    15  
    16  type HandlerSuite struct {
    17  	suite.Suite
    18  }
    19  
    20  func TestHandlerSuite(t *testing.T) {
    21  	suite.Run(t, new(HandlerSuite))
    22  }
    23  
    24  func (suite *HandlerSuite) TestEditValidatorCommission() {
    25  	testCases := []struct {
    26  		title              string
    27  		setMilestoneHeight func()
    28  		newRate            string
    29  		setBlockTime       func(ctx *sdk.Context)
    30  		handlerErrType     int
    31  		err                [5]error
    32  	}{
    33  		{
    34  			"not venus2, default ok",
    35  			func() {
    36  				tmtypes.UnittestOnlySetMilestoneVenus2Height(-1)
    37  			},
    38  			"0.5",
    39  			func(ctx *sdk.Context) {
    40  				ctx.SetBlockTime(time.Now())
    41  				ctx.SetBlockTime(time.Now().UTC().Add(48 * time.Hour))
    42  			},
    43  			0,
    44  			[5]error{nil, nil, nil, nil},
    45  		},
    46  		{
    47  			"not venus2, -0.5",
    48  			func() {
    49  				tmtypes.UnittestOnlySetMilestoneVenus2Height(-1)
    50  			},
    51  			"-0.5",
    52  			func(ctx *sdk.Context) {
    53  				ctx.SetBlockTime(time.Now())
    54  				ctx.SetBlockTime(time.Now().UTC().Add(48 * time.Hour))
    55  			},
    56  			0,
    57  			[5]error{types.ErrInvalidCommissionRate(), types.ErrInvalidCommissionRate(),
    58  				types.ErrCommissionNegative(), types.ErrCommissionNegative()},
    59  		},
    60  		{
    61  			"not venus2, do not set block time",
    62  			func() {
    63  				tmtypes.UnittestOnlySetMilestoneVenus2Height(-1)
    64  			},
    65  			"0.5",
    66  			func(ctx *sdk.Context) {
    67  
    68  			},
    69  			0,
    70  			[5]error{nil, nil, nil, types.ErrCommissionUpdateTime()},
    71  		},
    72  		{
    73  			"venus2, default ok",
    74  			func() {
    75  				global.SetGlobalHeight(11)
    76  				tmtypes.UnittestOnlySetMilestoneVenus2Height(10)
    77  			},
    78  			"0.5",
    79  			func(ctx *sdk.Context) {
    80  				ctx.SetBlockTime(time.Now())
    81  				ctx.SetBlockTime(time.Now().UTC().Add(48 * time.Hour))
    82  			},
    83  			1,
    84  			[5]error{nil, nil, nil, nil},
    85  		},
    86  		{
    87  			"venus2, not support",
    88  			func() {
    89  				global.SetGlobalHeight(10)
    90  				tmtypes.UnittestOnlySetMilestoneVenus2Height(11)
    91  			},
    92  			"0.5",
    93  			func(ctx *sdk.Context) {
    94  				ctx.SetBlockTime(time.Now())
    95  				ctx.SetBlockTime(time.Now().UTC().Add(48 * time.Hour))
    96  			},
    97  			1,
    98  			[5]error{types.ErrCodeNotSupportEditValidatorCommissionRate(), types.ErrCodeNotSupportEditValidatorCommissionRate(), nil, nil},
    99  		},
   100  		{
   101  			"venus2, -0.5",
   102  			func() {
   103  				tmtypes.UnittestOnlySetMilestoneVenus2Height(0)
   104  			},
   105  			"-0.5",
   106  			func(ctx *sdk.Context) {
   107  				ctx.SetBlockTime(time.Now())
   108  				ctx.SetBlockTime(time.Now().UTC().Add(48 * time.Hour))
   109  			},
   110  			1,
   111  			[5]error{types.ErrInvalidCommissionRate(), types.ErrInvalidCommissionRate(),
   112  				types.ErrCommissionNegative(), types.ErrCommissionNegative()},
   113  		},
   114  		{
   115  			"venus2, do not set block time",
   116  			func() {
   117  				global.SetGlobalHeight(11)
   118  				tmtypes.UnittestOnlySetMilestoneVenus2Height(10)
   119  			},
   120  			"0.5",
   121  			func(ctx *sdk.Context) {
   122  
   123  			},
   124  			1,
   125  			[5]error{nil, nil, nil, types.ErrCommissionUpdateTime()},
   126  		},
   127  		{
   128  			"venus2, not support",
   129  			func() {
   130  				global.SetGlobalHeight(10)
   131  				tmtypes.UnittestOnlySetMilestoneVenus2Height(11)
   132  			},
   133  			"0.5",
   134  			func(ctx *sdk.Context) {
   135  
   136  			},
   137  			1,
   138  			[5]error{types.ErrCodeNotSupportEditValidatorCommissionRate(), types.ErrCodeNotSupportEditValidatorCommissionRate(), nil, types.ErrCommissionUpdateTime()},
   139  		},
   140  	}
   141  
   142  	for _, tc := range testCases {
   143  		global.SetGlobalHeight(0)
   144  		tmtypes.UnittestOnlySetMilestoneVenus2Height(0)
   145  		suite.Run(tc.title, func() {
   146  			ctx, _, mKeeper := CreateTestInput(suite.T(), false, SufficientInitPower)
   147  			tc.setMilestoneHeight()
   148  			keeper := mKeeper.Keeper
   149  			_ = setInstantUnbondPeriod(keeper, ctx)
   150  			handler := NewHandler(keeper)
   151  
   152  			newRate, _ := sdk.NewDecFromStr(tc.newRate)
   153  			msgEditValidator := NewMsgEditValidatorCommissionRate(sdk.ValAddress(keep.Addrs[0]), newRate)
   154  			err := msgEditValidator.ValidateBasic()
   155  			require.Equal(suite.T(), tc.err[0], err)
   156  
   157  			// validator not exist
   158  			got, err := handler(ctx, msgEditValidator)
   159  			if tc.handlerErrType == 0 {
   160  				require.Equal(suite.T(), ErrNoValidatorFound(msgEditValidator.ValidatorAddress.String()), err)
   161  			} else {
   162  				require.NotNil(suite.T(), err)
   163  			}
   164  
   165  			//create validator
   166  			validatorAddr := sdk.ValAddress(keep.Addrs[0])
   167  			msgCreateValidator := NewTestMsgCreateValidator(validatorAddr, keep.PKs[0], DefaultMSD)
   168  			got, err = handler(ctx, msgCreateValidator)
   169  			require.Nil(suite.T(), err, "expected create-validator to be ok, got %v", got)
   170  
   171  			// must end-block
   172  			updates := keeper.ApplyAndReturnValidatorSetUpdates(ctx)
   173  			require.Equal(suite.T(), 1, len(updates))
   174  			SimpleCheckValidator(suite.T(), ctx, keeper, validatorAddr, DefaultMSD, sdk.Bonded,
   175  				SharesFromDefaultMSD, false)
   176  
   177  			// normal rate
   178  			newRate, _ = sdk.NewDecFromStr(tc.newRate)
   179  			msgEditValidator = NewMsgEditValidatorCommissionRate(validatorAddr, newRate)
   180  			err = msgEditValidator.ValidateBasic()
   181  			require.Equal(suite.T(), tc.err[1], err)
   182  			got, err = handler(ctx, msgEditValidator)
   183  			if tc.handlerErrType == 0 {
   184  				require.Equal(suite.T(), tc.err[2], err)
   185  			} else {
   186  				require.NotNil(suite.T(), err)
   187  			}
   188  
   189  			tc.setBlockTime(&ctx)
   190  			msgEditValidator = NewMsgEditValidatorCommissionRate(validatorAddr, newRate)
   191  			got, err = handler(ctx, msgEditValidator)
   192  			if tc.handlerErrType == 0 {
   193  				require.Equal(suite.T(), tc.err[3], err)
   194  			} else {
   195  				require.NotNil(suite.T(), err)
   196  			}
   197  		})
   198  	}
   199  }