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 }