github.com/Finschia/finschia-sdk@v0.48.1/x/foundation/keeper/internal/proposal_test.go (about) 1 package internal_test 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/require" 7 tmproto "github.com/tendermint/tendermint/proto/tendermint/types" 8 9 "github.com/Finschia/finschia-sdk/crypto/keys/secp256k1" 10 "github.com/Finschia/finschia-sdk/simapp" 11 "github.com/Finschia/finschia-sdk/testutil/testdata" 12 sdk "github.com/Finschia/finschia-sdk/types" 13 authtypes "github.com/Finschia/finschia-sdk/x/auth/types" 14 "github.com/Finschia/finschia-sdk/x/foundation" 15 "github.com/Finschia/finschia-sdk/x/foundation/keeper/internal" 16 ) 17 18 func (s *KeeperTestSuite) TestSubmitProposal() { 19 testCases := map[string]struct { 20 proposers []string 21 metadata string 22 msg sdk.Msg 23 valid bool 24 }{ 25 "valid proposal": { 26 proposers: []string{s.members[0].String()}, 27 msg: testdata.NewTestMsg(s.authority), 28 valid: true, 29 }, 30 "long metadata": { 31 proposers: []string{s.members[0].String()}, 32 metadata: string(make([]rune, 256)), 33 msg: testdata.NewTestMsg(s.authority), 34 }, 35 "unauthorized msg": { 36 proposers: []string{s.members[0].String()}, 37 msg: testdata.NewTestMsg(s.stranger), 38 }, 39 } 40 41 for name, tc := range testCases { 42 s.Run(name, func() { 43 ctx, _ := s.ctx.CacheContext() 44 45 _, err := s.impl.SubmitProposal(ctx, tc.proposers, tc.metadata, []sdk.Msg{tc.msg}) 46 if tc.valid { 47 s.Require().NoError(err) 48 } else { 49 s.Require().Error(err) 50 } 51 }) 52 } 53 } 54 55 func (s *KeeperTestSuite) TestWithdrawProposal() { 56 testCases := map[string]struct { 57 id uint64 58 valid bool 59 }{ 60 "valid proposal": { 61 id: s.activeProposal, 62 valid: true, 63 }, 64 "no such a proposal": { 65 id: s.nextProposal, 66 }, 67 "not active": { 68 id: s.withdrawnProposal, 69 }, 70 } 71 72 for name, tc := range testCases { 73 s.Run(name, func() { 74 ctx, _ := s.ctx.CacheContext() 75 76 err := s.impl.WithdrawProposal(ctx, tc.id) 77 if tc.valid { 78 s.Require().NoError(err) 79 } else { 80 s.Require().Error(err) 81 } 82 }) 83 } 84 } 85 86 func TestAbortProposal(t *testing.T) { 87 checkTx := false 88 app := simapp.Setup(checkTx) 89 testdata.RegisterInterfaces(app.InterfaceRegistry()) 90 91 ctx := app.BaseApp.NewContext(checkTx, tmproto.Header{}) 92 impl := internal.NewKeeper( 93 app.AppCodec(), 94 app.GetKey(foundation.ModuleName), 95 app.MsgServiceRouter(), 96 app.AccountKeeper, 97 app.BankKeeper, 98 authtypes.FeeCollectorName, 99 foundation.DefaultConfig(), 100 foundation.DefaultAuthority().String(), 101 app.GetSubspace(foundation.ModuleName), 102 ) 103 104 createAddress := func() sdk.AccAddress { 105 return sdk.AccAddress(secp256k1.GenPrivKey().PubKey().Address()) 106 } 107 108 authority := sdk.MustAccAddressFromBech32(impl.GetAuthority()) 109 110 members := make([]sdk.AccAddress, 10) 111 for i := range members { 112 members[i] = createAddress() 113 } 114 impl.SetMember(ctx, foundation.Member{ 115 Address: members[0].String(), 116 }) 117 118 info := foundation.DefaultFoundation() 119 info.TotalWeight = sdk.NewDec(int64(len(members))) 120 err := info.SetDecisionPolicy(workingPolicy()) 121 require.NoError(t, err) 122 impl.SetFoundationInfo(ctx, info) 123 124 // create proposals of different versions and abort them 125 for _, newMember := range members[1:] { 126 _, err := impl.SubmitProposal(ctx, []string{members[0].String()}, "", []sdk.Msg{testdata.NewTestMsg(authority)}) 127 require.NoError(t, err) 128 129 err = impl.UpdateMembers(ctx, []foundation.MemberRequest{ 130 { 131 Address: newMember.String(), 132 }, 133 }) 134 require.NoError(t, err) 135 } 136 137 for _, proposal := range impl.GetProposals(ctx) { 138 require.Equal(t, foundation.PROPOSAL_STATUS_ABORTED, proposal.Status) 139 } 140 }