github.com/Finschia/finschia-sdk@v0.48.1/x/bank/handler_test.go (about)

     1  package bank_test
     2  
     3  import (
     4  	"strings"
     5  	"testing"
     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  	sdkerrors "github.com/Finschia/finschia-sdk/types/errors"
    15  	authtypes "github.com/Finschia/finschia-sdk/x/auth/types"
    16  	"github.com/Finschia/finschia-sdk/x/bank"
    17  	bankkeeper "github.com/Finschia/finschia-sdk/x/bank/keeper"
    18  	"github.com/Finschia/finschia-sdk/x/bank/types"
    19  	stakingtypes "github.com/Finschia/finschia-sdk/x/staking/types"
    20  )
    21  
    22  func TestInvalidMsg(t *testing.T) {
    23  	h := bank.NewHandler(nil)
    24  
    25  	res, err := h(sdk.NewContext(nil, tmproto.Header{}, false, nil), testdata.NewTestMsg())
    26  	require.Error(t, err)
    27  	require.Nil(t, res)
    28  
    29  	_, _, log := sdkerrors.ABCIInfo(err, false)
    30  	require.True(t, strings.Contains(log, "unrecognized bank message type"))
    31  }
    32  
    33  // A module account cannot be the recipient of bank sends unless it has been marked as such
    34  func TestSendToModuleAccount(t *testing.T) {
    35  	priv1 := secp256k1.GenPrivKey()
    36  	addr1 := sdk.AccAddress(priv1.PubKey().Address())
    37  	moduleAccAddr := authtypes.NewModuleAddress(stakingtypes.BondedPoolName)
    38  	coins := sdk.Coins{sdk.NewInt64Coin("foocoin", 10)}
    39  
    40  	tests := []struct {
    41  		name          string
    42  		expectedError error
    43  		msg           *types.MsgSend
    44  	}{
    45  		{
    46  			name:          "not allowed module account",
    47  			msg:           types.NewMsgSend(addr1, moduleAccAddr, coins),
    48  			expectedError: sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, "%s is not allowed to receive funds", moduleAccAddr),
    49  		},
    50  		{
    51  			name:          "allowed module account",
    52  			msg:           types.NewMsgSend(addr1, authtypes.NewModuleAddress(stakingtypes.ModuleName), coins),
    53  			expectedError: nil,
    54  		},
    55  	}
    56  
    57  	acc1 := &authtypes.BaseAccount{
    58  		Address: addr1.String(),
    59  	}
    60  	accs := authtypes.GenesisAccounts{acc1}
    61  	balances := []types.Balance{
    62  		{
    63  			Address: addr1.String(),
    64  			Coins:   coins,
    65  		},
    66  	}
    67  
    68  	app := simapp.SetupWithGenesisAccounts(accs, balances...)
    69  	ctx := app.BaseApp.NewContext(false, tmproto.Header{})
    70  
    71  	app.BankKeeper = bankkeeper.NewBaseKeeper(
    72  		app.AppCodec(), app.GetKey(types.StoreKey), app.AccountKeeper, app.GetSubspace(types.ModuleName), map[string]bool{
    73  			moduleAccAddr.String(): true,
    74  		},
    75  	)
    76  	handler := bank.NewHandler(app.BankKeeper)
    77  
    78  	for _, tc := range tests {
    79  		t.Run(tc.name, func(t *testing.T) {
    80  			_, err := handler(ctx, tc.msg)
    81  			if tc.expectedError != nil {
    82  				require.EqualError(t, err, tc.expectedError.Error())
    83  			} else {
    84  				require.NoError(t, err)
    85  			}
    86  		})
    87  	}
    88  }