github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/order/app_test.go (about)

     1  //go:build ignore
     2  
     3  package order
     4  
     5  import (
     6  	"fmt"
     7  	"testing"
     8  
     9  	"github.com/fibonacci-chain/fbc/x/common/monitor"
    10  
    11  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
    12  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    13  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth"
    14  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/bank"
    15  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/mock"
    16  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/supply"
    17  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/supply/exported"
    18  	abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types"
    19  	"github.com/fibonacci-chain/fbc/libs/tendermint/crypto/secp256k1"
    20  	"github.com/fibonacci-chain/fbc/x/staking/types"
    21  	"github.com/stretchr/testify/require"
    22  
    23  	"github.com/fibonacci-chain/fbc/x/common"
    24  	"github.com/fibonacci-chain/fbc/x/dex"
    25  	"github.com/fibonacci-chain/fbc/x/token"
    26  )
    27  
    28  type MockApp struct {
    29  	*mock.App
    30  
    31  	keyOrder     *sdk.KVStoreKey
    32  	keyToken     *sdk.KVStoreKey
    33  	keyLock      *sdk.KVStoreKey
    34  	keyDex       *sdk.KVStoreKey
    35  	keyTokenPair *sdk.KVStoreKey
    36  
    37  	keySupply *sdk.KVStoreKey
    38  
    39  	bankKeeper   bank.Keeper
    40  	orderKeeper  Keeper
    41  	tokenKeeper  token.Keeper
    42  	supplyKeeper supply.Keeper
    43  	dexKeeper    dex.Keeper
    44  }
    45  
    46  func registerCodec(cdc *codec.Codec) {
    47  	RegisterCodec(cdc)
    48  	token.RegisterCodec(cdc)
    49  	supply.RegisterCodec(cdc)
    50  }
    51  
    52  func getMockApp(t *testing.T, numGenAccs int) (mockApp *MockApp, addrKeysSlice mock.AddrKeysSlice) {
    53  	return getMockAppWithBalance(t, numGenAccs, 100)
    54  }
    55  
    56  // initialize the mock application for this module
    57  func getMockAppWithBalance(t *testing.T, numGenAccs int, balance int64) (mockApp *MockApp,
    58  	addrKeysSlice mock.AddrKeysSlice) {
    59  	mapp := mock.NewApp()
    60  	registerCodec(mapp.Cdc.GetCdc())
    61  
    62  	mockApp = &MockApp{
    63  		App:      mapp,
    64  		keyOrder: sdk.NewKVStoreKey(OrderStoreKey),
    65  
    66  		keyToken:     sdk.NewKVStoreKey(token.StoreKey),
    67  		keyLock:      sdk.NewKVStoreKey(token.KeyLock),
    68  		keyDex:       sdk.NewKVStoreKey(dex.StoreKey),
    69  		keyTokenPair: sdk.NewKVStoreKey(dex.TokenPairStoreKey),
    70  
    71  		keySupply: sdk.NewKVStoreKey(supply.StoreKey),
    72  	}
    73  
    74  	feeCollector := supply.NewEmptyModuleAccount(auth.FeeCollectorName)
    75  	blacklistedAddrs := make(map[string]bool)
    76  	blacklistedAddrs[feeCollector.String()] = true
    77  
    78  	mockApp.bankKeeper = bank.NewBaseKeeper(mockApp.AccountKeeper,
    79  		mockApp.ParamsKeeper.Subspace(bank.DefaultParamspace),
    80  		blacklistedAddrs)
    81  
    82  	maccPerms := map[string][]string{
    83  		auth.FeeCollectorName: nil,
    84  		token.ModuleName:      {supply.Minter, supply.Burner},
    85  	}
    86  	mockApp.supplyKeeper = supply.NewKeeper(mockApp.Cdc.GetCdc(), mockApp.keySupply, mockApp.AccountKeeper,
    87  		mockApp.bankKeeper, maccPerms)
    88  
    89  	mockApp.tokenKeeper = token.NewKeeper(
    90  		mockApp.bankKeeper,
    91  		mockApp.ParamsKeeper.Subspace(token.DefaultParamspace),
    92  		auth.FeeCollectorName,
    93  		mockApp.supplyKeeper,
    94  		mockApp.keyToken,
    95  		mockApp.keyLock,
    96  		mockApp.Cdc.GetCdc(),
    97  		true, mockApp.AccountKeeper)
    98  
    99  	mockApp.dexKeeper = dex.NewKeeper(
   100  		auth.FeeCollectorName,
   101  		mockApp.supplyKeeper,
   102  		mockApp.ParamsKeeper.Subspace(dex.DefaultParamspace),
   103  		mockApp.tokenKeeper,
   104  		nil,
   105  		mockApp.bankKeeper,
   106  		mockApp.keyDex,
   107  		mockApp.keyTokenPair,
   108  		mockApp.Cdc.GetCdc())
   109  
   110  	mockApp.orderKeeper = NewKeeper(
   111  		mockApp.tokenKeeper,
   112  		mockApp.supplyKeeper,
   113  		mockApp.dexKeeper,
   114  		mockApp.ParamsKeeper.Subspace(DefaultParamspace),
   115  		auth.FeeCollectorName,
   116  		mockApp.keyOrder,
   117  		mockApp.Cdc.GetCdc(),
   118  		true,
   119  		monitor.NopOrderMetrics())
   120  
   121  	mockApp.Router().AddRoute(RouterKey, NewOrderHandler(mockApp.orderKeeper))
   122  	mockApp.QueryRouter().AddRoute(QuerierRoute, NewQuerier(mockApp.orderKeeper))
   123  
   124  	mockApp.SetBeginBlocker(getBeginBlocker(mockApp.orderKeeper))
   125  	mockApp.SetEndBlocker(getEndBlocker(mockApp.orderKeeper))
   126  	mockApp.SetInitChainer(getInitChainer(mockApp.App, mockApp.supplyKeeper,
   127  		[]exported.ModuleAccountI{feeCollector}))
   128  
   129  	decCoins, err := sdk.ParseDecCoins(fmt.Sprintf("%d%s,%d%s",
   130  		balance, common.NativeToken, balance, common.TestToken))
   131  	require.Nil(t, err)
   132  	coins := decCoins
   133  
   134  	keysSlice, genAccs := CreateGenAccounts(numGenAccs, coins)
   135  	addrKeysSlice = keysSlice
   136  
   137  	// todo: checkTx in mock app
   138  	mockApp.SetAnteHandler(nil)
   139  
   140  	app := mockApp
   141  	require.NoError(t, app.CompleteSetup(
   142  		app.keyOrder,
   143  		app.keyToken,
   144  		app.keyDex,
   145  		app.keyTokenPair,
   146  		app.keyLock,
   147  		app.keySupply,
   148  	))
   149  	mock.SetGenesis(mockApp.App, genAccs)
   150  
   151  	for i := 0; i < numGenAccs; i++ {
   152  		mock.CheckBalance(t, app.App, keysSlice[i].Address, coins)
   153  		mockApp.TotalCoinsSupply = mockApp.TotalCoinsSupply.Add2(coins)
   154  	}
   155  
   156  	return mockApp, addrKeysSlice
   157  }
   158  
   159  func getBeginBlocker(keeper Keeper) sdk.BeginBlocker {
   160  	return func(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock {
   161  		BeginBlocker(ctx, keeper)
   162  		return abci.ResponseBeginBlock{}
   163  	}
   164  }
   165  
   166  func getEndBlocker(keeper Keeper) sdk.EndBlocker {
   167  	return func(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock {
   168  		EndBlocker(ctx, keeper)
   169  		return abci.ResponseEndBlock{}
   170  	}
   171  }
   172  
   173  func getInitChainer(mapp *mock.App, supplyKeeper types.SupplyKeeper,
   174  	blacklistedAddrs []exported.ModuleAccountI) sdk.InitChainer {
   175  	return func(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain {
   176  		mapp.InitChainer(ctx, req)
   177  		// set module accounts
   178  		for _, macc := range blacklistedAddrs {
   179  			supplyKeeper.SetModuleAccount(ctx, macc)
   180  		}
   181  		return abci.ResponseInitChain{}
   182  	}
   183  }
   184  
   185  //func produceOrderTxs(app *MockApp, ctx sdk.Context, numToGenerate int, addrKeys mock.AddrKeys,
   186  //	orderMsg *MsgNewOrder) []auth.StdTx {
   187  //	txs := make([]auth.StdTx, numToGenerate)
   188  //	orderMsg.Sender = addrKeys.Address
   189  //	for i := 0; i < numToGenerate; i++ {
   190  //		txs[i] = buildTx(app, ctx, addrKeys, *orderMsg)
   191  //	}
   192  //	return txs
   193  //}
   194  
   195  //func buildTx(app *MockApp, ctx sdk.Context, addrKeys mock.AddrKeys, msg sdk.Msg) auth.StdTx {
   196  //	accs := app.AccountKeeper.GetAccount(ctx, addrKeys.Address)
   197  //	accNum := accs.GetAccountNumber()
   198  //	seqNum := accs.GetSequence()
   199  //
   200  //	tx := mock.GenTx(
   201  //		[]sdk.Msg{msg}, []uint64{uint64(accNum)}, []uint64{uint64(seqNum)}, addrKeys.PrivKey)
   202  //	res := app.Check(tx)
   203  //	if !res.IsOK() {
   204  //		panic(fmt.Sprintf("something wrong in checking transaction: %v", res))
   205  //	}
   206  //	return tx
   207  //}
   208  //
   209  //func mockApplyBlock(app *MockApp, blockHeight int64, txs []auth.StdTx) {
   210  //	app.BeginBlock(abci.RequestBeginBlock{Header: abci.Header{Height: blockHeight}})
   211  //
   212  //	newCtx := app.NewContext(false, abci.Header{})
   213  //	param := DefaultTestParams()
   214  //	app.orderKeeper.SetParams(newCtx, &param)
   215  //	for _, tx := range txs {
   216  //		app.Deliver(tx)
   217  //	}
   218  //
   219  //	app.EndBlock(abci.RequestEndBlock{Height: blockHeight})
   220  //	app.Commit()
   221  //}
   222  
   223  func CreateGenAccounts(numAccs int, genCoins sdk.Coins) (addrKeysSlice mock.AddrKeysSlice,
   224  	genAccs []auth.Account) {
   225  	for i := 0; i < numAccs; i++ {
   226  		privKey := secp256k1.GenPrivKey()
   227  		pubKey := privKey.PubKey()
   228  		addr := sdk.AccAddress(pubKey.Address())
   229  
   230  		addrKeys := mock.NewAddrKeys(addr, pubKey, privKey)
   231  		account := &auth.BaseAccount{
   232  			Address: addr,
   233  			Coins:   genCoins,
   234  		}
   235  		genAccs = append(genAccs, account)
   236  		addrKeysSlice = append(addrKeysSlice, addrKeys)
   237  	}
   238  	return
   239  }