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  }