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  }