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 }