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  }