github.com/KiraCore/sekai@v0.3.43/x/gov/keeper/proposal_test.go (about) 1 package keeper_test 2 3 import ( 4 "testing" 5 "time" 6 7 simapp "github.com/KiraCore/sekai/app" 8 kiratypes "github.com/KiraCore/sekai/types" 9 "github.com/KiraCore/sekai/x/gov/types" 10 tmproto "github.com/cometbft/cometbft/proto/tendermint/types" 11 sdk "github.com/cosmos/cosmos-sdk/types" 12 "github.com/stretchr/testify/require" 13 ) 14 15 func TestDefaultProposalIdAtDefaultGenesis(t *testing.T) { 16 app := simapp.Setup(false) 17 ctx := app.NewContext(false, tmproto.Header{}) 18 19 proposalID := app.CustomGovKeeper.GetNextProposalID(ctx) 20 require.Equal(t, uint64(1), proposalID) 21 } 22 23 func TestKeeper_EncodingContentType(t *testing.T) { 24 app := simapp.Setup(false) 25 ctx := app.NewContext(false, tmproto.Header{}) 26 27 addrs := simapp.AddTestAddrsIncremental(app, ctx, 1, sdk.TokensFromConsensusPower(10, sdk.DefaultPowerReduction)) 28 addr := addrs[0] 29 30 proposal1, err := types.NewProposal( 31 1, 32 "title", 33 "some desc", 34 types.NewWhitelistAccountPermissionProposal( 35 addr, 36 types.PermSetPermissions, 37 ), 38 time.Now(), 39 time.Now().Add(1*time.Second), 40 time.Now().Add(10*time.Second), 41 ctx.BlockHeight()+2, 42 ctx.BlockHeight()+3, 43 ) 44 require.NoError(t, err) 45 46 app.CustomGovKeeper.SaveProposal(ctx, proposal1) 47 48 saveProposal, found := app.CustomGovKeeper.GetProposal(ctx, proposal1.ProposalId) 49 require.True(t, found) 50 51 require.Equal(t, proposal1.GetContent(), saveProposal.GetContent()) 52 53 content, ok := saveProposal.GetContent().(*types.WhitelistAccountPermissionProposal) 54 require.True(t, ok) 55 require.Equal(t, addr, content.Address) 56 require.Equal(t, types.PermSetPermissions, content.Permission) 57 } 58 59 func TestKeeper_GetProposals(t *testing.T) { 60 app := simapp.Setup(false) 61 ctx := app.NewContext(false, tmproto.Header{}) 62 63 addrs := simapp.AddTestAddrsIncremental(app, ctx, 1, sdk.TokensFromConsensusPower(10, sdk.DefaultPowerReduction)) 64 addr := addrs[0] 65 66 proposal1, err := types.NewProposal( 67 1, 68 "title", 69 "some desc", 70 types.NewWhitelistAccountPermissionProposal( 71 addr, 72 types.PermSetPermissions, 73 ), 74 time.Now(), 75 time.Now().Add(1*time.Second), 76 time.Now().Add(10*time.Second), 77 ctx.BlockHeight()+2, 78 ctx.BlockHeight()+3, 79 ) 80 require.NoError(t, err) 81 82 app.CustomGovKeeper.SaveProposal(ctx, proposal1) 83 84 proposals, err := app.CustomGovKeeper.GetProposals(ctx) 85 require.NoError(t, err) 86 require.Len(t, proposals, 1) 87 88 proposal2, err := types.NewProposal( 89 2, 90 "title", 91 "some desc", 92 types.NewWhitelistAccountPermissionProposal( 93 addr, 94 types.PermSetPermissions, 95 ), 96 time.Now(), 97 time.Now().Add(1*time.Second), 98 time.Now().Add(10*time.Second), 99 ctx.BlockHeight()+2, 100 ctx.BlockHeight()+3, 101 ) 102 app.CustomGovKeeper.SaveProposal(ctx, proposal2) 103 proposals, err = app.CustomGovKeeper.GetProposals(ctx) 104 require.NoError(t, err) 105 require.Len(t, proposals, 2) 106 require.Equal(t, proposals[1].ProposalId, proposal2.ProposalId) 107 require.Equal(t, proposals[1].Content, proposal2.Content) 108 require.Equal(t, proposals[1].Result, proposal2.Result) 109 require.Equal(t, proposals[1].SubmitTime.UTC().String(), proposal2.SubmitTime.UTC().String()) 110 require.Equal(t, proposals[1].VotingEndTime.UTC().String(), proposal2.VotingEndTime.UTC().String()) 111 require.Equal(t, proposals[1].EnactmentEndTime.UTC().String(), proposal2.EnactmentEndTime.UTC().String()) 112 } 113 114 func TestSaveProposalReturnsTheProposalID_AndIncreasesLast(t *testing.T) { 115 app := simapp.Setup(false) 116 ctx := app.NewContext(false, tmproto.Header{}) 117 118 proposalID := app.CustomGovKeeper.GetNextProposalIDAndIncrement(ctx) 119 require.Equal(t, uint64(1), proposalID) 120 121 addrs := simapp.AddTestAddrsIncremental(app, ctx, 1, sdk.TokensFromConsensusPower(10, sdk.DefaultPowerReduction)) 122 addr := addrs[0] 123 124 proposal, err := types.NewProposal( 125 proposalID, 126 "title", 127 "some desc", 128 types.NewWhitelistAccountPermissionProposal( 129 addr, 130 types.PermClaimValidator, 131 ), 132 ctx.BlockTime(), 133 ctx.BlockTime().Add(10*time.Minute), 134 ctx.BlockTime().Add(20*time.Minute), 135 ctx.BlockHeight()+2, 136 ctx.BlockHeight()+3, 137 ) 138 require.NoError(t, err) 139 app.CustomGovKeeper.SaveProposal(ctx, proposal) 140 141 // nextProposalID should be 2 142 proposalID = app.CustomGovKeeper.GetNextProposalID(ctx) 143 require.Equal(t, uint64(2), proposalID) 144 145 // Get proposal 146 savedProposal, found := app.CustomGovKeeper.GetProposal(ctx, proposal.ProposalId) 147 require.True(t, found) 148 require.Equal(t, proposal, savedProposal) 149 } 150 151 func TestKeeper_SaveVote(t *testing.T) { 152 app := simapp.Setup(false) 153 ctx := app.NewContext(false, tmproto.Header{}) 154 155 addrs := simapp.AddTestAddrsIncremental(app, ctx, 1, sdk.TokensFromConsensusPower(10, sdk.DefaultPowerReduction)) 156 addr := addrs[0] 157 158 // Vote not saved yet 159 _, found := app.CustomGovKeeper.GetVote(ctx, 1, addr) 160 require.False(t, found) 161 162 vote := types.NewVote(1, addr, types.OptionAbstain, sdk.ZeroDec()) 163 164 app.CustomGovKeeper.SaveVote(ctx, vote) 165 166 savedVote, found := app.CustomGovKeeper.GetVote(ctx, 1, addr) 167 require.True(t, found) 168 require.Equal(t, vote, savedVote) 169 } 170 171 func TestKeeper_AddProposalToActiveQueue(t *testing.T) { 172 app := simapp.Setup(false) 173 ctx := app.NewContext(false, tmproto.Header{}) 174 175 addrs := simapp.AddTestAddrsIncremental(app, ctx, 1, sdk.TokensFromConsensusPower(10, sdk.DefaultPowerReduction)) 176 addr := addrs[0] 177 178 baseEndTime := time.Now() 179 for _, i := range []uint64{1, 2, 3} { 180 endTime := baseEndTime.Add(time.Second * time.Duration(i)) 181 182 proposal, err := types.NewProposal( 183 i, 184 "title", 185 "some desc", 186 types.NewWhitelistAccountPermissionProposal( 187 addr, 188 types.PermSetPermissions, 189 ), 190 baseEndTime, 191 endTime, 192 endTime, 193 ctx.BlockHeight()+2, 194 ctx.BlockHeight()+3, 195 ) 196 require.NoError(t, err) 197 198 app.CustomGovKeeper.SaveProposal(ctx, proposal) 199 app.CustomGovKeeper.AddToActiveProposals(ctx, proposal) 200 } 201 202 // We only get until endtime of the second proposal. 203 iterator := app.CustomGovKeeper.GetActiveProposalsWithFinishedVotingEndTimeIterator(ctx, baseEndTime.Add(2*time.Second)) 204 defer iterator.Close() 205 requireIteratorCount(t, iterator, 2) 206 207 // We remove one ActiveProposal, the first 208 proposal, found := app.CustomGovKeeper.GetProposal(ctx, 1) 209 require.True(t, found) 210 app.CustomGovKeeper.RemoveActiveProposal(ctx, proposal) 211 212 // We then only get 1 proposal. 213 iterator = app.CustomGovKeeper.GetActiveProposalsWithFinishedVotingEndTimeIterator(ctx, baseEndTime.Add(2*time.Second)) 214 defer iterator.Close() 215 requireIteratorCount(t, iterator, 1) 216 } 217 218 func TestKeeper_AddProposalToEnactmentQueue(t *testing.T) { 219 app := simapp.Setup(false) 220 ctx := app.NewContext(false, tmproto.Header{}) 221 222 addrs := simapp.AddTestAddrsIncremental(app, ctx, 1, sdk.TokensFromConsensusPower(10, sdk.DefaultPowerReduction)) 223 addr := addrs[0] 224 225 baseEndTime := time.Now() 226 for _, i := range []uint64{1, 2, 3} { 227 enactmentEndTime := baseEndTime.Add(time.Duration(i) * time.Second) 228 proposal, err := types.NewProposal( 229 i, 230 "title", 231 "some desc", 232 types.NewWhitelistAccountPermissionProposal( 233 addr, 234 types.PermSetPermissions, 235 ), 236 baseEndTime, 237 baseEndTime, 238 enactmentEndTime, 239 ctx.BlockHeight()+2, 240 ctx.BlockHeight()+3, 241 ) 242 require.NoError(t, err) 243 244 app.CustomGovKeeper.SaveProposal(ctx, proposal) 245 app.CustomGovKeeper.AddToEnactmentProposals(ctx, proposal) 246 } 247 248 // We only get until endtime of the second proposal. 249 iterator := app.CustomGovKeeper.GetEnactmentProposalsWithFinishedEnactmentEndTimeIterator(ctx, baseEndTime.Add(2*time.Second)) 250 defer iterator.Close() 251 requireIteratorCount(t, iterator, 2) 252 253 // We remove one Proposal from the Enactment list, the first 254 proposal, found := app.CustomGovKeeper.GetProposal(ctx, 1) 255 require.True(t, found) 256 app.CustomGovKeeper.RemoveEnactmentProposal(ctx, proposal) 257 258 // We then only get 1 proposal. 259 iterator = app.CustomGovKeeper.GetEnactmentProposalsWithFinishedEnactmentEndTimeIterator(ctx, baseEndTime.Add(2*time.Second)) 260 defer iterator.Close() 261 requireIteratorCount(t, iterator, 1) 262 } 263 264 func TestKeeper_GetProposalVotesIterator(t *testing.T) { 265 app := simapp.Setup(false) 266 ctx := app.NewContext(false, tmproto.Header{}) 267 268 addrs := simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.TokensFromConsensusPower(10, sdk.DefaultPowerReduction)) 269 addr1 := addrs[0] 270 addr2 := addrs[1] 271 272 proposal1, err := types.NewProposal( 273 1, 274 "title", 275 "some desc", 276 types.NewWhitelistAccountPermissionProposal( 277 addr1, 278 types.PermSetPermissions, 279 ), 280 time.Now(), 281 time.Now().Add(1*time.Second), 282 time.Now().Add(10*time.Second), 283 ctx.BlockHeight()+2, 284 ctx.BlockHeight()+3, 285 ) 286 require.NoError(t, err) 287 288 proposal2, err := types.NewProposal( 289 2, 290 "title", 291 "some desc", 292 types.NewWhitelistAccountPermissionProposal( 293 addr2, 294 types.PermClaimCouncilor, 295 ), 296 time.Now(), 297 time.Now().Add(1*time.Second), 298 time.Now().Add(10*time.Second), 299 ctx.BlockHeight()+2, 300 ctx.BlockHeight()+3, 301 ) 302 require.NoError(t, err) 303 304 app.CustomGovKeeper.SaveProposal(ctx, proposal1) 305 app.CustomGovKeeper.SaveProposal(ctx, proposal2) 306 307 // 1st proposal has 2 votes 308 vote1 := types.NewVote(proposal1.ProposalId, addr1, types.OptionYes, sdk.ZeroDec()) 309 vote2 := types.NewVote(proposal1.ProposalId, addr2, types.OptionYes, sdk.ZeroDec()) 310 app.CustomGovKeeper.SaveVote(ctx, vote1) 311 app.CustomGovKeeper.SaveVote(ctx, vote2) 312 313 // 2nd proposal has 1 vote 314 v1 := types.NewVote(proposal2.ProposalId, addr1, types.OptionYes, sdk.ZeroDec()) 315 app.CustomGovKeeper.SaveVote(ctx, v1) 316 317 // We iterate the 1st proposal 318 iterator := app.CustomGovKeeper.GetProposalVotesIterator(ctx, proposal1.ProposalId) 319 require.True(t, iterator.Valid()) 320 totalVotes := 0 321 for ; iterator.Valid(); iterator.Next() { 322 totalVotes++ 323 } 324 require.Equal(t, 2, totalVotes) 325 326 // We iterate the 2nd proposal 327 iterator = app.CustomGovKeeper.GetProposalVotesIterator(ctx, proposal2.ProposalId) 328 require.True(t, iterator.Valid()) 329 totalVotes = 0 330 for ; iterator.Valid(); iterator.Next() { 331 totalVotes++ 332 } 333 require.Equal(t, 1, totalVotes) 334 } 335 336 func TestKeeper_ProposalDuration(t *testing.T) { 337 app := simapp.Setup(false) 338 ctx := app.NewContext(false, tmproto.Header{}) 339 ctx = ctx.WithBlockTime(time.Now()) 340 341 properties := app.CustomGovKeeper.GetNetworkProperties(ctx) 342 343 // test WhitelistAccountPermissionProposal 344 proposalID, err := app.CustomGovKeeper.CreateAndSaveProposalWithContent(ctx, "title", "description", &types.WhitelistAccountPermissionProposal{}) 345 require.NoError(t, err) 346 347 proposal, found := app.CustomGovKeeper.GetProposal(ctx, proposalID) 348 require.True(t, found) 349 350 require.Equal(t, proposal.VotingEndTime.Unix(), ctx.BlockTime().Unix()+int64(properties.MinimumProposalEndTime)) 351 352 // test SetNetworkPropertyProposal 353 proposalID, err = app.CustomGovKeeper.CreateAndSaveProposalWithContent(ctx, "title", "description", &types.SetNetworkPropertyProposal{}) 354 require.NoError(t, err) 355 proposal, found = app.CustomGovKeeper.GetProposal(ctx, proposalID) 356 require.True(t, found) 357 require.Equal(t, proposal.VotingEndTime.Unix(), ctx.BlockTime().Unix()+int64(properties.MinimumProposalEndTime)) 358 359 // check longer duration proposal 360 app.CustomGovKeeper.SetProposalDuration(ctx, kiratypes.ProposalTypeSetProposalDurations, 2400) 361 proposalID, err = app.CustomGovKeeper.CreateAndSaveProposalWithContent(ctx, "title", "description", &types.SetProposalDurationsProposal{}) 362 require.NoError(t, err) 363 proposal, found = app.CustomGovKeeper.GetProposal(ctx, proposalID) 364 require.True(t, found) 365 require.Equal(t, proposal.VotingEndTime.Unix(), ctx.BlockTime().Unix()+2400) 366 }