github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/gov/keeper/keeper_test.go (about) 1 package keeper 2 3 import ( 4 "fmt" 5 "testing" 6 "time" 7 8 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 9 "github.com/fibonacci-chain/fbc/x/gov/types" 10 "github.com/stretchr/testify/require" 11 ) 12 13 func TestKeeper_IterateProposals(t *testing.T) { 14 ctx, _, keeper, _, _ := CreateTestInput(t, false, 1000) 15 16 content := types.NewTextProposal("Test", "description") 17 _, err := keeper.SubmitProposal(ctx, content) 18 require.Nil(t, err) 19 20 var findProposal types.Proposal 21 keeper.IterateProposals(ctx, func(proposal types.Proposal) (stop bool) { 22 if proposal.ProposalID == 1 { 23 findProposal = proposal 24 return true 25 } 26 return 27 }) 28 require.Equal(t, uint64(1), findProposal.ProposalID) 29 } 30 31 func TestKeeper_IterateWaitingProposalsQueue(t *testing.T) { 32 ctx, _, keeper, _, _ := CreateTestInput(t, false, 1000) 33 34 // no proposal 35 keeper.InsertWaitingProposalQueue(ctx, 100, 1) 36 require.Panics(t, func() { 37 keeper.IterateWaitingProposalsQueue(ctx, 100, func(proposal types.Proposal) (stop bool) { 38 return 39 }) 40 }) 41 42 content := types.NewTextProposal("Test", "description") 43 _, err := keeper.SubmitProposal(ctx, content) 44 require.Nil(t, err) 45 46 content = types.NewTextProposal("Test", "description") 47 _, err = keeper.SubmitProposal(ctx, content) 48 require.Nil(t, err) 49 50 content = types.NewTextProposal("Test", "description") 51 _, err = keeper.SubmitProposal(ctx, content) 52 require.Nil(t, err) 53 54 keeper.InsertWaitingProposalQueue(ctx, 101, 2) 55 keeper.InsertWaitingProposalQueue(ctx, 103, 3) 56 57 var proposals types.Proposals 58 keeper.IterateWaitingProposalsQueue(ctx, 103, func(proposal types.Proposal) (stop bool) { 59 if proposal.Status == types.StatusDepositPeriod { 60 proposals = append(proposals, proposal) 61 } 62 return 63 }) 64 require.Equal(t, 3, len(proposals)) 65 66 proposals = types.Proposals{} 67 keeper.IterateWaitingProposalsQueue(ctx, 103, func(proposal types.Proposal) (stop bool) { 68 if proposal.ProposalID == 1 { 69 proposals = append(proposals, proposal) 70 return true 71 } 72 return 73 }) 74 require.Equal(t, 1, len(proposals)) 75 } 76 77 func TestKeeper_IterateAllWaitingProposals(t *testing.T) { 78 ctx, _, keeper, _, _ := CreateTestInput(t, false, 1000) 79 80 // no proposal 81 keeper.InsertWaitingProposalQueue(ctx, 100, 1) 82 require.Panics(t, func() { 83 keeper.IterateWaitingProposalsQueue(ctx, 100, func(proposal types.Proposal) (stop bool) { 84 return 85 }) 86 }) 87 88 content := types.NewTextProposal("Test", "description") 89 _, err := keeper.SubmitProposal(ctx, content) 90 require.Nil(t, err) 91 92 content = types.NewTextProposal("Test", "description") 93 _, err = keeper.SubmitProposal(ctx, content) 94 require.Nil(t, err) 95 96 content = types.NewTextProposal("Test", "description") 97 _, err = keeper.SubmitProposal(ctx, content) 98 require.Nil(t, err) 99 100 keeper.InsertWaitingProposalQueue(ctx, 101, 2) 101 keeper.InsertWaitingProposalQueue(ctx, 103, 3) 102 103 var proposals types.Proposals 104 keeper.IterateAllWaitingProposals(ctx, func(proposal types.Proposal, _, _ uint64) (stop bool) { 105 if proposal.Status == types.StatusDepositPeriod { 106 proposals = append(proposals, proposal) 107 } 108 return 109 }) 110 require.Equal(t, 3, len(proposals)) 111 112 proposals = types.Proposals{} 113 keeper.IterateAllWaitingProposals(ctx, func(proposal types.Proposal, _, _ uint64) (stop bool) { 114 if proposal.ProposalID == 1 { 115 proposals = append(proposals, proposal) 116 return true 117 } 118 return 119 }) 120 require.Equal(t, 1, len(proposals)) 121 } 122 123 func TestKeeper_IterateActiveProposalsQueue(t *testing.T) { 124 ctx, _, keeper, _, _ := CreateTestInput(t, false, 1000) 125 126 baseTime := time.Now() 127 // no proposal 128 keeper.InsertActiveProposalQueue(ctx, 1, baseTime) 129 require.Panics(t, func() { 130 keeper.IterateActiveProposalsQueue(ctx, baseTime.Add(time.Second*1), 131 func(proposal types.Proposal) (stop bool) { 132 return 133 }) 134 }) 135 136 content := types.NewTextProposal("Test", "description") 137 _, err := keeper.SubmitProposal(ctx, content) 138 require.Nil(t, err) 139 140 content = types.NewTextProposal("Test", "description") 141 _, err = keeper.SubmitProposal(ctx, content) 142 require.Nil(t, err) 143 144 content = types.NewTextProposal("Test", "description") 145 _, err = keeper.SubmitProposal(ctx, content) 146 require.Nil(t, err) 147 148 keeper.InsertActiveProposalQueue(ctx, 2, baseTime.Add(time.Second*1)) 149 keeper.InsertActiveProposalQueue(ctx, 3, baseTime.Add(time.Second*2)) 150 151 var proposals types.Proposals 152 keeper.IterateActiveProposalsQueue(ctx, baseTime.Add(time.Second*2), func(proposal types.Proposal) (stop bool) { 153 if proposal.Status == types.StatusDepositPeriod { 154 proposals = append(proposals, proposal) 155 } 156 return 157 }) 158 require.Equal(t, 3, len(proposals)) 159 160 proposals = types.Proposals{} 161 keeper.IterateActiveProposalsQueue(ctx, baseTime.Add(time.Second*2), func(proposal types.Proposal) (stop bool) { 162 if proposal.ProposalID == 1 { 163 proposals = append(proposals, proposal) 164 return true 165 } 166 return 167 }) 168 require.Equal(t, 1, len(proposals)) 169 } 170 171 func TestKeeper_IterateInactiveProposalsQueue(t *testing.T) { 172 ctx, _, keeper, _, _ := CreateTestInput(t, false, 1000) 173 174 baseTime := time.Now() 175 // no proposal 176 keeper.InsertInactiveProposalQueue(ctx, 1, baseTime) 177 require.Panics(t, func() { 178 keeper.IterateInactiveProposalsQueue(ctx, baseTime.Add(time.Second*1), 179 func(proposal types.Proposal) (stop bool) { 180 return 181 }) 182 }) 183 keeper.RemoveFromInactiveProposalQueue(ctx, 1, baseTime) 184 185 content := types.NewTextProposal("Test", "description") 186 _, err := keeper.SubmitProposal(ctx, content) 187 require.Nil(t, err) 188 189 content = types.NewTextProposal("Test", "description") 190 _, err = keeper.SubmitProposal(ctx, content) 191 require.Nil(t, err) 192 193 content = types.NewTextProposal("Test", "description") 194 _, err = keeper.SubmitProposal(ctx, content) 195 require.Nil(t, err) 196 197 var proposals types.Proposals 198 keeper.IterateInactiveProposalsQueue(ctx, baseTime.Add(time.Second*2), func(proposal types.Proposal) (stop bool) { 199 if proposal.Status == types.StatusDepositPeriod { 200 proposals = append(proposals, proposal) 201 } 202 return 203 }) 204 require.Equal(t, 3, len(proposals)) 205 206 proposals = types.Proposals{} 207 keeper.IterateInactiveProposalsQueue(ctx, baseTime.Add(time.Second*2), func(proposal types.Proposal) (stop bool) { 208 if proposal.ProposalID == 1 { 209 proposals = append(proposals, proposal) 210 return true 211 } 212 return 213 }) 214 require.Equal(t, 1, len(proposals)) 215 } 216 217 func TestKeeper_IterateVotes(t *testing.T) { 218 ctx, _, keeper, _, _ := CreateTestInput(t, false, 1000) 219 220 content := types.NewTextProposal("Test", "description") 221 proposal, err := keeper.SubmitProposal(ctx, content) 222 require.Nil(t, err) 223 proposalID := proposal.ProposalID 224 225 err = keeper.AddDeposit(ctx, proposalID, Addrs[0], 226 sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 150)}, "") 227 require.Nil(t, err) 228 229 err, voteFee := keeper.AddVote(ctx, proposalID, Addrs[1], types.OptionYes) 230 require.Nil(t, err) 231 require.Equal(t, "", voteFee) 232 233 err, voteFee = keeper.AddVote(ctx, proposalID, Addrs[2], types.OptionNo) 234 require.Nil(t, err) 235 require.Equal(t, "", voteFee) 236 237 var findVote types.Vote 238 keeper.IterateVotes(ctx, proposalID, func(vote types.Vote) (stop bool) { 239 if vote.Voter.Equals(Addrs[1]) { 240 findVote = vote 241 return true 242 } 243 return 244 }) 245 require.Equal(t, Addrs[1], findVote.Voter) 246 } 247 248 func TestKeeper_IterateDeposits(t *testing.T) { 249 ctx, _, keeper, _, _ := CreateTestInput(t, false, 1000) 250 251 content := types.NewTextProposal("Test", "description") 252 proposal, err := keeper.SubmitProposal(ctx, content) 253 require.Nil(t, err) 254 proposalID := proposal.ProposalID 255 256 err = keeper.AddDeposit(ctx, proposalID, Addrs[0], 257 sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 10)}, "") 258 require.Nil(t, err) 259 260 err = keeper.AddDeposit(ctx, proposalID, Addrs[1], 261 sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 10)}, "") 262 require.Nil(t, err) 263 264 var findDeposit types.Deposit 265 keeper.IterateDeposits(ctx, proposalID, func(deposit types.Deposit) (stop bool) { 266 if deposit.Depositor.Equals(Addrs[1]) { 267 findDeposit = deposit 268 return true 269 } 270 return 271 }) 272 require.Equal(t, Addrs[1], findDeposit.Depositor) 273 } 274 275 func TestKeeper_IterateAllDeposits(t *testing.T) { 276 ctx, _, keeper, _, _ := CreateTestInput(t, false, 1000) 277 278 // proposal 1 279 content := types.NewTextProposal("Test", "description") 280 proposal, err := keeper.SubmitProposal(ctx, content) 281 require.Nil(t, err) 282 proposalID := proposal.ProposalID 283 284 err = keeper.AddDeposit(ctx, proposalID, Addrs[0], 285 sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 10)}, "") 286 require.Nil(t, err) 287 288 err = keeper.AddDeposit(ctx, proposalID, Addrs[1], 289 sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 10)}, "") 290 require.Nil(t, err) 291 292 // proposal 2 293 content = types.NewTextProposal("Test", "description") 294 proposal, err = keeper.SubmitProposal(ctx, content) 295 require.Nil(t, err) 296 proposalID = proposal.ProposalID 297 298 err = keeper.AddDeposit(ctx, proposalID, Addrs[0], 299 sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 10)}, "") 300 require.Nil(t, err) 301 302 err = keeper.AddDeposit(ctx, proposalID, Addrs[1], 303 sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 10)}, "") 304 require.Nil(t, err) 305 306 var findDeposit types.Deposit 307 keeper.IterateAllDeposits(ctx, func(deposit types.Deposit) (stop bool) { 308 if deposit.ProposalID == 1 && deposit.Depositor.Equals(Addrs[1]) { 309 findDeposit = deposit 310 return true 311 } 312 return 313 }) 314 require.Equal(t, Addrs[1], findDeposit.Depositor) 315 require.Equal(t, uint64(1), findDeposit.ProposalID) 316 } 317 318 func TestKeeper_GetTallyParams(t *testing.T) { 319 ctx, _, keeper, _, _ := CreateTestInput(t, false, 1000) 320 321 tallyParams := keeper.GetTallyParams(ctx) 322 expectedParams := types.TallyParams{ 323 Quorum: sdk.NewDecWithPrec(334, 3), 324 Threshold: sdk.NewDecWithPrec(5, 1), 325 Veto: sdk.NewDecWithPrec(334, 3), 326 YesInVotePeriod: sdk.NewDecWithPrec(667, 3), 327 } 328 require.Equal(t, expectedParams, tallyParams) 329 } 330 331 func TestKeeper_RemoveFromWaitingProposalQueue(t *testing.T) { 332 ctx, _, keeper, _, _ := CreateTestInput(t, false, 1000) 333 334 content := types.NewTextProposal("Test", "description") 335 proposal, err := keeper.SubmitProposal(ctx, content) 336 require.Nil(t, err) 337 proposalID := proposal.ProposalID 338 339 var proposals types.Proposals 340 keeper.InsertWaitingProposalQueue(ctx, 100, proposalID) 341 keeper.IterateWaitingProposalsQueue(ctx, 100, func(proposal types.Proposal) (stop bool) { 342 proposals = append(proposals, proposal) 343 return 344 }) 345 require.Equal(t, 1, len(proposals)) 346 347 proposals = types.Proposals{} 348 keeper.RemoveFromWaitingProposalQueue(ctx, 100, proposalID) 349 keeper.IterateWaitingProposalsQueue(ctx, 100, func(proposal types.Proposal) (stop bool) { 350 proposals = append(proposals, proposal) 351 return 352 }) 353 require.Equal(t, 0, len(proposals)) 354 } 355 356 func TestKeeper_CheckMsgSubmitProposal(t *testing.T) { 357 ctx, _, keeper, _, _ := CreateTestInput(t, false, 1000) 358 content := types.ContentFromProposalType("text", "text", types.ProposalTypeText) 359 360 // not satisfy initial deposit 361 amount, err := sdk.ParseDecCoins(fmt.Sprintf("1.0%s", sdk.DefaultBondDenom)) 362 require.Nil(t, err) 363 msg := types.NewMsgSubmitProposal(content, amount, Addrs[0]) 364 err = keeper.CheckMsgSubmitProposal(ctx, msg) 365 require.NotNil(t, err) 366 }