github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/gov/genesis_test.go (about)

     1  package gov
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     8  	"github.com/stretchr/testify/require"
     9  
    10  	"github.com/fibonacci-chain/fbc/x/gov/keeper"
    11  	"github.com/fibonacci-chain/fbc/x/gov/types"
    12  )
    13  
    14  func TestInitGenesisState(t *testing.T) {
    15  	ctx, _, gk, _, _ := keeper.CreateTestInput(t, false, 1000)
    16  
    17  	initialDeposit := sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 50)}
    18  	deposits := types.Deposits{
    19  		{ProposalID: 1, Depositor: keeper.Addrs[0], Amount: initialDeposit},
    20  	}
    21  	votes := types.Votes{
    22  		{ProposalID: 2, Voter: keeper.Addrs[1], Option: types.OptionYes},
    23  	}
    24  	proposals := types.Proposals{
    25  		types.Proposal{
    26  			ProposalID:       1,
    27  			Status:           StatusDepositPeriod,
    28  			FinalTallyResult: EmptyTallyResult(sdk.ZeroDec()),
    29  		},
    30  		types.Proposal{
    31  			ProposalID:       2,
    32  			Status:           StatusVotingPeriod,
    33  			FinalTallyResult: EmptyTallyResult(sdk.ZeroDec()),
    34  		},
    35  	}
    36  	waitingProposals := map[string]uint64{"2": 1234}
    37  
    38  	data := GenesisState{
    39  		StartingProposalID: 3,
    40  		Deposits:           deposits,
    41  		Votes:              votes,
    42  		Proposals:          proposals,
    43  		WaitingProposals:   waitingProposals,
    44  	}
    45  
    46  	InitGenesis(ctx, gk, gk.SupplyKeeper(), data)
    47  	// 0x00
    48  	proposal0, ok := gk.GetProposal(ctx, data.Proposals[0].ProposalID)
    49  	require.True(t, ok)
    50  	proposal1, ok := gk.GetProposal(ctx, data.Proposals[1].ProposalID)
    51  	require.True(t, ok)
    52  	require.Equal(t, data.Proposals[0], proposal0)
    53  	require.Equal(t, data.Proposals[1], proposal1)
    54  	// 0x01
    55  	var activeProposal types.Proposal
    56  	gk.IterateActiveProposalsQueue(ctx, time.Now(), func(proposal types.Proposal,
    57  	) (stop bool) {
    58  		activeProposal = proposal
    59  		return false
    60  	})
    61  	require.Equal(t, data.Proposals[1], activeProposal)
    62  	// 0x02
    63  	gk.IterateInactiveProposalsQueue(ctx, time.Now(), func(proposal types.Proposal,
    64  	) (stop bool) {
    65  		activeProposal = proposal
    66  		return false
    67  	})
    68  	require.Equal(t, data.Proposals[0], activeProposal)
    69  	// 0x03
    70  	pid, err := gk.GetProposalID(ctx)
    71  	require.NoError(t, err)
    72  	require.Equal(t, data.Proposals[1].ProposalID+1, pid)
    73  	// 0x10
    74  	deposit, ok := gk.GetDeposit(ctx, data.Deposits[0].ProposalID, data.Deposits[0].Depositor)
    75  	require.True(t, ok)
    76  	require.Equal(t, data.Deposits[0], deposit)
    77  	// 0x11
    78  	// getProposalDepositCnt not public method
    79  	// Referenced by other methods,such as GetDeposit and GetProposal
    80  	// 0x20
    81  	require.Equal(t, types.Votes(nil), gk.GetVotes(ctx, data.Proposals[0].ProposalID))
    82  	require.Equal(t, data.Votes, gk.GetVotes(ctx, data.Proposals[1].ProposalID))
    83  	// 0x21
    84  	// getProposalVoteCnt not public method
    85  	// Referenced by other methods,such as GetVotes
    86  	// 0x30
    87  	var waitingProposal types.Proposal
    88  	gk.IterateWaitingProposalsQueue(ctx, 1234, func(proposal types.Proposal,
    89  	) (stop bool) {
    90  		waitingProposal = proposal
    91  		return false
    92  	})
    93  	require.Equal(t, data.Proposals[1], waitingProposal)
    94  
    95  	inactiveQueue := gk.InactiveProposalQueueIterator(ctx, ctx.BlockHeader().Time)
    96  	require.True(t, inactiveQueue.Valid())
    97  	inactiveQueue.Close()
    98  	activeQueue := gk.ActiveProposalQueueIterator(ctx, ctx.BlockHeader().Time)
    99  	require.True(t, activeQueue.Valid())
   100  	activeQueue.Close()
   101  
   102  	exportGenesis := ExportGenesis(ctx, gk)
   103  	require.Equal(t, data.Deposits, exportGenesis.Deposits)
   104  	require.Equal(t, data.Votes, exportGenesis.Votes)
   105  
   106  	newCtx, _, newgk, _, _ := keeper.CreateTestInput(t, false, 1000)
   107  	InitGenesis(newCtx, newgk, newgk.SupplyKeeper(), exportGenesis)
   108  	// 0x00
   109  	proposal0, ok = newgk.GetProposal(newCtx, exportGenesis.Proposals[0].ProposalID)
   110  	require.True(t, ok)
   111  	proposal1, ok = newgk.GetProposal(newCtx, exportGenesis.Proposals[1].ProposalID)
   112  	require.True(t, ok)
   113  	require.Equal(t, exportGenesis.Proposals[0], proposal0)
   114  	require.Equal(t, exportGenesis.Proposals[1], proposal1)
   115  	// 0x01
   116  	newgk.IterateActiveProposalsQueue(newCtx, time.Now(), func(proposal types.Proposal,
   117  	) (stop bool) {
   118  		activeProposal = proposal
   119  		return false
   120  	})
   121  	require.Equal(t, exportGenesis.Proposals[1], activeProposal)
   122  	// 0x02
   123  	newgk.IterateInactiveProposalsQueue(newCtx, time.Now(), func(proposal types.Proposal,
   124  	) (stop bool) {
   125  		activeProposal = proposal
   126  		return false
   127  	})
   128  	require.Equal(t, exportGenesis.Proposals[0], activeProposal)
   129  	// 0x03
   130  	pid, err = newgk.GetProposalID(newCtx)
   131  	require.NoError(t, err)
   132  	require.Equal(t, exportGenesis.Proposals[1].ProposalID+1, pid)
   133  	// 0x10
   134  	deposit, ok = newgk.GetDeposit(newCtx, exportGenesis.Deposits[0].ProposalID, exportGenesis.Deposits[0].Depositor)
   135  	require.True(t, ok)
   136  	require.Equal(t, exportGenesis.Deposits[0], deposit)
   137  	// 0x11
   138  	// getProposalDepositCnt not public method
   139  	// Referenced by other methods,such as GetDeposit and GetProposal
   140  	// 0x20
   141  	require.Equal(t, types.Votes(nil), newgk.GetVotes(newCtx, exportGenesis.Proposals[0].ProposalID))
   142  	require.Equal(t, exportGenesis.Votes, newgk.GetVotes(newCtx, exportGenesis.Proposals[1].ProposalID))
   143  	// 0x21
   144  	// getProposalVoteCnt not public method
   145  	// Referenced by other methods,such as GetVotes
   146  	// 0x30
   147  	newgk.IterateWaitingProposalsQueue(newCtx, 1234, func(proposal types.Proposal,
   148  	) (stop bool) {
   149  		waitingProposal = proposal
   150  		return false
   151  	})
   152  	require.Equal(t, exportGenesis.Proposals[1], waitingProposal)
   153  
   154  }
   155  
   156  func TestValidateGenesis(t *testing.T) {
   157  	data := GenesisState{}
   158  	var err sdk.Error
   159  	data.TallyParams.Threshold, err = sdk.NewDecFromStr("-23")
   160  	require.Nil(t, err)
   161  	require.NotNil(t, ValidateGenesis(data))
   162  
   163  	data.TallyParams.Threshold = sdk.NewDecWithPrec(334, 3)
   164  	data.TallyParams.Veto, err = sdk.NewDecFromStr("-23")
   165  	require.Nil(t, err)
   166  	require.NotNil(t, ValidateGenesis(data))
   167  
   168  	data.TallyParams.Veto = sdk.NewDecWithPrec(334, 3)
   169  	data.TallyParams.Quorum, err = sdk.NewDecFromStr("-23")
   170  	require.Nil(t, err)
   171  	require.NotNil(t, ValidateGenesis(data))
   172  
   173  	data.TallyParams.Quorum = sdk.NewDecWithPrec(334, 3)
   174  	data.TallyParams.YesInVotePeriod, err = sdk.NewDecFromStr("-23")
   175  	require.Nil(t, err)
   176  	require.NotNil(t, ValidateGenesis(data))
   177  
   178  	data.TallyParams.YesInVotePeriod = sdk.NewDecWithPrec(334, 3)
   179  	coin, err := sdk.NewDecFromStr("-23")
   180  	require.Nil(t, err)
   181  	data.DepositParams.MinDeposit = sdk.SysCoins{sdk.SysCoin{Denom: sdk.DefaultBondDenom, Amount: coin}}
   182  	require.NotNil(t, ValidateGenesis(data))
   183  }
   184  
   185  func TestGenesisState_Equal(t *testing.T) {
   186  	var minDeposit = sdk.SysCoins{sdk.NewDecCoin(sdk.DefaultBondDenom, sdk.NewInt(100))}
   187  	expected := GenesisState{
   188  		StartingProposalID: 1,
   189  		Proposals:          []types.Proposal{},
   190  		DepositParams: DepositParams{
   191  			MinDeposit:       minDeposit,
   192  			MaxDepositPeriod: time.Hour * 24,
   193  		},
   194  		VotingParams: VotingParams{
   195  			VotingPeriod: time.Hour * 72,
   196  		},
   197  		TallyParams: TallyParams{
   198  			Quorum:          sdk.NewDecWithPrec(334, 3),
   199  			Threshold:       sdk.NewDecWithPrec(5, 1),
   200  			Veto:            sdk.NewDecWithPrec(334, 3),
   201  			YesInVotePeriod: sdk.NewDecWithPrec(667, 3),
   202  		},
   203  	}
   204  	require.True(t, expected.equal(DefaultGenesisState()))
   205  }
   206  
   207  func TestGenesisState_IsEmpty(t *testing.T) {
   208  	require.True(t, GenesisState{}.isEmpty())
   209  }