github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/x/mint/proposal_handler_test.go (about)

     1  package mint_test
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	"github.com/fibonacci-chain/fbc/app"
     8  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
     9  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    10  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/mint"
    11  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/mint/internal/types"
    12  	abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types"
    13  	tmtypes "github.com/fibonacci-chain/fbc/libs/tendermint/types"
    14  	govtypes "github.com/fibonacci-chain/fbc/x/gov/types"
    15  	"github.com/stretchr/testify/suite"
    16  )
    17  
    18  var (
    19  	treasure1 = types.NewTreasure(sdk.AccAddress([]byte{0x01}), sdk.NewDecWithPrec(4, 2))
    20  	treasure2 = types.NewTreasure(sdk.AccAddress([]byte{0x02}), sdk.NewDecWithPrec(3, 2))
    21  	treasure3 = types.NewTreasure(sdk.AccAddress([]byte{0x03}), sdk.NewDecWithPrec(2, 2))
    22  	treasure4 = types.NewTreasure(sdk.AccAddress([]byte{0x04}), sdk.NewDecWithPrec(1, 2))
    23  	treasure5 = types.NewTreasure(sdk.AccAddress([]byte{0x05}), sdk.NewDecWithPrec(0, 2))
    24  	treasures = []types.Treasure{*treasure1, *treasure2, *treasure3, *treasure4, *treasure5}
    25  )
    26  
    27  type MintTestSuite struct {
    28  	suite.Suite
    29  
    30  	ctx        sdk.Context
    31  	govHandler govtypes.Handler
    32  	querier    sdk.Querier
    33  	app        *app.FBChainApp
    34  	codec      *codec.Codec
    35  }
    36  
    37  func (suite *MintTestSuite) SetupTest() {
    38  	checkTx := false
    39  
    40  	suite.app = app.Setup(checkTx)
    41  	suite.ctx = suite.app.BaseApp.NewContext(checkTx, abci.Header{Height: 1, ChainID: "ethermint-3", Time: time.Now().UTC()})
    42  
    43  	suite.govHandler = mint.NewManageTreasuresProposalHandler(&suite.app.MintKeeper)
    44  	suite.querier = mint.NewQuerier(suite.app.MintKeeper)
    45  	suite.codec = codec.New()
    46  }
    47  
    48  func TestMintTestSuite(t *testing.T) {
    49  	suite.Run(t, new(MintTestSuite))
    50  }
    51  
    52  func (suite *MintTestSuite) TestTreasuresProposal() {
    53  	proposal := types.NewManageTreasuresProposal(
    54  		"default title",
    55  		"default description",
    56  		treasures,
    57  		true,
    58  	)
    59  	govProposal := govtypes.Proposal{
    60  		Content: proposal,
    61  	}
    62  	passfunc := func(err error, trs []types.Treasure, msg string) {
    63  		suite.Require().NoError(err, msg)
    64  	}
    65  	treasuresError := func(err error, trs []types.Treasure, msg string) {
    66  		suite.Require().Error(err)
    67  		suite.Require().Contains(err.Error(), "treasure proportion should non-negative and less than one", msg)
    68  	}
    69  	sumProportionError := func(err error, trs []types.Treasure, msg string) {
    70  		suite.Require().Error(err)
    71  		suite.Require().Contains(err.Error(), "the sum of treasure proportion should non-negative and less than one", msg)
    72  	}
    73  	unexistError := func(err error, trs []types.Treasure, msg string) {
    74  		suite.Require().Error(err)
    75  		suite.Require().Contains(err.Error(), "because it's not exist from treasures", msg)
    76  	}
    77  	testCases := []struct {
    78  		msg             string
    79  		expectfunc      func(err error, trs []types.Treasure, msg string)
    80  		prepare         func()
    81  		targetTreasures []types.Treasure
    82  	}{
    83  		{
    84  			"add one into empty",
    85  			passfunc,
    86  			func() {
    87  				proposal.IsAdded = true
    88  				proposal.Treasures = []types.Treasure{treasures[0]}
    89  			},
    90  			[]types.Treasure{treasures[0]},
    91  		},
    92  		{
    93  			"add one into one",
    94  			passfunc,
    95  			func() {
    96  				proposal.IsAdded = true
    97  				proposal.Treasures = []types.Treasure{treasures[1]}
    98  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[0]})
    99  
   100  			},
   101  			[]types.Treasure{treasures[1], treasures[0]},
   102  		},
   103  		{
   104  			"add one into multi",
   105  			passfunc,
   106  			func() {
   107  				proposal.IsAdded = true
   108  				proposal.Treasures = []types.Treasure{treasures[1]}
   109  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[0], treasures[2]})
   110  
   111  			},
   112  			[]types.Treasure{treasures[2], treasures[1], treasures[0]},
   113  		},
   114  		{
   115  			"add multi into multi",
   116  			passfunc,
   117  			func() {
   118  				proposal.IsAdded = true
   119  				proposal.Treasures = []types.Treasure{treasures[1], treasures[3]}
   120  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[0], treasures[2]})
   121  
   122  			},
   123  			[]types.Treasure{treasures[3], treasures[2], treasures[1], treasures[0]},
   124  		},
   125  		{
   126  			"add multi into one",
   127  			passfunc,
   128  			func() {
   129  				proposal.IsAdded = true
   130  				proposal.Treasures = []types.Treasure{treasures[1], treasures[3]}
   131  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[0]})
   132  
   133  			},
   134  			[]types.Treasure{treasures[3], treasures[1], treasures[0]},
   135  		},
   136  		{
   137  			"update one into one",
   138  			passfunc,
   139  			func() {
   140  				proposal.IsAdded = true
   141  				proposal.Treasures = []types.Treasure{{Address: treasures[0].Address, Proportion: sdk.NewDecWithPrec(8, 2)}}
   142  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[0]})
   143  			},
   144  			[]types.Treasure{{Address: treasures[0].Address, Proportion: sdk.NewDecWithPrec(8, 2)}},
   145  		},
   146  		{
   147  			"update one into multi",
   148  			passfunc,
   149  			func() {
   150  				proposal.IsAdded = true
   151  				proposal.Treasures = []types.Treasure{{Address: treasures[0].Address, Proportion: sdk.NewDecWithPrec(8, 2)}}
   152  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[0], treasures[2]})
   153  			},
   154  			[]types.Treasure{treasures[2], {Address: treasures[0].Address, Proportion: sdk.NewDecWithPrec(8, 2)}},
   155  		},
   156  		{
   157  			"update multi into multi",
   158  			passfunc,
   159  			func() {
   160  				proposal.IsAdded = true
   161  				proposal.Treasures = []types.Treasure{{Address: treasures[0].Address, Proportion: sdk.NewDecWithPrec(8, 2)}, {Address: treasures[2].Address, Proportion: sdk.NewDecWithPrec(16, 2)}}
   162  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[0], treasures[2]})
   163  			},
   164  			[]types.Treasure{{Address: treasures[2].Address, Proportion: sdk.NewDecWithPrec(16, 2)}, {Address: treasures[0].Address, Proportion: sdk.NewDecWithPrec(8, 2)}},
   165  		},
   166  		{
   167  			"update/insert multi into multi",
   168  			passfunc,
   169  			func() {
   170  				proposal.IsAdded = true
   171  				proposal.Treasures = []types.Treasure{{Address: treasures[0].Address, Proportion: sdk.NewDecWithPrec(8, 2)}, {Address: treasures[2].Address, Proportion: sdk.NewDecWithPrec(16, 2)}, treasures[3]}
   172  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[0], treasures[2]})
   173  			},
   174  			[]types.Treasure{treasures[3], {Address: treasures[2].Address, Proportion: sdk.NewDecWithPrec(16, 2)}, {Address: treasures[0].Address, Proportion: sdk.NewDecWithPrec(8, 2)}},
   175  		},
   176  		{
   177  			"delete one from one",
   178  			passfunc,
   179  			func() {
   180  				proposal.IsAdded = false
   181  				proposal.Treasures = []types.Treasure{treasures[3]}
   182  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[3]})
   183  			},
   184  			[]types.Treasure{},
   185  		},
   186  		{
   187  			"delete one from multi",
   188  			passfunc,
   189  			func() {
   190  				proposal.IsAdded = false
   191  				proposal.Treasures = []types.Treasure{treasures[3]}
   192  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[3], treasures[0]})
   193  			},
   194  			[]types.Treasure{treasures[0]},
   195  		},
   196  		{
   197  			"delete multi from multi",
   198  			passfunc,
   199  			func() {
   200  				proposal.IsAdded = false
   201  				proposal.Treasures = []types.Treasure{treasures[3], treasures[0]}
   202  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[3], treasures[0]})
   203  			},
   204  			[]types.Treasure{},
   205  		},
   206  		{
   207  			"delete multi from multi more",
   208  			passfunc,
   209  			func() {
   210  				proposal.IsAdded = false
   211  				proposal.Treasures = []types.Treasure{treasures[3], treasures[0]}
   212  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[3], treasures[0], treasures[1]})
   213  			},
   214  			[]types.Treasure{treasures[1]},
   215  		},
   216  		{
   217  			"add multi(negative) into multi",
   218  			treasuresError,
   219  			func() {
   220  				proposal.IsAdded = true
   221  				proposal.Treasures = []types.Treasure{{Address: treasures[1].Address, Proportion: sdk.NewDecWithPrec(-1, 0)}, treasures[3]}
   222  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[0], treasures[2]})
   223  
   224  			},
   225  			[]types.Treasure{treasures[2], treasures[0]},
   226  		},
   227  		{
   228  			"add multi(more negative) into multi",
   229  			treasuresError,
   230  			func() {
   231  				proposal.IsAdded = true
   232  				proposal.Treasures = []types.Treasure{{Address: treasures[1].Address, Proportion: sdk.NewDecWithPrec(-1, 0)}, {Address: treasures[3].Address, Proportion: sdk.NewDecWithPrec(-1, 0)}, treasures[4]}
   233  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[0], treasures[2]})
   234  
   235  			},
   236  			[]types.Treasure{treasures[2], treasures[0]},
   237  		},
   238  		{
   239  			"add multi(all negative) into multi",
   240  			treasuresError,
   241  			func() {
   242  				proposal.IsAdded = true
   243  				proposal.Treasures = []types.Treasure{{Address: treasures[1].Address, Proportion: sdk.NewDecWithPrec(-1, 0)}, {Address: treasures[3].Address, Proportion: sdk.NewDecWithPrec(-1, 0)}, {Address: treasures[4].Address, Proportion: sdk.NewDecWithPrec(-1, 0)}}
   244  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[0], treasures[2]})
   245  
   246  			},
   247  			[]types.Treasure{treasures[2], treasures[0]},
   248  		},
   249  		{
   250  			"add multi(more than one) into multi",
   251  			treasuresError,
   252  			func() {
   253  				proposal.IsAdded = true
   254  				proposal.Treasures = []types.Treasure{{Address: treasures[1].Address, Proportion: sdk.NewDecWithPrec(8, 0)}, treasures[3]}
   255  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[0], treasures[2]})
   256  
   257  			},
   258  			[]types.Treasure{treasures[2], treasures[0]},
   259  		},
   260  		{
   261  			"add multi(more than one) into multi",
   262  			treasuresError,
   263  			func() {
   264  				proposal.IsAdded = true
   265  				proposal.Treasures = []types.Treasure{{Address: treasures[1].Address, Proportion: sdk.NewDecWithPrec(8, 0)}, {Address: treasures[3].Address, Proportion: sdk.NewDecWithPrec(8, 0)}, treasures[4]}
   266  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[0], treasures[2]})
   267  
   268  			},
   269  			[]types.Treasure{treasures[2], treasures[0]},
   270  		},
   271  		{
   272  			"add multi(more than one) into multi",
   273  			treasuresError,
   274  			func() {
   275  				proposal.IsAdded = true
   276  				proposal.Treasures = []types.Treasure{{Address: treasures[1].Address, Proportion: sdk.NewDecWithPrec(8, 0)}, {Address: treasures[3].Address, Proportion: sdk.NewDecWithPrec(8, 0)}, {Address: treasures[4].Address, Proportion: sdk.NewDecWithPrec(8, 0)}}
   277  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[0], treasures[2]})
   278  
   279  			},
   280  			[]types.Treasure{treasures[2], treasures[0]},
   281  		},
   282  		{
   283  			"add multi(input sum proportion more than one) into multi",
   284  			sumProportionError,
   285  			func() {
   286  				proposal.IsAdded = true
   287  				proposal.Treasures = []types.Treasure{{Address: treasures[1].Address, Proportion: sdk.NewDecWithPrec(8, 1)}, {Address: treasures[3].Address, Proportion: sdk.NewDecWithPrec(2, 1)}, {Address: treasures[4].Address, Proportion: sdk.NewDecWithPrec(1, 2)}}
   288  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[0], treasures[2]})
   289  
   290  			},
   291  			[]types.Treasure{treasures[2], treasures[0]},
   292  		},
   293  		{
   294  			"add multi(result sum proportion more than one) into multi",
   295  			sumProportionError,
   296  			func() {
   297  				proposal.IsAdded = true
   298  				proposal.Treasures = []types.Treasure{{Address: treasures[1].Address, Proportion: sdk.NewDecWithPrec(8, 1)}, {Address: treasures[3].Address, Proportion: sdk.NewDecWithPrec(2, 1)}}
   299  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[0], treasures[2]})
   300  
   301  			},
   302  			[]types.Treasure{treasures[2], treasures[0]},
   303  		},
   304  		{
   305  			"update multi(negative) into multi",
   306  			treasuresError,
   307  			func() {
   308  				proposal.IsAdded = true
   309  				proposal.Treasures = []types.Treasure{{Address: treasures[0].Address, Proportion: sdk.NewDecWithPrec(-8, 2)}, {Address: treasures[2].Address, Proportion: sdk.NewDecWithPrec(16, 2)}}
   310  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[0], treasures[2]})
   311  			},
   312  			[]types.Treasure{treasures[2], treasures[0]},
   313  		},
   314  		{
   315  			"update multi(more negative) into multi",
   316  			treasuresError,
   317  			func() {
   318  				proposal.IsAdded = true
   319  				proposal.Treasures = []types.Treasure{{Address: treasures[0].Address, Proportion: sdk.NewDecWithPrec(-8, 2)}, {Address: treasures[2].Address, Proportion: sdk.NewDecWithPrec(-16, 2)}, treasures[4]}
   320  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[0], treasures[2]})
   321  			},
   322  			[]types.Treasure{treasures[2], treasures[0]},
   323  		},
   324  		{
   325  			"update multi(all negative) into multi",
   326  			treasuresError,
   327  			func() {
   328  				proposal.IsAdded = true
   329  				proposal.Treasures = []types.Treasure{{Address: treasures[0].Address, Proportion: sdk.NewDecWithPrec(-8, 2)}, {Address: treasures[2].Address, Proportion: sdk.NewDecWithPrec(-16, 2)}}
   330  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[0], treasures[2]})
   331  			},
   332  			[]types.Treasure{treasures[2], treasures[0]},
   333  		},
   334  		{
   335  			"update multi(more than one) into multi",
   336  			treasuresError,
   337  			func() {
   338  				proposal.IsAdded = true
   339  				proposal.Treasures = []types.Treasure{{Address: treasures[0].Address, Proportion: sdk.NewDecWithPrec(8, 0)}, {Address: treasures[2].Address, Proportion: sdk.NewDecWithPrec(16, 0)}}
   340  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[0], treasures[2]})
   341  			},
   342  			[]types.Treasure{treasures[2], treasures[0]},
   343  		},
   344  		{
   345  			"update multi(more more than one) into multi",
   346  			treasuresError,
   347  			func() {
   348  				proposal.IsAdded = true
   349  				proposal.Treasures = []types.Treasure{{Address: treasures[0].Address, Proportion: sdk.NewDecWithPrec(8, 0)}, {Address: treasures[2].Address, Proportion: sdk.NewDecWithPrec(16, 0)}, treasures[4]}
   350  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[0], treasures[2]})
   351  			},
   352  			[]types.Treasure{treasures[2], treasures[0]},
   353  		},
   354  		{
   355  			"update multi(all more than one) into multi",
   356  			treasuresError,
   357  			func() {
   358  				proposal.IsAdded = true
   359  				proposal.Treasures = []types.Treasure{{Address: treasures[0].Address, Proportion: sdk.NewDecWithPrec(8, 0)}, {Address: treasures[2].Address, Proportion: sdk.NewDecWithPrec(16, 0)}}
   360  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[0], treasures[2]})
   361  			},
   362  			[]types.Treasure{treasures[2], treasures[0]},
   363  		},
   364  		{
   365  			"update multi(input the sum proportion all more than one) into multi",
   366  			sumProportionError,
   367  			func() {
   368  				proposal.IsAdded = true
   369  				proposal.Treasures = []types.Treasure{{Address: treasures[0].Address, Proportion: sdk.NewDecWithPrec(8, 1)}, {Address: treasures[2].Address, Proportion: sdk.NewDecWithPrec(21, 2)}}
   370  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[0], treasures[2]})
   371  			},
   372  			[]types.Treasure{treasures[2], treasures[0]},
   373  		},
   374  		{
   375  			"update multi(result the sum proportion all more than one) into multi",
   376  			sumProportionError,
   377  			func() {
   378  				proposal.IsAdded = true
   379  				proposal.Treasures = []types.Treasure{{Address: treasures[0].Address, Proportion: sdk.NewDecWithPrec(8, 1)}, {Address: treasures[2].Address, Proportion: sdk.NewDecWithPrec(20, 2)}}
   380  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[0], treasures[1], treasures[2]})
   381  			},
   382  			[]types.Treasure{treasures[2], treasures[1], treasures[0]},
   383  		},
   384  		{
   385  			"delete multi(unexist) from multi",
   386  			unexistError,
   387  			func() {
   388  				proposal.IsAdded = false
   389  				proposal.Treasures = []types.Treasure{treasures[4], treasures[0]}
   390  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[3], treasures[0]})
   391  			},
   392  			[]types.Treasure{treasures[3], treasures[0]},
   393  		},
   394  		{
   395  			"delete multi(part unexist) from multi",
   396  			unexistError,
   397  			func() {
   398  				proposal.IsAdded = false
   399  				proposal.Treasures = []types.Treasure{treasures[4], treasures[2], treasures[0]}
   400  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[3], treasures[0]})
   401  			},
   402  			[]types.Treasure{treasures[3], treasures[0]},
   403  		},
   404  		{
   405  			"delete multi(all unexist) from multi",
   406  			unexistError,
   407  			func() {
   408  				proposal.IsAdded = false
   409  				proposal.Treasures = []types.Treasure{treasures[4], treasures[2]}
   410  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[3], treasures[0]})
   411  			},
   412  			[]types.Treasure{treasures[3], treasures[0]},
   413  		},
   414  		{
   415  			"delete multi(negative) from multi",
   416  			passfunc,
   417  			func() {
   418  				proposal.IsAdded = false
   419  				proposal.Treasures = []types.Treasure{{Address: treasures[3].Address, Proportion: sdk.NewDecWithPrec(-2, 0)}, treasures[0]}
   420  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[3], treasures[0]})
   421  			},
   422  			[]types.Treasure{},
   423  		},
   424  		{
   425  			"delete multi(more negative) from multi",
   426  			passfunc,
   427  			func() {
   428  				proposal.IsAdded = false
   429  				proposal.Treasures = []types.Treasure{{Address: treasures[3].Address, Proportion: sdk.NewDecWithPrec(-2, 0)}, {Address: treasures[0].Address, Proportion: sdk.NewDecWithPrec(-2, 0)}}
   430  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[3], treasures[0]})
   431  			},
   432  			[]types.Treasure{},
   433  		},
   434  		{
   435  			"delete multi(more than one) from multi",
   436  			passfunc,
   437  			func() {
   438  				proposal.IsAdded = false
   439  				proposal.Treasures = []types.Treasure{{Address: treasures[3].Address, Proportion: sdk.NewDecWithPrec(2, 0)}, treasures[0]}
   440  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[3], treasures[0]})
   441  			},
   442  			[]types.Treasure{},
   443  		},
   444  		{
   445  			"delete multi(more more than one) from multi",
   446  			passfunc,
   447  			func() {
   448  				proposal.IsAdded = false
   449  				proposal.Treasures = []types.Treasure{{Address: treasures[3].Address, Proportion: sdk.NewDecWithPrec(2, 0)}, {Address: treasures[0].Address, Proportion: sdk.NewDecWithPrec(2, 0)}}
   450  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[3], treasures[0]})
   451  			},
   452  			[]types.Treasure{},
   453  		},
   454  		{
   455  			"delete multi(the sum proportion more than one) from multi",
   456  			passfunc,
   457  			func() {
   458  				proposal.IsAdded = false
   459  				proposal.Treasures = []types.Treasure{{Address: treasures[3].Address, Proportion: sdk.NewDecWithPrec(80, 2)}, {Address: treasures[0].Address, Proportion: sdk.NewDecWithPrec(22, 2)}}
   460  				suite.app.MintKeeper.SetTreasures(suite.ctx, []types.Treasure{treasures[3], treasures[0]})
   461  			},
   462  			[]types.Treasure{},
   463  		},
   464  	}
   465  
   466  	for _, tc := range testCases {
   467  		suite.Run(tc.msg, func() {
   468  			tc.prepare()
   469  			govProposal.Content = proposal
   470  
   471  			err := suite.govHandler(suite.ctx, &govProposal)
   472  			tc.expectfunc(err, tc.targetTreasures, tc.msg)
   473  
   474  			// check the whitelist with target address list
   475  			actual := suite.app.MintKeeper.GetTreasures(suite.ctx)
   476  			suite.Require().Equal(len(tc.targetTreasures), len(actual), tc.msg)
   477  
   478  			for i, _ := range actual {
   479  				suite.Require().Equal(tc.targetTreasures[i], actual[i], tc.msg)
   480  			}
   481  
   482  			// reset data
   483  			suite.app.MintKeeper.SetTreasures(suite.ctx, make([]types.Treasure, 0))
   484  		})
   485  	}
   486  }
   487  
   488  func (suite *MintTestSuite) TestModifyNextBlockUpdateProposal() {
   489  	tmtypes.UnittestOnlySetMilestoneVenus5Height(-1)
   490  	suite.ctx.SetBlockHeight(1000)
   491  	proposal := types.NewModifyNextBlockUpdateProposal(
   492  		"default title",
   493  		"default description",
   494  		0,
   495  	)
   496  	govProposal := govtypes.Proposal{
   497  		Content: proposal,
   498  	}
   499  
   500  	testCases := []struct {
   501  		msg            string
   502  		blockNum       uint64
   503  		expectBlockNum uint64
   504  		expectError    error
   505  	}{
   506  		{"error block num 0", 0, 0, types.ErrNextBlockUpdateTooLate},
   507  		{"error block num 1000", 1000, 0, types.ErrNextBlockUpdateTooLate},
   508  		{"ok block num 1001", 1001, 1001, nil},
   509  		{"ok block num 2000", 2000, 2000, nil},
   510  	}
   511  
   512  	for _, tc := range testCases {
   513  		suite.Run(tc.msg, func() {
   514  			proposal.BlockNum = tc.blockNum
   515  			govProposal.Content = proposal
   516  
   517  			oldMinter := suite.app.MintKeeper.GetMinterCustom(suite.ctx)
   518  
   519  			err := suite.govHandler(suite.ctx, &govProposal)
   520  			suite.Require().Equal(err, tc.expectError)
   521  			newMinter := suite.app.MintKeeper.GetMinterCustom(suite.ctx)
   522  			suite.Require().Equal(tc.expectBlockNum, newMinter.NextBlockToUpdate)
   523  
   524  			suite.app.MintKeeper.SetMinterCustom(suite.ctx, oldMinter)
   525  		})
   526  	}
   527  }