github.com/Finschia/finschia-sdk@v0.48.1/x/foundation/keeper/internal/genesis_test.go (about)

     1  package internal_test
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	"github.com/stretchr/testify/require"
     8  	tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
     9  
    10  	"github.com/Finschia/finschia-sdk/crypto/keys/secp256k1"
    11  	"github.com/Finschia/finschia-sdk/simapp"
    12  	"github.com/Finschia/finschia-sdk/testutil/testdata"
    13  	sdk "github.com/Finschia/finschia-sdk/types"
    14  
    15  	"github.com/Finschia/finschia-sdk/x/foundation"
    16  )
    17  
    18  func workingPolicy() foundation.DecisionPolicy {
    19  	return &foundation.ThresholdDecisionPolicy{
    20  		Threshold: sdk.OneDec(),
    21  		Windows: &foundation.DecisionPolicyWindows{
    22  			VotingPeriod: 7 * 24 * time.Hour, // one week
    23  		},
    24  	}
    25  }
    26  
    27  func TestImportExportGenesis(t *testing.T) {
    28  	checkTx := false
    29  	app := simapp.Setup(checkTx)
    30  	testdata.RegisterInterfaces(app.InterfaceRegistry())
    31  
    32  	ctx := app.BaseApp.NewContext(checkTx, tmproto.Header{})
    33  	keeper := app.FoundationKeeper
    34  
    35  	createAddress := func() sdk.AccAddress {
    36  		return sdk.AccAddress(secp256k1.GenPrivKey().PubKey().Address())
    37  	}
    38  
    39  	authority := foundation.DefaultAuthority()
    40  	existingAccount := createAddress()
    41  	app.AccountKeeper.SetAccount(ctx, app.AccountKeeper.NewAccountWithAddress(ctx, existingAccount))
    42  
    43  	member := createAddress()
    44  	stranger := createAddress()
    45  
    46  	testCases := map[string]struct {
    47  		init   *foundation.GenesisState
    48  		valid  bool
    49  		export *foundation.GenesisState
    50  	}{
    51  		"minimal": {
    52  			init: &foundation.GenesisState{
    53  				Params:     foundation.DefaultParams(),
    54  				Foundation: foundation.DefaultFoundation(),
    55  			},
    56  			valid: true,
    57  			export: &foundation.GenesisState{
    58  				Params:     foundation.DefaultParams(),
    59  				Foundation: foundation.DefaultFoundation(),
    60  			},
    61  		},
    62  		"members": {
    63  			init: &foundation.GenesisState{
    64  				Params: foundation.DefaultParams(),
    65  				Foundation: *foundation.FoundationInfo{
    66  					Version:     1,
    67  					TotalWeight: sdk.OneDec(),
    68  				}.WithDecisionPolicy(workingPolicy()),
    69  				Members: []foundation.Member{
    70  					{
    71  						Address: member.String(),
    72  					},
    73  				},
    74  			},
    75  			valid: true,
    76  			export: &foundation.GenesisState{
    77  				Params: foundation.DefaultParams(),
    78  				Foundation: *foundation.FoundationInfo{
    79  					Version:     1,
    80  					TotalWeight: sdk.OneDec(),
    81  				}.WithDecisionPolicy(workingPolicy()),
    82  				Members: []foundation.Member{
    83  					{
    84  						Address: member.String(),
    85  					},
    86  				},
    87  			},
    88  		},
    89  		"proposals": {
    90  			init: &foundation.GenesisState{
    91  				Params: foundation.DefaultParams(),
    92  				Foundation: *foundation.FoundationInfo{
    93  					Version:     1,
    94  					TotalWeight: sdk.OneDec(),
    95  				}.WithDecisionPolicy(workingPolicy()),
    96  				Members: []foundation.Member{
    97  					{
    98  						Address: member.String(),
    99  					},
   100  				},
   101  				PreviousProposalId: 1,
   102  				Proposals: []foundation.Proposal{
   103  					*foundation.Proposal{
   104  						Id:                1,
   105  						Proposers:         []string{member.String()},
   106  						FoundationVersion: 1,
   107  					}.WithMsgs([]sdk.Msg{testdata.NewTestMsg(authority)}),
   108  				},
   109  				Votes: []foundation.Vote{
   110  					{
   111  						ProposalId: 1,
   112  						Voter:      member.String(),
   113  						Option:     foundation.VOTE_OPTION_YES,
   114  					},
   115  				},
   116  			},
   117  			valid: true,
   118  			export: &foundation.GenesisState{
   119  				Params: foundation.DefaultParams(),
   120  				Foundation: *foundation.FoundationInfo{
   121  					Version:     1,
   122  					TotalWeight: sdk.OneDec(),
   123  				}.WithDecisionPolicy(workingPolicy()),
   124  				Members: []foundation.Member{
   125  					{
   126  						Address: member.String(),
   127  					},
   128  				},
   129  				PreviousProposalId: 1,
   130  				Proposals: []foundation.Proposal{
   131  					*foundation.Proposal{
   132  						Id:                1,
   133  						Proposers:         []string{member.String()},
   134  						FoundationVersion: 1,
   135  						FinalTallyResult: foundation.TallyResult{
   136  							YesCount:        sdk.ZeroDec(),
   137  							NoCount:         sdk.ZeroDec(),
   138  							AbstainCount:    sdk.ZeroDec(),
   139  							NoWithVetoCount: sdk.ZeroDec(),
   140  						},
   141  					}.WithMsgs([]sdk.Msg{testdata.NewTestMsg(authority)}),
   142  				},
   143  				Votes: []foundation.Vote{
   144  					{
   145  						ProposalId: 1,
   146  						Voter:      member.String(),
   147  						Option:     foundation.VOTE_OPTION_YES,
   148  					},
   149  				},
   150  			},
   151  		},
   152  		"authorizations": {
   153  			init: &foundation.GenesisState{
   154  				Params:     foundation.DefaultParams(),
   155  				Foundation: foundation.DefaultFoundation(),
   156  				Censorships: []foundation.Censorship{
   157  					{
   158  						MsgTypeUrl: sdk.MsgTypeURL((*foundation.MsgWithdrawFromTreasury)(nil)),
   159  						Authority:  foundation.CensorshipAuthorityFoundation,
   160  					},
   161  				},
   162  				Authorizations: []foundation.GrantAuthorization{
   163  					*foundation.GrantAuthorization{
   164  						Grantee: stranger.String(),
   165  					}.WithAuthorization(&foundation.ReceiveFromTreasuryAuthorization{}),
   166  				},
   167  			},
   168  			valid: true,
   169  			export: &foundation.GenesisState{
   170  				Params:     foundation.DefaultParams(),
   171  				Foundation: foundation.DefaultFoundation(),
   172  				Censorships: []foundation.Censorship{
   173  					{
   174  						MsgTypeUrl: sdk.MsgTypeURL((*foundation.MsgWithdrawFromTreasury)(nil)),
   175  						Authority:  foundation.CensorshipAuthorityFoundation,
   176  					},
   177  				},
   178  				Authorizations: []foundation.GrantAuthorization{
   179  					*foundation.GrantAuthorization{
   180  						Grantee: stranger.String(),
   181  					}.WithAuthorization(&foundation.ReceiveFromTreasuryAuthorization{}),
   182  				},
   183  			},
   184  		},
   185  		"pool": {
   186  			init: &foundation.GenesisState{
   187  				Params:     foundation.DefaultParams(),
   188  				Foundation: foundation.DefaultFoundation(),
   189  				Pool: foundation.Pool{
   190  					Treasury: sdk.NewDecCoins(sdk.NewDecCoin(sdk.DefaultBondDenom, sdk.OneInt())),
   191  				},
   192  			},
   193  			valid: true,
   194  			export: &foundation.GenesisState{
   195  				Params:     foundation.DefaultParams(),
   196  				Foundation: foundation.DefaultFoundation(),
   197  				Pool: foundation.Pool{
   198  					Treasury: sdk.NewDecCoins(sdk.NewDecCoin(sdk.DefaultBondDenom, sdk.OneInt())),
   199  				},
   200  			},
   201  		},
   202  		"member of long metadata": {
   203  			init: &foundation.GenesisState{
   204  				Params: foundation.DefaultParams(),
   205  				Foundation: *foundation.FoundationInfo{
   206  					Version:     1,
   207  					TotalWeight: sdk.OneDec(),
   208  				}.WithDecisionPolicy(workingPolicy()),
   209  				Members: []foundation.Member{
   210  					{
   211  						Address:  member.String(),
   212  						Metadata: string(make([]rune, 256)),
   213  					},
   214  				},
   215  			},
   216  		},
   217  		"proposal of long metadata": {
   218  			init: &foundation.GenesisState{
   219  				Params: foundation.DefaultParams(),
   220  				Foundation: *foundation.FoundationInfo{
   221  					Version:     1,
   222  					TotalWeight: sdk.OneDec(),
   223  				}.WithDecisionPolicy(workingPolicy()),
   224  				Members: []foundation.Member{
   225  					{
   226  						Address: member.String(),
   227  					},
   228  				},
   229  				PreviousProposalId: 1,
   230  				Proposals: []foundation.Proposal{
   231  					*foundation.Proposal{
   232  						Id:                1,
   233  						Metadata:          string(make([]rune, 256)),
   234  						Proposers:         []string{member.String()},
   235  						FoundationVersion: 1,
   236  					}.WithMsgs([]sdk.Msg{testdata.NewTestMsg()}),
   237  				},
   238  			},
   239  		},
   240  		"vote of long metadata": {
   241  			init: &foundation.GenesisState{
   242  				Params: foundation.DefaultParams(),
   243  				Foundation: *foundation.FoundationInfo{
   244  					Version:     1,
   245  					TotalWeight: sdk.OneDec(),
   246  				}.WithDecisionPolicy(workingPolicy()),
   247  				Members: []foundation.Member{
   248  					{
   249  						Address: member.String(),
   250  					},
   251  				},
   252  				PreviousProposalId: 1,
   253  				Proposals: []foundation.Proposal{
   254  					*foundation.Proposal{
   255  						Id:                1,
   256  						Proposers:         []string{member.String()},
   257  						FoundationVersion: 1,
   258  					}.WithMsgs([]sdk.Msg{testdata.NewTestMsg()}),
   259  				},
   260  				Votes: []foundation.Vote{
   261  					{
   262  						ProposalId: 1,
   263  						Voter:      member.String(),
   264  						Option:     foundation.VOTE_OPTION_YES,
   265  						Metadata:   string(make([]rune, 256)),
   266  					},
   267  				},
   268  			},
   269  		},
   270  	}
   271  
   272  	for name, tc := range testCases {
   273  		ctx, _ := ctx.CacheContext()
   274  
   275  		err := foundation.ValidateGenesis(*tc.init)
   276  		require.NoError(t, err, name)
   277  
   278  		err = keeper.InitGenesis(ctx, tc.init)
   279  		if !tc.valid {
   280  			require.Error(t, err, name)
   281  			continue
   282  		}
   283  		require.NoError(t, err, name)
   284  
   285  		actual := keeper.ExportGenesis(ctx)
   286  		require.Equal(t, tc.export, actual, name)
   287  	}
   288  }