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

     1  package types
     2  
     3  import (
     4  	"testing"
     5  
     6  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     7  	"github.com/fibonacci-chain/fbc/libs/tendermint/crypto"
     8  	"github.com/stretchr/testify/require"
     9  )
    10  
    11  var (
    12  	coinPos  = sdk.NewInt64Coin(sdk.DefaultBondDenom, 1000)
    13  	coinZero = sdk.NewInt64Coin(sdk.DefaultBondDenom, 0)
    14  )
    15  
    16  // test ValidateBasic for MsgCreateValidator
    17  func TestMsgCreateValidator(t *testing.T) {
    18  	addr1 := valAddr1
    19  	tests := []struct {
    20  		name, moniker, identity, website, details string
    21  		minSelfDelegation                         sdk.Int
    22  		validatorAddr                             sdk.ValAddress
    23  		delegatorAddr                             sdk.AccAddress
    24  		pubkey                                    crypto.PubKey
    25  		bond                                      sdk.Coin
    26  		expectPass                                bool
    27  	}{
    28  		{"empty bond", "a", "b", "c", "d", sdk.OneInt(), addr1, dlgAddr1, pk1, coinZero, true},
    29  		{"zero min self delegation", "a", "b", "c", "d", sdk.ZeroInt(), addr1, dlgAddr1, pk1, coinPos, false},
    30  		{"basic good", "a", "b", "c", "d", sdk.OneInt(), addr1, dlgAddr1, pk1, coinPos, true},
    31  		{"partial description", "", "", "c", "", sdk.OneInt(), addr1, dlgAddr1, pk1, coinPos, true},
    32  		{"empty description", "", "", "", "", sdk.OneInt(), addr1, dlgAddr1, pk1, coinPos, false},
    33  		{"empty address1", "a", "b", "c", "d", sdk.OneInt(), emptyAddr, dlgAddr1, pk1, coinPos, false},
    34  		{"empty address2", "a", "b", "c", "d", sdk.OneInt(), nil, nil, pk1, coinPos, false},
    35  		{"valAddr dlgAddr not equals", "a", "b", "c", "d", sdk.OneInt(), addr1, dlgAddr2, pk1, coinPos, false},
    36  		{"empty pubkey", "a", "b", "c", "d", sdk.OneInt(), addr1, dlgAddr1, emptyPubkey, coinPos, true},
    37  		//{"negative min self delegation", "a", "b", "c", "d", commission1, sdk.NewInt(-1), addr1, pk1, coinPos, false},
    38  		//{"delegation less than min self delegation", "a", "b", "c", "d", commission1, coinPos.Amount.Add(sdk.OneInt()), addr1, pk1, coinPos, false},
    39  	}
    40  
    41  	for _, tc := range tests {
    42  		description := NewDescription(tc.moniker, tc.identity, tc.website, tc.details)
    43  		coin := sdk.NewDecCoin(sdk.DefaultBondDenom, tc.minSelfDelegation)
    44  
    45  		msg := MsgCreateValidator{
    46  			Description:       description,
    47  			DelegatorAddress:  tc.delegatorAddr,
    48  			ValidatorAddress:  tc.validatorAddr,
    49  			PubKey:            tc.pubkey,
    50  			MinSelfDelegation: coin,
    51  		}
    52  
    53  		if tc.expectPass {
    54  			require.Nil(t, msg.ValidateBasic(), "test: %v", tc.name)
    55  		} else {
    56  			require.NotNil(t, msg.ValidateBasic(), "test: %v", tc.name)
    57  		}
    58  	}
    59  }
    60  
    61  // test ValidateBasic for MsgDestroyValidator
    62  func TestMsgDestroyValidator(t *testing.T) {
    63  
    64  	tests := []struct {
    65  		name       string
    66  		valAddr    sdk.AccAddress
    67  		expectPass bool
    68  	}{
    69  		{"basic good", dlgAddr1, true},
    70  		{"empty validator", sdk.AccAddress(emptyAddr), false},
    71  	}
    72  
    73  	for _, tc := range tests {
    74  		msg := NewMsgDestroyValidator(tc.valAddr)
    75  		if tc.expectPass {
    76  			require.Nil(t, msg.ValidateBasic(), "test: %v", tc.name)
    77  			checkMsg(t, msg, "destroy_validator")
    78  		} else {
    79  			require.NotNil(t, msg.ValidateBasic(), "test: %v", tc.name)
    80  		}
    81  	}
    82  }
    83  
    84  func TestMsgCreateValidator_Smoke(t *testing.T) {
    85  
    86  	msd := sdk.NewDecCoinFromDec(sdk.DefaultBondDenom, sdk.NewDec(2000))
    87  
    88  	msg := NewMsgCreateValidator(valAddr1, pk1,
    89  		NewDescription("my moniker", "my identity", "my website", "my details"), msd,
    90  	)
    91  	require.Contains(t, msg.Route(), RouterKey)
    92  	require.Contains(t, msg.Type(), "create_validator")
    93  	require.True(t, len(msg.GetSigners()) == 1, msg)
    94  	require.True(t, len(msg.GetSignBytes()) > 0, msg)
    95  
    96  	bz, err := msg.MarshalJSON()
    97  	require.Nil(t, err)
    98  	newMsg := MsgCreateValidator{}
    99  	err2 := newMsg.UnmarshalJSON(bz)
   100  	require.Nil(t, err2)
   101  	require.Equal(t, msg, newMsg)
   102  
   103  	err3 := newMsg.UnmarshalJSON(nil)
   104  	require.NotNil(t, err3)
   105  }
   106  
   107  // test ValidateBasic for MsgEditValidator
   108  func TestMsgEditValidator(t *testing.T) {
   109  	tests := []struct {
   110  		name, moniker, identity, website, details string
   111  		validatorAddr                             sdk.ValAddress
   112  		expectPass                                bool
   113  	}{
   114  		{"basic good", "a", "b", "c", "d", valAddr1, true},
   115  		{"partial description", "", "", "c", "", valAddr1, true},
   116  		{"empty description", "", "", "", "", valAddr1, false},
   117  		{"empty address", "a", "b", "c", "d", emptyAddr, false},
   118  	}
   119  
   120  	for _, tc := range tests {
   121  		description := NewDescription(tc.moniker, tc.identity, tc.website, tc.details)
   122  		msg := NewMsgEditValidator(tc.validatorAddr, description)
   123  		if tc.expectPass {
   124  			require.Nil(t, msg.ValidateBasic(), "test: %v", tc.name)
   125  			checkMsg(t, msg, "edit_validator")
   126  		} else {
   127  			require.NotNil(t, msg.ValidateBasic(), "test: %v", tc.name)
   128  		}
   129  	}
   130  }
   131  
   132  func checkMsg(t *testing.T, msg sdk.Msg, expType string) {
   133  	require.Contains(t, msg.Route(), RouterKey)
   134  	require.Contains(t, msg.Type(), expType)
   135  	require.True(t, len(msg.GetSigners()) == 1, msg)
   136  	require.True(t, len(msg.GetSignBytes()) > 0, msg)
   137  }
   138  
   139  // test ValidateBasic for MsgDeposit
   140  func TestMsgDeposit(t *testing.T) {
   141  
   142  	coinPos := sdk.NewDecCoinFromDec(sdk.DefaultBondDenom, sdk.NewDec(1000))
   143  	coinZero := sdk.NewDecCoinFromDec(sdk.DefaultBondDenom, sdk.ZeroDec())
   144  
   145  	tests := []struct {
   146  		name          string
   147  		delegatorAddr sdk.AccAddress
   148  		amount        sdk.SysCoin
   149  		expectPass    bool
   150  	}{
   151  		{"basic good", dlgAddr1, coinPos, true},
   152  		{"empty delegator", sdk.AccAddress(emptyAddr), coinPos, false},
   153  		{"empty bond", sdk.AccAddress(addr1), coinZero, false},
   154  	}
   155  
   156  	for _, tc := range tests {
   157  		msg := NewMsgDeposit(tc.delegatorAddr, tc.amount)
   158  		if tc.expectPass {
   159  			require.Nil(t, msg.ValidateBasic(), "test: %v", tc.name)
   160  			checkMsg(t, msg, "deposit")
   161  		} else {
   162  			require.NotNil(t, msg.ValidateBasic(), "test: %v", tc.name)
   163  		}
   164  	}
   165  }
   166  
   167  // test ValidateBasic for MsgWithdraw
   168  func TestMsgWithdraw(t *testing.T) {
   169  
   170  	coinPos := sdk.NewDecCoinFromDec(sdk.DefaultBondDenom, sdk.NewDec(1000))
   171  	coinNeg := sdk.SysCoin{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDec(-1)}
   172  
   173  	tests := []struct {
   174  		name          string
   175  		delegatorAddr sdk.AccAddress
   176  		amount        sdk.SysCoin
   177  		expectPass    bool
   178  	}{
   179  		{"basic good", dlgAddr1, coinPos, true},
   180  		{"empty delegator", sdk.AccAddress(emptyAddr), coinPos, false},
   181  		{"negative bond", sdk.AccAddress(addr1), coinNeg, false},
   182  	}
   183  
   184  	for _, tc := range tests {
   185  		msg := NewMsgWithdraw(tc.delegatorAddr, tc.amount)
   186  		if tc.expectPass {
   187  			require.Nil(t, msg.ValidateBasic(), "test: %v", tc.name)
   188  			checkMsg(t, msg, "withdraw")
   189  		} else {
   190  			require.NotNil(t, msg.ValidateBasic(), "test: %v", tc.name)
   191  		}
   192  	}
   193  }
   194  
   195  // test ValidateBasic for MsgDestroyValidator
   196  func TestMsgBindProxy(t *testing.T) {
   197  
   198  	tests := []struct {
   199  		name       string
   200  		dlgAddr    sdk.AccAddress
   201  		valAddr    sdk.AccAddress
   202  		expectPass bool
   203  	}{
   204  		{"basic good", dlgAddr1, dlgAddr2, true},
   205  		{"empty delegator", emptyAddr.Bytes(), dlgAddr2, false},
   206  		{"bind to self", dlgAddr1, dlgAddr1, false},
   207  	}
   208  
   209  	for _, tc := range tests {
   210  		msg := NewMsgBindProxy(tc.dlgAddr, tc.valAddr)
   211  		if tc.expectPass {
   212  			require.Nil(t, msg.ValidateBasic(), "test: %v", tc.name)
   213  			checkMsg(t, msg, "bind_proxy")
   214  		} else {
   215  			require.NotNil(t, msg.ValidateBasic(), "test: %v", tc.name)
   216  		}
   217  	}
   218  }
   219  
   220  // test TestMsgUnbindProxy for MsgDestroyValidator
   221  func TestMsgUnbindProxy(t *testing.T) {
   222  
   223  	tests := []struct {
   224  		name       string
   225  		valAddr    sdk.AccAddress
   226  		expectPass bool
   227  	}{
   228  		{"basic good", dlgAddr1, true},
   229  		{"empty validator", sdk.AccAddress(emptyAddr), false},
   230  	}
   231  
   232  	for _, tc := range tests {
   233  		msg := NewMsgUnbindProxy(tc.valAddr)
   234  		if tc.expectPass {
   235  			require.Nil(t, msg.ValidateBasic(), "test: %v", tc.name)
   236  			checkMsg(t, msg, "unbind_proxy")
   237  		} else {
   238  			require.NotNil(t, msg.ValidateBasic(), "test: %v", tc.name)
   239  		}
   240  	}
   241  }
   242  
   243  func TestMsgRegProxy(t *testing.T) {
   244  
   245  	tests := []struct {
   246  		name       string
   247  		dlgAddr    sdk.AccAddress
   248  		doReg      bool
   249  		expectPass bool
   250  	}{
   251  		{"success register", dlgAddr1, true, true},
   252  		{"success unregister", dlgAddr1, false, true},
   253  		{"empty delegator", sdk.AccAddress(emptyAddr), true, false},
   254  	}
   255  
   256  	for _, tc := range tests {
   257  		msg := NewMsgRegProxy(tc.dlgAddr, tc.doReg)
   258  		if tc.expectPass {
   259  			require.Nil(t, msg.ValidateBasic(), "test: %v", tc.name)
   260  			checkMsg(t, msg, "reg_or_unreg_proxy")
   261  		} else {
   262  			require.NotNil(t, msg.ValidateBasic(), "test: %v", tc.name)
   263  		}
   264  	}
   265  
   266  }
   267  
   268  func TestMsgAddShares(t *testing.T) {
   269  
   270  	tests := []struct {
   271  		name       string
   272  		dlgAddr    sdk.AccAddress
   273  		valAddrs   []sdk.ValAddress
   274  		expectPass bool
   275  	}{
   276  		{"basic good", dlgAddr1, []sdk.ValAddress{valAddr1}, true},
   277  		{"basic good2", dlgAddr1, []sdk.ValAddress{valAddr1, valAddr2}, true},
   278  		{"duplicate", dlgAddr1, []sdk.ValAddress{valAddr1, valAddr2, valAddr1}, false},
   279  		{"empty validator", dlgAddr1, nil, false},
   280  		{"empty delegator", nil, []sdk.ValAddress{valAddr1}, false},
   281  	}
   282  
   283  	for _, tc := range tests {
   284  		msg := NewMsgAddShares(tc.dlgAddr, tc.valAddrs)
   285  		if tc.expectPass {
   286  			require.Nil(t, msg.ValidateBasic(), "test: %v", tc.name)
   287  			checkMsg(t, msg, "add_shares_to_validators")
   288  		} else {
   289  			require.NotNil(t, msg.ValidateBasic(), "test: %v", tc.name)
   290  		}
   291  	}
   292  
   293  }
   294  
   295  //// test ValidateBasic for MsgUnbond
   296  //func TestMsgBeginRedelegate(t *testing.T) {
   297  //	tests := []struct {
   298  //		name             string
   299  //		delegatorAddr    sdk.AccAddress
   300  //		validatorSrcAddr sdk.ValAddress
   301  //		validatorDstAddr sdk.ValAddress
   302  //		amount           sdk.Coin
   303  //		expectPass       bool
   304  //	}{
   305  //		{"regular", sdk.AccAddress(addr1), addr2, addr3, sdk.NewInt64Coin(sdk.DefaultBondDenom, 1), true},
   306  //		{"zero amount", sdk.AccAddress(addr1), addr2, addr3, sdk.NewInt64Coin(sdk.DefaultBondDenom, 0), false},
   307  //		{"empty delegator", sdk.AccAddress(emptyAddr), addr1, addr3, sdk.NewInt64Coin(sdk.DefaultBondDenom, 1), false},
   308  //		{"empty source validator", sdk.AccAddress(addr1), emptyAddr, addr3, sdk.NewInt64Coin(sdk.DefaultBondDenom, 1), false},
   309  //		{"empty destination validator", sdk.AccAddress(addr1), addr2, emptyAddr, sdk.NewInt64Coin(sdk.DefaultBondDenom, 1), false},
   310  //	}
   311  //
   312  //	for _, tc := range tests {
   313  //		msg := NewMsgBeginRedelegate(tc.delegatorAddr, tc.validatorSrcAddr, tc.validatorDstAddr, tc.amount)
   314  //		if tc.expectPass {
   315  //			require.Nil(t, msg.ValidateBasic(), "test: %v", tc.name)
   316  //		} else {
   317  //			require.NotNil(t, msg.ValidateBasic(), "test: %v", tc.name)
   318  //		}
   319  //	}
   320  //}
   321  //
   322  //// test ValidateBasic for MsgUnbond
   323  //func TestMsgUndelegate(t *testing.T) {
   324  //	tests := []struct {
   325  //		name          string
   326  //		delegatorAddr sdk.AccAddress
   327  //		validatorAddr sdk.ValAddress
   328  //		amount        sdk.Coin
   329  //		expectPass    bool
   330  //	}{
   331  //		{"regular", sdk.AccAddress(addr1), addr2, sdk.NewInt64Coin(sdk.DefaultBondDenom, 1), true},
   332  //		{"zero amount", sdk.AccAddress(addr1), addr2, sdk.NewInt64Coin(sdk.DefaultBondDenom, 0), false},
   333  //		{"empty delegator", sdk.AccAddress(emptyAddr), addr1, sdk.NewInt64Coin(sdk.DefaultBondDenom, 1), false},
   334  //		{"empty validator", sdk.AccAddress(addr1), emptyAddr, sdk.NewInt64Coin(sdk.DefaultBondDenom, 1), false},
   335  //	}
   336  //
   337  //	for _, tc := range tests {
   338  //		msg := NewMsgUndelegate(tc.delegatorAddr, tc.validatorAddr, tc.amount)
   339  //		if tc.expectPass {
   340  //			require.Nil(t, msg.ValidateBasic(), "test: %v", tc.name)
   341  //		} else {
   342  //			require.NotNil(t, msg.ValidateBasic(), "test: %v", tc.name)
   343  //		}
   344  //	}
   345  //}