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 // }