github.com/Finschia/finschia-sdk@v0.49.1/x/staking/teststaking/helper.go (about)

     1  package teststaking
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	"github.com/stretchr/testify/require"
     8  
     9  	cryptotypes "github.com/Finschia/finschia-sdk/crypto/types"
    10  	sdk "github.com/Finschia/finschia-sdk/types"
    11  	"github.com/Finschia/finschia-sdk/x/staking"
    12  	"github.com/Finschia/finschia-sdk/x/staking/keeper"
    13  	stakingtypes "github.com/Finschia/finschia-sdk/x/staking/types"
    14  )
    15  
    16  // Helper is a structure which wraps the staking handler
    17  // and provides methods useful in tests
    18  type Helper struct {
    19  	t *testing.T
    20  	h sdk.Handler
    21  	k keeper.Keeper
    22  
    23  	Ctx        sdk.Context
    24  	Commission stakingtypes.CommissionRates
    25  	// Coin Denomination
    26  	Denom string
    27  }
    28  
    29  // NewHelper creates staking Handler wrapper for tests
    30  func NewHelper(t *testing.T, ctx sdk.Context, k keeper.Keeper) *Helper {
    31  	t.Helper()
    32  	return &Helper{t, staking.NewHandler(k), k, ctx, ZeroCommission(), sdk.DefaultBondDenom}
    33  }
    34  
    35  // CreateValidator calls handler to create a new staking validator
    36  func (sh *Helper) CreateValidator(addr sdk.ValAddress, pk cryptotypes.PubKey, stakeAmount sdk.Int, ok bool) {
    37  	coin := sdk.NewCoin(sh.Denom, stakeAmount)
    38  	sh.createValidator(addr, pk, coin, ok)
    39  }
    40  
    41  // CreateValidatorWithValPower calls handler to create a new staking validator with zero
    42  // commission
    43  func (sh *Helper) CreateValidatorWithValPower(addr sdk.ValAddress, pk cryptotypes.PubKey, valPower int64, ok bool) sdk.Int {
    44  	amount := sh.k.TokensFromConsensusPower(sh.Ctx, valPower)
    45  	coin := sdk.NewCoin(sh.Denom, amount)
    46  	sh.createValidator(addr, pk, coin, ok)
    47  	return amount
    48  }
    49  
    50  // CreateValidatorMsg returns a message used to create validator in this service.
    51  func (sh *Helper) CreateValidatorMsg(addr sdk.ValAddress, pk cryptotypes.PubKey, stakeAmount sdk.Int) *stakingtypes.MsgCreateValidator {
    52  	coin := sdk.NewCoin(sh.Denom, stakeAmount)
    53  	msg, err := stakingtypes.NewMsgCreateValidator(addr, pk, coin, stakingtypes.Description{}, sh.Commission, sdk.OneInt())
    54  	require.NoError(sh.t, err)
    55  	return msg
    56  }
    57  
    58  func (sh *Helper) createValidator(addr sdk.ValAddress, pk cryptotypes.PubKey, coin sdk.Coin, ok bool) {
    59  	msg, err := stakingtypes.NewMsgCreateValidator(addr, pk, coin, stakingtypes.Description{}, sh.Commission, sdk.OneInt())
    60  	require.NoError(sh.t, err)
    61  	sh.Handle(msg, ok)
    62  }
    63  
    64  // Delegate calls handler to delegate stake for a validator
    65  func (sh *Helper) Delegate(delegator sdk.AccAddress, val sdk.ValAddress, amount sdk.Int) {
    66  	coin := sdk.NewCoin(sh.Denom, amount)
    67  	msg := stakingtypes.NewMsgDelegate(delegator, val, coin)
    68  	sh.Handle(msg, true)
    69  }
    70  
    71  // DelegateWithPower calls handler to delegate stake for a validator
    72  func (sh *Helper) DelegateWithPower(delegator sdk.AccAddress, val sdk.ValAddress, power int64) {
    73  	coin := sdk.NewCoin(sh.Denom, sh.k.TokensFromConsensusPower(sh.Ctx, power))
    74  	msg := stakingtypes.NewMsgDelegate(delegator, val, coin)
    75  	sh.Handle(msg, true)
    76  }
    77  
    78  // Undelegate calls handler to unbound some stake from a validator.
    79  func (sh *Helper) Undelegate(delegator sdk.AccAddress, val sdk.ValAddress, amount sdk.Int, ok bool) *sdk.Result {
    80  	unbondAmt := sdk.NewCoin(sh.Denom, amount)
    81  	msg := stakingtypes.NewMsgUndelegate(delegator, val, unbondAmt)
    82  	return sh.Handle(msg, ok)
    83  }
    84  
    85  // Handle calls staking handler on a given message
    86  func (sh *Helper) Handle(msg sdk.Msg, ok bool) *sdk.Result {
    87  	res, err := sh.h(sh.Ctx, msg)
    88  	if ok {
    89  		require.NoError(sh.t, err)
    90  		require.NotNil(sh.t, res)
    91  	} else {
    92  		require.Error(sh.t, err)
    93  		require.Nil(sh.t, res)
    94  	}
    95  	return res
    96  }
    97  
    98  // CheckValidator asserts that a validor exists and has a given status (if status!="")
    99  // and if has a right jailed flag.
   100  func (sh *Helper) CheckValidator(addr sdk.ValAddress, status stakingtypes.BondStatus, jailed bool) stakingtypes.Validator {
   101  	v, ok := sh.k.GetValidator(sh.Ctx, addr)
   102  	require.True(sh.t, ok)
   103  	require.Equal(sh.t, jailed, v.Jailed, "wrong Jalied status")
   104  	if status >= 0 {
   105  		require.Equal(sh.t, status, v.Status)
   106  	}
   107  	return v
   108  }
   109  
   110  // CheckDelegator asserts that a delegator exists
   111  func (sh *Helper) CheckDelegator(delegator sdk.AccAddress, val sdk.ValAddress, found bool) {
   112  	_, ok := sh.k.GetDelegation(sh.Ctx, delegator, val)
   113  	require.Equal(sh.t, ok, found)
   114  }
   115  
   116  // TurnBlock calls EndBlocker and updates the block time
   117  func (sh *Helper) TurnBlock(newTime time.Time) sdk.Context {
   118  	sh.Ctx = sh.Ctx.WithBlockTime(newTime)
   119  	staking.EndBlocker(sh.Ctx, sh.k)
   120  	return sh.Ctx
   121  }
   122  
   123  // TurnBlockTimeDiff calls EndBlocker and updates the block time by adding the
   124  // duration to the current block time
   125  func (sh *Helper) TurnBlockTimeDiff(diff time.Duration) sdk.Context {
   126  	sh.Ctx = sh.Ctx.WithBlockTime(sh.Ctx.BlockHeader().Time.Add(diff))
   127  	staking.EndBlocker(sh.Ctx, sh.k)
   128  	return sh.Ctx
   129  }
   130  
   131  // ZeroCommission constructs a commission rates with all zeros.
   132  func ZeroCommission() stakingtypes.CommissionRates {
   133  	return stakingtypes.NewCommissionRates(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec())
   134  }