github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/ammswap/keeper/querier_test.go (about)

     1  //go:build ignore
     2  
     3  package keeper
     4  
     5  import (
     6  	"encoding/json"
     7  	"testing"
     8  
     9  	"github.com/fibonacci-chain/fbc/x/common"
    10  
    11  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/mock"
    12  
    13  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    14  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/supply"
    15  	abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types"
    16  	"github.com/fibonacci-chain/fbc/x/ammswap/types"
    17  	"github.com/stretchr/testify/require"
    18  )
    19  
    20  func initQurierTest(t *testing.T) (*TestInput, mock.AddrKeysSlice, sdk.Context, Keeper, sdk.Querier) {
    21  	mapp, addrSlice := GetTestInput(t, 1)
    22  	mapp.BeginBlock(abci.RequestBeginBlock{Header: abci.Header{Height: 2}})
    23  	ctx := mapp.BaseApp.NewContext(false, abci.Header{}).WithBlockHeight(10)
    24  	mapp.supplyKeeper.SetSupply(ctx, supply.NewSupply(mapp.TotalCoinsSupply))
    25  	keeper := mapp.swapKeeper
    26  	keeper.SetParams(ctx, types.DefaultParams())
    27  	return mapp, addrSlice, ctx, keeper, NewQuerier(mapp.swapKeeper)
    28  }
    29  
    30  func TestNewQuerier(t *testing.T) {
    31  	_, _, ctx, keeper, querier := initQurierTest(t)
    32  
    33  	// querier with wrong path
    34  	path0 := []string{"any", types.TestBasePooledToken}
    35  	queryTokenPair, err := querier(ctx, path0, abci.RequestQuery{})
    36  	require.NotNil(t, err)
    37  	require.Nil(t, queryTokenPair)
    38  
    39  	// add new token pair and query
    40  	path := []string{types.QuerySwapTokenPair, types.TestSwapTokenPairName}
    41  	swapTokenPair := types.GetTestSwapTokenPair()
    42  	keeper.SetSwapTokenPair(ctx, types.TestSwapTokenPairName, swapTokenPair)
    43  	queryTokenPair, err = querier(ctx, path, abci.RequestQuery{})
    44  	require.Nil(t, err)
    45  	require.NotNil(t, queryTokenPair)
    46  	var response common.BaseResponse
    47  	jsonErr := json.Unmarshal(queryTokenPair, &response)
    48  	require.Nil(t, jsonErr)
    49  	require.NotNil(t, response.Data)
    50  
    51  	// delete token pair and query
    52  	keeper.DeleteSwapTokenPair(ctx, types.TestSwapTokenPairName)
    53  	queryTokenPair, err = querier(ctx, path, abci.RequestQuery{})
    54  	require.Nil(t, err)
    55  	require.NotNil(t, queryTokenPair)
    56  	jsonErr = json.Unmarshal(queryTokenPair, &response)
    57  	require.Nil(t, jsonErr)
    58  	require.Nil(t, response.Data)
    59  
    60  }
    61  
    62  func TestQueryParams(t *testing.T) {
    63  	_, _, ctx, keeper, querier := initQurierTest(t)
    64  
    65  	path0 := []string{types.QueryParams}
    66  	resultBytes, err := querier(ctx, path0, abci.RequestQuery{})
    67  	require.Nil(t, err)
    68  	result := types.Params{}
    69  	keeper.cdc.MustUnmarshalJSON(resultBytes, &result)
    70  	require.Equal(t, types.DefaultParams(), result)
    71  }
    72  
    73  func TestQuerySwapTokenPairs(t *testing.T) {
    74  	_, _, ctx, keeper, querier := initQurierTest(t)
    75  
    76  	tokenPair := types.TestSwapTokenPairName
    77  	swapTokenPair := types.GetTestSwapTokenPair()
    78  	keeper.SetSwapTokenPair(ctx, tokenPair, swapTokenPair)
    79  
    80  	path := []string{types.QuerySwapTokenPairs}
    81  	resultBytes, err := querier(ctx, path, abci.RequestQuery{})
    82  	require.Nil(t, err)
    83  	var result []types.SwapTokenPair
    84  	keeper.cdc.MustUnmarshalJSON(resultBytes, &result)
    85  	expectedSwapTokenPairList := []types.SwapTokenPair{swapTokenPair}
    86  	require.Equal(t, expectedSwapTokenPairList, result)
    87  }
    88  
    89  func initTestPool(t *testing.T, addrList mock.AddrKeysSlice, mapp *TestInput,
    90  	ctx sdk.Context, keeper Keeper, baseTokenAmount, quoteTokenAmount sdk.DecCoin, poolTokenAmount sdk.Dec) types.SwapTokenPair {
    91  	swapTokenPair := types.SwapTokenPair{
    92  		QuotePooledCoin: quoteTokenAmount,
    93  		BasePooledCoin:  baseTokenAmount,
    94  		PoolTokenName:   types.GetPoolTokenName(baseTokenAmount.Denom, quoteTokenAmount.Denom),
    95  	}
    96  	keeper.SetSwapTokenPair(ctx, types.GetSwapTokenPairName(baseTokenAmount.Denom, quoteTokenAmount.Denom), swapTokenPair)
    97  	poolToken := types.InitPoolToken(swapTokenPair.PoolTokenName)
    98  	initPoolTokenAmount := sdk.NewDecCoinFromDec(swapTokenPair.PoolTokenName, poolTokenAmount)
    99  	mapp.tokenKeeper.NewToken(ctx, poolToken)
   100  	err := keeper.MintPoolCoinsToUser(ctx, sdk.DecCoins{initPoolTokenAmount}, addrList[0].Address)
   101  	require.Nil(t, err)
   102  	return swapTokenPair
   103  }
   104  
   105  func TestQueryRedeemableAssets(t *testing.T) {
   106  	mapp, addrList, ctx, keeper, querier := initQurierTest(t)
   107  
   108  	baseTokenAmount := sdk.NewDecCoinFromDec(types.TestBasePooledToken, sdk.NewDec(100))
   109  	quoteTokenAmount := sdk.NewDecCoinFromDec(types.TestQuotePooledToken, sdk.NewDec(100))
   110  	poolTokenAmount := sdk.NewDec(1)
   111  	swapTokenPair := initTestPool(t, addrList, mapp, ctx, keeper, baseTokenAmount, quoteTokenAmount, poolTokenAmount)
   112  
   113  	path := []string{types.QueryRedeemableAssets, swapTokenPair.TokenPairName(), poolTokenAmount.String()}
   114  	resultBytes, err := querier(ctx, path, abci.RequestQuery{})
   115  	require.Nil(t, err)
   116  	var result []sdk.SysCoin
   117  	keeper.cdc.MustUnmarshalJSON(resultBytes, &result)
   118  	expectedAmountList := []sdk.SysCoin{swapTokenPair.BasePooledCoin, swapTokenPair.QuotePooledCoin}
   119  	require.Equal(t, expectedAmountList, result)
   120  }
   121  
   122  func TestQueryBuyAmount(t *testing.T) {
   123  	mapp, addrList, ctx, keeper, querier := initQurierTest(t)
   124  
   125  	baseTokenAmount := sdk.NewDecCoinFromDec(types.TestBasePooledToken, sdk.NewDec(100))
   126  	quoteTokenAmount := sdk.NewDecCoinFromDec(types.TestQuotePooledToken, sdk.NewDec(100))
   127  	poolTokenAmount := sdk.NewDec(1)
   128  	swapTokenPair := initTestPool(t, addrList, mapp, ctx, keeper, baseTokenAmount, quoteTokenAmount, poolTokenAmount)
   129  
   130  	path := []string{types.QueryBuyAmount}
   131  	var queryParams types.QueryBuyAmountParams
   132  	queryParams.SoldToken = swapTokenPair.QuotePooledCoin
   133  	queryParams.TokenToBuy = swapTokenPair.BasePooledCoin.Denom
   134  	requestBytes := keeper.cdc.MustMarshalJSON(queryParams)
   135  	resultBytes, err := querier(ctx, path, abci.RequestQuery{Data: requestBytes})
   136  	require.Nil(t, err)
   137  	var result string
   138  	keeper.cdc.MustUnmarshalJSON(resultBytes, &result)
   139  	expectedToken := "49.924887330996494742"
   140  	require.Equal(t, expectedToken, result)
   141  
   142  	baseTokenAmount2 := sdk.NewDecCoinFromDec(types.TestBasePooledToken2, sdk.NewDec(100))
   143  	quoteTokenAmount2 := sdk.NewDecCoinFromDec(types.TestQuotePooledToken, sdk.NewDec(100))
   144  	poolTokenAmount2 := sdk.NewDec(1)
   145  	swapTokenPair2 := initTestPool(t, addrList, mapp, ctx, keeper, baseTokenAmount2, quoteTokenAmount2, poolTokenAmount2)
   146  
   147  	queryParams.SoldToken = swapTokenPair2.BasePooledCoin
   148  	queryParams.TokenToBuy = swapTokenPair.BasePooledCoin.Denom
   149  	requestBytes = keeper.cdc.MustMarshalJSON(queryParams)
   150  	resultBytes, err = querier(ctx, path, abci.RequestQuery{Data: requestBytes})
   151  	require.Nil(t, err)
   152  	keeper.cdc.MustUnmarshalJSON(resultBytes, &result)
   153  	expectedToken = "33.233233333634235135"
   154  	require.Equal(t, expectedToken, result)
   155  }