github.com/Finschia/finschia-sdk@v0.48.1/x/token/keeper/keeper_test.go (about)

     1  package keeper_test
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/suite"
     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  	sdk "github.com/Finschia/finschia-sdk/types"
    13  	"github.com/Finschia/finschia-sdk/x/token"
    14  	"github.com/Finschia/finschia-sdk/x/token/keeper"
    15  )
    16  
    17  type KeeperTestSuite struct {
    18  	suite.Suite
    19  
    20  	ctx         sdk.Context
    21  	goCtx       context.Context
    22  	keeper      keeper.Keeper
    23  	queryServer token.QueryServer
    24  	msgServer   token.MsgServer
    25  
    26  	vendor   sdk.AccAddress
    27  	operator sdk.AccAddress
    28  	customer sdk.AccAddress
    29  	stranger sdk.AccAddress
    30  
    31  	contractID           string
    32  	unmintableContractId string
    33  
    34  	balance sdk.Int
    35  }
    36  
    37  func (s *KeeperTestSuite) createRandomAccounts(accNum int) []sdk.AccAddress {
    38  	seenAddresses := make(map[string]bool, accNum)
    39  	addresses := make([]sdk.AccAddress, accNum)
    40  	for i := range addresses {
    41  		var address sdk.AccAddress
    42  		for {
    43  			pk := secp256k1.GenPrivKey().PubKey()
    44  			address = sdk.AccAddress(pk.Address())
    45  			if !seenAddresses[address.String()] {
    46  				seenAddresses[address.String()] = true
    47  				break
    48  			}
    49  		}
    50  		addresses[i] = address
    51  	}
    52  	return addresses
    53  }
    54  
    55  func (s *KeeperTestSuite) SetupTest() {
    56  	checkTx := false
    57  	app := simapp.Setup(checkTx)
    58  	s.ctx = app.BaseApp.NewContext(checkTx, tmproto.Header{})
    59  	s.goCtx = sdk.WrapSDKContext(s.ctx)
    60  	s.keeper = app.TokenKeeper
    61  
    62  	s.queryServer = keeper.NewQueryServer(s.keeper)
    63  	s.msgServer = keeper.NewMsgServer(s.keeper)
    64  
    65  	addresses := []*sdk.AccAddress{
    66  		&s.vendor,
    67  		&s.operator,
    68  		&s.customer,
    69  		&s.stranger,
    70  	}
    71  	for i, address := range s.createRandomAccounts(len(addresses)) {
    72  		*addresses[i] = address
    73  	}
    74  
    75  	s.balance = sdk.NewInt(1000)
    76  
    77  	// create a mintable class
    78  	class := token.Contract{
    79  		Name:     "Mintable",
    80  		Symbol:   "OK",
    81  		Mintable: true,
    82  	}
    83  	s.contractID = s.keeper.Issue(s.ctx, class, s.vendor, s.vendor, s.balance)
    84  
    85  	err := s.keeper.Burn(s.ctx, s.contractID, s.vendor, s.balance)
    86  	s.Require().NoError(err)
    87  
    88  	// create another class for the query test
    89  	s.keeper.Issue(s.ctx, class, s.vendor, s.vendor, s.balance)
    90  
    91  	// mint to the others
    92  	for _, to := range []sdk.AccAddress{s.vendor, s.operator, s.customer} {
    93  		err := s.keeper.Mint(s.ctx, s.contractID, s.vendor, to, s.balance)
    94  		s.Require().NoError(err)
    95  	}
    96  
    97  	// grant operator
    98  	for _, permission := range []token.Permission{
    99  		token.PermissionMint,
   100  		token.PermissionBurn,
   101  	} {
   102  		s.keeper.Grant(s.ctx, s.contractID, s.vendor, s.operator, permission)
   103  	}
   104  
   105  	// authorize operator
   106  	for _, holder := range []sdk.AccAddress{s.vendor, s.customer} {
   107  		err := s.keeper.AuthorizeOperator(s.ctx, s.contractID, holder, s.operator)
   108  		s.Require().NoError(err)
   109  	}
   110  
   111  	// not token contract
   112  	notTokenContractID := app.ClassKeeper.NewID(s.ctx)
   113  	err = keeper.ValidateLegacyContract(s.keeper, s.ctx, notTokenContractID)
   114  	s.Require().ErrorIs(err, token.ErrTokenNotExist)
   115  
   116  	s.unmintableContractId = s.keeper.Issue(s.ctx, token.Contract{
   117  		Name:     "Unmintable",
   118  		Symbol:   "UMT",
   119  		Mintable: false,
   120  	}, s.vendor, s.vendor, s.balance)
   121  }
   122  
   123  func TestKeeperTestSuite(t *testing.T) {
   124  	suite.Run(t, &KeeperTestSuite{})
   125  }