github.com/lino-network/lino@v0.6.11/x/vote/handler_test.go (about)

     1  package vote
     2  
     3  // import (
     4  // 	"testing"
     5  
     6  // 	"github.com/lino-network/lino/types"
     7  // 	globalModel "github.com/lino-network/lino/x/global/model"
     8  // 	"github.com/lino-network/lino/x/vote/model"
     9  // 	"github.com/stretchr/testify/assert"
    10  
    11  // 	sdk "github.com/cosmos/cosmos-sdk/types"
    12  // )
    13  
    14  // func TestVoterDepositBasic(t *testing.T) {
    15  // 	ctx, am, vm, gm := setupTest(t, 0)
    16  // 	handler := NewHandler(vm, am, &gm)
    17  
    18  // 	voteParam, _ := vm.paramHolder.GetVoteParam(ctx)
    19  // 	minBalance := types.NewCoinFromInt64(1 * types.Decimals)
    20  // 	user1 := createTestAccount(ctx, am, "user1", minBalance.Plus(voteParam.MinStakeIn))
    21  
    22  // 	// let user1 register as voter
    23  // 	msg := NewStakeInMsg("user1", coinToString(voteParam.MinStakeIn))
    24  // 	result := handler(ctx, msg)
    25  // 	assert.Equal(t, sdk.Result{}, result)
    26  
    27  // 	// check acc1's money has been withdrawn
    28  // 	acc1saving, _ := am.GetSavingFromUsername(ctx, user1)
    29  // 	assert.Equal(t, minBalance, acc1saving)
    30  // 	assert.Equal(t, true, vm.DoesVoterExist(ctx, user1))
    31  
    32  // 	// make sure the voter's account info is correct
    33  // 	voter, _ := vm.storage.GetVoter(ctx, user1)
    34  // 	assert.Equal(t, voteParam.MinStakeIn, voter.LinoStake)
    35  
    36  // 	day, _ := gm.GetPastDay(ctx, ctx.BlockHeader().Time.Unix())
    37  // 	gs := globalModel.NewGlobalStorage(testGlobalKVStoreKey)
    38  // 	linoStat, _ := gs.GetLinoStakeStat(ctx, day)
    39  // 	assert.Equal(t, linoStat.TotalLinoStake, voter.LinoStake)
    40  // 	assert.Equal(t, linoStat.UnclaimedLinoStake, voter.LinoStake)
    41  // }
    42  
    43  // func TestDelegateBasic(t *testing.T) {
    44  // 	ctx, am, vm, gm := setupTest(t, 0)
    45  // 	handler := NewHandler(vm, am, &gm)
    46  
    47  // 	voteParam, _ := vm.paramHolder.GetVoteParam(ctx)
    48  // 	minBalance := types.NewCoinFromInt64(3000 * types.Decimals)
    49  
    50  // 	// create test users
    51  // 	user1 := createTestAccount(ctx, am, "user1", minBalance.Plus(voteParam.MinStakeIn))
    52  // 	user2 := createTestAccount(ctx, am, "user2", minBalance)
    53  // 	user3 := createTestAccount(ctx, am, "user3", minBalance)
    54  
    55  // 	// let user1 register as voter
    56  // 	msg := NewStakeInMsg("user1", coinToString(voteParam.MinStakeIn))
    57  // 	handler(ctx, msg)
    58  
    59  // 	delegatedCoin := voteParam.MinStakeIn
    60  // 	// let user2 delegate power to user1 twice
    61  // 	msg2 := NewDelegateMsg("user2", "user1", coinToString(delegatedCoin))
    62  // 	handler(ctx, msg2)
    63  // 	result2 := handler(ctx, msg2)
    64  // 	assert.Equal(t, sdk.Result{}, result2)
    65  
    66  // 	// make sure the voter's voting power is correct
    67  // 	voter, _ := vm.storage.GetVoter(ctx, user1)
    68  // 	assert.Equal(t, voteParam.MinStakeIn, voter.LinoStake)
    69  // 	assert.Equal(t, delegatedCoin.Plus(delegatedCoin), voter.DelegatedPower)
    70  
    71  // 	votingPower, _ := vm.GetVotingPower(ctx, "user1")
    72  // 	assert.Equal(t, true, votingPower.IsEqual(voteParam.MinStakeIn.Plus(delegatedCoin).Plus(delegatedCoin)))
    73  // 	acc2Balance, _ := am.GetSavingFromUsername(ctx, user2)
    74  
    75  // 	assert.Equal(t, minBalance.Minus(delegatedCoin).Minus(delegatedCoin), acc2Balance)
    76  
    77  // 	// let user3 delegate power to user1
    78  // 	msg3 := NewDelegateMsg("user3", "user1", coinToString(delegatedCoin))
    79  // 	result3 := handler(ctx, msg3)
    80  // 	assert.Equal(t, sdk.Result{}, result3)
    81  
    82  // 	// check delegator list is correct
    83  // 	delegators, _ := vm.storage.GetAllDelegators(ctx, "user1")
    84  // 	assert.Equal(t, 2, len(delegators))
    85  // 	assert.Equal(t, user2, delegators[0])
    86  // 	assert.Equal(t, user3, delegators[1])
    87  
    88  // 	// check delegation are correct
    89  // 	delegation1, _ := vm.storage.GetDelegation(ctx, "user1", "user2")
    90  // 	delegation2, _ := vm.storage.GetDelegation(ctx, "user1", "user3")
    91  // 	assert.Equal(t, delegatedCoin.Plus(delegatedCoin), delegation1.Amount)
    92  // 	assert.Equal(t, delegatedCoin, delegation2.Amount)
    93  // }
    94  
    95  // func TestVotingPowerAndStake(t *testing.T) {
    96  // 	ctx, am, vm, gm := setupTest(t, 0)
    97  // 	handler := NewHandler(vm, am, &gm)
    98  
    99  // 	voteParam, _ := vm.paramHolder.GetVoteParam(ctx)
   100  // 	minBalance := types.NewCoinFromInt64(5000 * types.Decimals)
   101  
   102  // 	// create test users
   103  // 	user1 := createTestAccount(ctx, am, "user1", minBalance.Plus(voteParam.MinStakeIn))
   104  // 	createTestAccount(ctx, am, "user2", minBalance)
   105  
   106  // 	// let user1 stake in
   107  // 	msg := NewStakeInMsg("user1", coinToString(voteParam.MinStakeIn))
   108  // 	handler(ctx, msg)
   109  
   110  // 	delegatedCoin := types.NewCoinFromInt64(1300 * types.Decimals)
   111  // 	// let user2 delegate power to user1
   112  // 	msg2 := NewDelegateMsg("user2", "user1", coinToString(delegatedCoin))
   113  // 	handler(ctx, msg2)
   114  
   115  // 	// let user1 delegate power to user2
   116  // 	msg3 := NewDelegateMsg("user1", "user2", coinToString(delegatedCoin))
   117  // 	handler(ctx, msg3)
   118  
   119  // 	votingPower, _ := vm.GetVotingPower(ctx, "user1")
   120  // 	assert.Equal(t, true, votingPower.IsEqual(voteParam.MinStakeIn.Plus(delegatedCoin)))
   121  
   122  // 	voter, _ := vm.storage.GetVoter(ctx, user1)
   123  // 	assert.Equal(t, true, voter.LinoStake.IsEqual(voteParam.MinStakeIn.Plus(delegatedCoin)))
   124  
   125  // }
   126  
   127  // func TestRevokeBasic(t *testing.T) {
   128  // 	ctx, am, vm, gm := setupTest(t, 0)
   129  // 	handler := NewHandler(vm, am, &gm)
   130  // 	voteParam, _ := vm.paramHolder.GetVoteParam(ctx)
   131  // 	minBalance := types.NewCoinFromInt64(3000 * types.Decimals)
   132  
   133  // 	// create test users
   134  // 	user1 := createTestAccount(ctx, am, "user1", minBalance.Plus(voteParam.MinStakeIn))
   135  // 	user2 := createTestAccount(ctx, am, "user2", minBalance)
   136  // 	user3 := createTestAccount(ctx, am, "user3", minBalance)
   137  
   138  // 	// let user1 register as voter
   139  // 	msg := NewStakeInMsg("user1", coinToString(voteParam.MinStakeIn))
   140  // 	handler(ctx, msg)
   141  
   142  // 	delegatedCoin := voteParam.MinStakeIn
   143  // 	// let user2 delegate power to user1
   144  // 	msg2 := NewDelegateMsg("user2", "user1", coinToString(delegatedCoin))
   145  // 	handler(ctx, msg2)
   146  
   147  // 	// let user3 delegate power to user1
   148  // 	msg3 := NewDelegateMsg("user3", "user1", coinToString(delegatedCoin))
   149  // 	handler(ctx, msg3)
   150  
   151  // 	_, res := vm.storage.GetDelegation(ctx, "user1", "user3")
   152  // 	assert.Nil(t, res)
   153  
   154  // 	// let user3 reovke delegation
   155  // 	msg4 := NewDelegatorWithdrawMsg("user3", "user1", coinToString(delegatedCoin))
   156  // 	result := handler(ctx, msg4)
   157  // 	assert.Equal(t, sdk.Result{}, result)
   158  
   159  // 	// make sure user3 won't get coins immediately, but user1 power down immediately
   160  // 	voter, _ := vm.storage.GetVoter(ctx, "user1")
   161  // 	acc3Balance, _ := am.GetSavingFromUsername(ctx, user3)
   162  // 	_, err := vm.storage.GetDelegation(ctx, "user1", "user3")
   163  // 	assert.Equal(t, model.ErrDelegationNotFound(), err)
   164  // 	assert.Equal(t, delegatedCoin, voter.DelegatedPower)
   165  // 	assert.Equal(t, minBalance.Minus(delegatedCoin), acc3Balance)
   166  
   167  // 	acc1Balance, _ := am.GetSavingFromUsername(ctx, user1)
   168  // 	acc2Balance, _ := am.GetSavingFromUsername(ctx, user2)
   169  // 	assert.Equal(t, model.ErrDelegationNotFound(), err)
   170  // 	assert.Equal(t, minBalance, acc1Balance)
   171  // 	assert.Equal(t, minBalance.Minus(delegatedCoin), acc2Balance)
   172  
   173  // 	// user1 can revoke voter candidancy now
   174  // 	referenceList := &model.ReferenceList{
   175  // 		AllValidators: []types.AccountKey{},
   176  // 	}
   177  // 	err = vm.storage.SetReferenceList(ctx, referenceList)
   178  // 	if err != nil {
   179  // 		panic(err)
   180  // 	}
   181  // 	msg5 := NewStakeOutMsg("user1", coinToString(voteParam.MinStakeIn))
   182  
   183  // 	err = vm.storage.SetReferenceList(ctx, referenceList)
   184  // 	if err != nil {
   185  // 		panic(err)
   186  // 	}
   187  // 	result2 := handler(ctx, msg5)
   188  // 	assert.Equal(t, sdk.Result{}, result2)
   189  
   190  // 	// make sure user2 wont get coins immediately, and delegatin was deleted
   191  // 	day, _ := gm.GetPastDay(ctx, ctx.BlockHeader().Time.Unix())
   192  // 	gs := globalModel.NewGlobalStorage(testGlobalKVStoreKey)
   193  // 	linoStat, _ := gs.GetLinoStakeStat(ctx, day)
   194  // 	assert.Equal(t, linoStat.TotalLinoStake, delegatedCoin)
   195  // 	assert.Equal(t, linoStat.UnclaimedLinoStake, delegatedCoin)
   196  // }
   197  
   198  // func TestVoterWithdraw(t *testing.T) {
   199  // 	ctx, am, vm, gm := setupTest(t, 0)
   200  // 	handler := NewHandler(vm, am, &gm)
   201  // 	minBalance := types.NewCoinFromInt64(30 * types.Decimals)
   202  // 	voteParam, _ := vm.paramHolder.GetVoteParam(ctx)
   203  // 	withdraw := types.NewCoinFromInt64(10 * types.Decimals)
   204  
   205  // 	// create test users
   206  // 	createTestAccount(ctx, am, "user1", minBalance.Plus(voteParam.MinStakeIn))
   207  
   208  // 	// withdraw will fail if hasn't registered as voter
   209  // 	illegalWithdrawMsg := NewStakeOutMsg("user1", coinToString(voteParam.MinStakeIn))
   210  // 	res := handler(ctx, illegalWithdrawMsg)
   211  // 	assert.Equal(t, ErrIllegalWithdraw().Result(), res)
   212  
   213  // 	// let user1 register as voter
   214  // 	msg := NewStakeInMsg("user1", coinToString(voteParam.MinStakeIn))
   215  // 	handler(ctx, msg)
   216  
   217  // 	day, _ := gm.GetPastDay(ctx, ctx.BlockHeader().Time.Unix())
   218  // 	gs := globalModel.NewGlobalStorage(testGlobalKVStoreKey)
   219  // 	linoStat, _ := gs.GetLinoStakeStat(ctx, day)
   220  
   221  // 	voter, _ := vm.storage.GetVoter(ctx, "user1")
   222  // 	assert.Equal(t, voteParam.MinStakeIn, voter.LinoStake)
   223  // 	assert.Equal(t, linoStat.TotalLinoStake, voteParam.MinStakeIn)
   224  // 	assert.Equal(t, linoStat.UnclaimedLinoStake, voteParam.MinStakeIn)
   225  
   226  // 	// invalid deposit
   227  // 	invalidDepositMsg := NewStakeInMsg("1du1i2bdi12bud", coinToString(voteParam.MinStakeIn))
   228  // 	res = handler(ctx, invalidDepositMsg)
   229  // 	assert.Equal(t, ErrAccountNotFound().Result().Code, res.Code)
   230  
   231  // 	msg2 := NewStakeOutMsg("user1", coinToString(minBalance.Plus(voteParam.MinStakeIn)))
   232  // 	result2 := handler(ctx, msg2)
   233  // 	assert.Equal(t, ErrIllegalWithdraw().Result(), result2)
   234  
   235  // 	msg3 := NewStakeOutMsg("user1", coinToString(withdraw))
   236  // 	result3 := handler(ctx, msg3)
   237  // 	assert.Equal(t, sdk.Result{}, result3)
   238  
   239  // 	linoStat, _ = gs.GetLinoStakeStat(ctx, day)
   240  
   241  // 	voter, _ = vm.storage.GetVoter(ctx, "user1")
   242  // 	assert.Equal(t, voteParam.MinStakeIn.Minus(withdraw), voter.LinoStake)
   243  // 	assert.Equal(t, linoStat.TotalLinoStake, voteParam.MinStakeIn.Minus(withdraw))
   244  // 	assert.Equal(t, linoStat.UnclaimedLinoStake, voteParam.MinStakeIn.Minus(withdraw))
   245  // }
   246  
   247  // func TestDelegatorWithdraw(t *testing.T) {
   248  // 	ctx, am, vm, gm := setupTest(t, 0)
   249  // 	minBalance := types.NewCoinFromInt64(2000 * types.Decimals)
   250  // 	user1 := createTestAccount(ctx, am, "user1", minBalance)
   251  // 	user2 := createTestAccount(ctx, am, "user2", minBalance)
   252  // 	handler := NewHandler(vm, am, &gm)
   253  // 	param, _ := vm.paramHolder.GetVoteParam(ctx)
   254  // 	delegatedCoin := param.MinStakeIn
   255  // 	delta := types.NewCoinFromInt64(1 * types.Decimals)
   256  
   257  // 	err := vm.AddVoter(ctx, user1, param.MinStakeIn)
   258  // 	if err != nil {
   259  // 		panic(err)
   260  // 	}
   261  
   262  // 	testCases := []struct {
   263  // 		testName       string
   264  // 		addDelegation  bool
   265  // 		delegatedCoin  types.Coin
   266  // 		delegator      types.AccountKey
   267  // 		voter          types.AccountKey
   268  // 		withdraw       types.Coin
   269  // 		expectedResult sdk.Result
   270  // 	}{
   271  // 		{
   272  // 			testName:       "no delegation exist, can't withdraw",
   273  // 			addDelegation:  false,
   274  // 			delegatedCoin:  types.NewCoinFromInt64(0),
   275  // 			delegator:      user2,
   276  // 			voter:          user1,
   277  // 			withdraw:       delta,
   278  // 			expectedResult: ErrIllegalWithdraw().Result(),
   279  // 		},
   280  // 		{
   281  // 			testName:       "can't withdraw delegatedCoin+delta",
   282  // 			addDelegation:  true,
   283  // 			delegatedCoin:  delegatedCoin,
   284  // 			delegator:      user2,
   285  // 			voter:          user1,
   286  // 			withdraw:       delegatedCoin.Plus(delta),
   287  // 			expectedResult: ErrIllegalWithdraw().Result(),
   288  // 		},
   289  // 		{
   290  // 			testName:       "normal withdraw",
   291  // 			addDelegation:  false,
   292  // 			delegatedCoin:  types.NewCoinFromInt64(0),
   293  // 			delegator:      user2,
   294  // 			voter:          user1,
   295  // 			withdraw:       delegatedCoin.Minus(delta),
   296  // 			expectedResult: sdk.Result{},
   297  // 		},
   298  // 	}
   299  
   300  // 	for _, tc := range testCases {
   301  // 		if tc.addDelegation {
   302  // 			msg := NewDelegateMsg(string(tc.delegator), string(tc.voter), coinToString(tc.delegatedCoin))
   303  // 			res := handler(ctx, msg)
   304  // 			if !assert.Equal(t, sdk.Result{}, res) {
   305  // 				t.Errorf("failed to add delegation")
   306  // 			}
   307  // 		}
   308  // 		msg := NewDelegatorWithdrawMsg(string(tc.delegator), string(tc.voter), coinToString(tc.withdraw))
   309  // 		res := handler(ctx, msg)
   310  // 		if !assert.Equal(t, tc.expectedResult, res) {
   311  // 			t.Errorf("%s: diff result, got %v, want %v", tc.testName, res, tc.expectedResult)
   312  // 		}
   313  // 	}
   314  // }
   315  
   316  // func TestAddFrozenMoney(t *testing.T) {
   317  // 	ctx, am, vm, gm := setupTest(t, 0)
   318  // 	err := vm.InitGenesis(ctx)
   319  // 	if err != nil {
   320  // 		panic(err)
   321  // 	}
   322  
   323  // 	minBalance := types.NewCoinFromInt64(1 * types.Decimals)
   324  // 	user := createTestAccount(ctx, am, "user", minBalance)
   325  
   326  // 	testCases := []struct {
   327  // 		testName               string
   328  // 		times                  int64
   329  // 		interval               int64
   330  // 		returnedCoin           types.Coin
   331  // 		expectedFrozenListLen  int
   332  // 		expectedFrozenMoney    types.Coin
   333  // 		expectedFrozenTimes    int64
   334  // 		expectedFrozenInterval int64
   335  // 	}{
   336  // 		{
   337  // 			testName:               "return coin to user",
   338  // 			times:                  10,
   339  // 			interval:               2,
   340  // 			returnedCoin:           types.NewCoinFromInt64(100),
   341  // 			expectedFrozenListLen:  1,
   342  // 			expectedFrozenMoney:    types.NewCoinFromInt64(100),
   343  // 			expectedFrozenTimes:    10,
   344  // 			expectedFrozenInterval: 2,
   345  // 		},
   346  // 		{
   347  // 			testName:               "return coin to user again",
   348  // 			times:                  100000,
   349  // 			interval:               20000,
   350  // 			returnedCoin:           types.NewCoinFromInt64(100000),
   351  // 			expectedFrozenListLen:  2,
   352  // 			expectedFrozenMoney:    types.NewCoinFromInt64(100000),
   353  // 			expectedFrozenTimes:    100000,
   354  // 			expectedFrozenInterval: 20000,
   355  // 		},
   356  // 	}
   357  
   358  // 	for _, tc := range testCases {
   359  // 		err := returnCoinTo(
   360  // 			ctx, "user", &gm, am, tc.times, tc.interval, tc.returnedCoin, types.VoteReturnCoin)
   361  // 		if err != nil {
   362  // 			t.Errorf("%s: failed to return coin, got err %v", tc.testName, err)
   363  // 		}
   364  // 		addr, err := am.GetAddress(ctx, user)
   365  // 		if err != nil {
   366  // 			t.Errorf("%s: failed to get address, got err %v", tc.testName, err)
   367  // 		}
   368  // 		lst, err := am.GetFrozenMoneyList(ctx, addr)
   369  // 		if err != nil {
   370  // 			t.Errorf("%s: failed to get frozen money list, got err %v", tc.testName, err)
   371  // 		}
   372  // 		if len(lst) != tc.expectedFrozenListLen {
   373  // 			t.Errorf("%s: diff list len, got %v, want %v", tc.testName, len(lst), tc.expectedFrozenListLen)
   374  // 		}
   375  // 		if !lst[len(lst)-1].Amount.IsEqual(tc.expectedFrozenMoney) {
   376  // 			t.Errorf("%s: diff amount, got %v, want %v", tc.testName, lst[len(lst)-1].Amount, tc.expectedFrozenMoney)
   377  // 		}
   378  // 		if lst[len(lst)-1].Times != tc.expectedFrozenTimes {
   379  // 			t.Errorf("%s: diff times, got %v, want %v", tc.testName, lst[len(lst)-1].Times, tc.expectedFrozenTimes)
   380  // 		}
   381  // 		if lst[len(lst)-1].Interval != tc.expectedFrozenInterval {
   382  // 			t.Errorf("%s: diff interval, got %v, want %v", tc.testName, lst[len(lst)-1].Interval, tc.expectedFrozenInterval)
   383  // 		}
   384  // 	}
   385  // }
   386  
   387  // func TestDeleteVoteBasic(t *testing.T) {
   388  // 	ctx, am, vm, gm := setupTest(t, 0)
   389  // 	err := vm.InitGenesis(ctx)
   390  // 	if err != nil {
   391  // 		panic(err)
   392  // 	}
   393  // 	handler := NewHandler(vm, am, &gm)
   394  
   395  // 	proposalID1 := types.ProposalKey("1")
   396  // 	minBalance := types.NewCoinFromInt64(2000 * types.Decimals)
   397  // 	voteParam, _ := vm.paramHolder.GetVoteParam(ctx)
   398  
   399  // 	// create test users
   400  // 	user2 := createTestAccount(ctx, am, "user2", minBalance.Plus(voteParam.MinStakeIn))
   401  // 	depositMsg := NewStakeInMsg("user2", coinToString(voteParam.MinStakeIn))
   402  // 	handler(ctx, depositMsg)
   403  
   404  // 	// add vote
   405  // 	_ = vm.AddVote(ctx, proposalID1, user2, true)
   406  
   407  // 	voteList, _ := vm.storage.GetAllVotes(ctx, proposalID1)
   408  // 	assert.Equal(t, user2, voteList[0].Voter)
   409  
   410  // 	// test delete vote
   411  // 	err = vm.storage.DeleteVote(ctx, proposalID1, "user2")
   412  // 	if err != nil {
   413  // 		panic(err)
   414  // 	}
   415  // 	_, err = vm.storage.GetVote(ctx, proposalID1, "user2")
   416  // 	assert.Equal(t, model.ErrVoteNotFound(), err)
   417  // }