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

     1  //go:build ignore
     2  
     3  package keeper
     4  
     5  import (
     6  	"testing"
     7  
     8  	"github.com/fibonacci-chain/fbc/x/dex"
     9  
    10  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    11  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth"
    12  	"github.com/stretchr/testify/require"
    13  
    14  	"github.com/fibonacci-chain/fbc/x/common"
    15  	"github.com/fibonacci-chain/fbc/x/order/types"
    16  	token "github.com/fibonacci-chain/fbc/x/token/types"
    17  )
    18  
    19  func TestTryPlaceOrder(t *testing.T) {
    20  	testInput := CreateTestInputWithBalance(t, 1, 10)
    21  	keeper := testInput.OrderKeeper
    22  	ctx := testInput.Ctx
    23  
    24  	tokenPair := dex.GetBuiltInTokenPair()
    25  	err := testInput.DexKeeper.SaveTokenPair(ctx, tokenPair)
    26  	require.Nil(t, err)
    27  	// mock order
    28  	order := mockOrder("", types.TestTokenPair, types.BuyOrder, "1.0", "10.1")
    29  	order.Sender = testInput.TestAddrs[0]
    30  
    31  	// not enough balance
    32  	_, err = keeper.TryPlaceOrder(ctx, order)
    33  	require.Error(t, err)
    34  
    35  	// test new order fee
    36  	//feeParams.NewOrder = sdk.MustNewDecFromStr("0.01")
    37  	order.Quantity = sdk.MustNewDecFromStr("9.0")
    38  	fee, err := keeper.TryPlaceOrder(ctx, order)
    39  	require.Nil(t, err)
    40  
    41  	order.RecordOrderNewFee(fee)
    42  	require.Equal(t, "0.259200000000000000"+common.NativeToken, order.GetExtraInfoWithKey(types.OrderExtraInfoKeyNewFee))
    43  
    44  	order = mockOrder("", types.TestTokenPair, types.BuyOrder, "1.0", "9")
    45  	order.Sender = testInput.TestAddrs[0]
    46  	_, err = keeper.TryPlaceOrder(ctx, order)
    47  	keeper.UnlockCoins(ctx, testInput.TestAddrs[0], sdk.SysCoins{{Denom: common.NativeToken, Amount: sdk.MustNewDecFromStr("9")}}, token.LockCoinsTypeQuantity)
    48  	require.Error(t, err)
    49  }
    50  
    51  func TestPlaceOrderAndCancelOrder(t *testing.T) {
    52  	testInput := CreateTestInput(t)
    53  	keeper := testInput.OrderKeeper
    54  	ctx := testInput.Ctx.WithBlockHeight(10)
    55  
    56  	tokenPair := dex.GetBuiltInTokenPair()
    57  	err := testInput.DexKeeper.SaveTokenPair(ctx, tokenPair)
    58  	require.Nil(t, err)
    59  
    60  	order := mockOrder("", types.TestTokenPair, types.BuyOrder, "10.0", "1.0")
    61  	order.Sender = testInput.TestAddrs[0]
    62  	err = keeper.PlaceOrder(ctx, order)
    63  	require.Nil(t, err)
    64  
    65  	// check result & order
    66  	require.EqualValues(t, types.FormatOrderID(10, 1), order.OrderID)
    67  	require.EqualValues(t, 1, keeper.GetBlockOrderNum(ctx, 10))
    68  	// check account balance
    69  	acc := testInput.AccountKeeper.GetAccount(ctx, testInput.TestAddrs[0])
    70  	expectCoins := sdk.SysCoins{
    71  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.MustNewDecFromStr("89.7408")),
    72  		sdk.NewDecCoinFromDec(common.TestToken, sdk.MustNewDecFromStr("100")),
    73  	}
    74  	require.EqualValues(t, expectCoins.String(), acc.GetCoins().String())
    75  	// check depth book
    76  	depthBook := keeper.GetDepthBookCopy(order.Product)
    77  	require.Equal(t, 1, len(depthBook.Items))
    78  	require.Equal(t, sdk.MustNewDecFromStr("10.0"), depthBook.Items[0].Price)
    79  	require.Equal(t, sdk.MustNewDecFromStr("1.0"), depthBook.Items[0].BuyQuantity)
    80  	require.Equal(t, 1, len(keeper.GetDiskCache().GetUpdatedDepthbookKeys()))
    81  	// check order ids map
    82  	orderIDsMap := keeper.GetDiskCache().GetOrderIDsMapCopy()
    83  	require.Equal(t, 1, len(orderIDsMap.Data))
    84  	require.Equal(t, types.FormatOrderID(10, 1),
    85  		orderIDsMap.Data[types.FormatOrderIDsKey(order.Product, order.Price, order.Side)][0])
    86  	require.Equal(t, 1, len(keeper.GetDiskCache().GetUpdatedOrderIDKeys()))
    87  	// other check
    88  	require.EqualValues(t, 1, keeper.diskCache.openNum)
    89  	require.EqualValues(t, 1, keeper.diskCache.storeOrderNum)
    90  
    91  	// Test cancel order
    92  	ctx.SetBlockHeight(11)
    93  	fee := keeper.CancelOrder(ctx, order, ctx.Logger())
    94  	// check result
    95  	require.Equal(t, "0.000001000000000000"+common.NativeToken, fee.String())
    96  	// check order status
    97  	require.EqualValues(t, types.OrderStatusCancelled, order.Status)
    98  	require.Equal(t, "", order.GetExtraInfoWithKey(types.OrderExtraInfoKeyCancelFee))
    99  	// check account balance
   100  	acc = testInput.AccountKeeper.GetAccount(ctx, testInput.TestAddrs[0])
   101  	expectCoins = sdk.SysCoins{
   102  		// 100 - 0.002
   103  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.MustNewDecFromStr("99.999999")),
   104  		sdk.NewDecCoinFromDec(common.TestToken, sdk.MustNewDecFromStr("100")),
   105  	}
   106  	require.EqualValues(t, expectCoins.String(), acc.GetCoins().String())
   107  	// check fee pool
   108  	feeCollector := testInput.SupplyKeeper.GetModuleAccount(ctx, auth.FeeCollectorName)
   109  	collectedFees := feeCollector.GetCoins()
   110  	require.EqualValues(t, "0.000001000000000000"+common.NativeToken, collectedFees.String())
   111  	// check depth book
   112  	depthBook = keeper.GetDepthBookCopy(types.TestTokenPair)
   113  	require.EqualValues(t, 0, len(depthBook.Items))
   114  	require.Equal(t, 1, len(keeper.GetDiskCache().GetUpdatedDepthbookKeys()))
   115  	// check order ids
   116  	key := types.FormatOrderIDsKey(types.TestTokenPair, sdk.MustNewDecFromStr("9.8"), types.BuyOrder)
   117  	orderIDs := keeper.GetProductPriceOrderIDs(key)
   118  	require.EqualValues(t, 0, len(orderIDs))
   119  	require.Equal(t, 1, len(keeper.GetDiskCache().GetUpdatedOrderIDKeys()))
   120  	// check updated order ids
   121  	updatedOrderIDs := keeper.GetUpdatedOrderIDs()
   122  	require.EqualValues(t, order.OrderID, updatedOrderIDs[0])
   123  	// check closed order id
   124  	closedOrderIDs := keeper.GetDiskCache().GetClosedOrderIDs()
   125  	require.Equal(t, 1, len(closedOrderIDs))
   126  	require.Equal(t, order.OrderID, closedOrderIDs[0])
   127  	// other check
   128  	require.EqualValues(t, 0, keeper.diskCache.openNum)
   129  	require.EqualValues(t, 1, keeper.cache.cancelNum)
   130  }
   131  
   132  func TestPlaceOrderAndExpireOrder(t *testing.T) {
   133  	testInput := CreateTestInput(t)
   134  	keeper := testInput.OrderKeeper
   135  	ctx := testInput.Ctx.WithBlockHeight(10)
   136  
   137  	tokenPair := dex.GetBuiltInTokenPair()
   138  	err := testInput.DexKeeper.SaveTokenPair(ctx, tokenPair)
   139  	require.Nil(t, err)
   140  
   141  	order := mockOrder("", types.TestTokenPair, types.BuyOrder, "10.0", "1.0")
   142  	order.Sender = testInput.TestAddrs[0]
   143  	err = keeper.PlaceOrder(ctx, order)
   144  	require.Nil(t, err)
   145  
   146  	// check result & order
   147  	require.EqualValues(t, types.FormatOrderID(10, 1), order.OrderID)
   148  	require.EqualValues(t, 1, keeper.GetBlockOrderNum(ctx, 10))
   149  	// check account balance
   150  	acc := testInput.AccountKeeper.GetAccount(ctx, testInput.TestAddrs[0])
   151  	expectCoins := sdk.SysCoins{
   152  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.MustNewDecFromStr("89.7408")),
   153  		sdk.NewDecCoinFromDec(common.TestToken, sdk.MustNewDecFromStr("100")),
   154  	}
   155  	require.EqualValues(t, expectCoins.String(), acc.GetCoins().String())
   156  	// check depth book
   157  	depthBook := keeper.GetDepthBookCopy(order.Product)
   158  	require.Equal(t, 1, len(depthBook.Items))
   159  	require.Equal(t, sdk.MustNewDecFromStr("10.0"), depthBook.Items[0].Price)
   160  	require.Equal(t, sdk.MustNewDecFromStr("1.0"), depthBook.Items[0].BuyQuantity)
   161  	require.Equal(t, 1, len(keeper.GetDiskCache().GetUpdatedDepthbookKeys()))
   162  	// check order ids map
   163  	orderIDsMap := keeper.GetDiskCache().GetOrderIDsMapCopy()
   164  	require.Equal(t, 1, len(orderIDsMap.Data))
   165  	require.Equal(t, types.FormatOrderID(10, 1),
   166  		orderIDsMap.Data[types.FormatOrderIDsKey(order.Product, order.Price, order.Side)][0])
   167  	require.Equal(t, 1, len(keeper.GetDiskCache().GetUpdatedOrderIDKeys()))
   168  	// other check
   169  	require.EqualValues(t, 1, keeper.diskCache.openNum)
   170  	require.EqualValues(t, 1, keeper.diskCache.storeOrderNum)
   171  
   172  	// Test expire order
   173  	ctx.SetBlockHeight(11)
   174  	keeper.ExpireOrder(ctx, order, ctx.Logger())
   175  	// check order status
   176  	require.EqualValues(t, types.OrderStatusExpired, order.Status)
   177  	require.Equal(t, "", order.GetExtraInfoWithKey(types.OrderExtraInfoKeyExpireFee))
   178  	// check account balance
   179  	acc = testInput.AccountKeeper.GetAccount(ctx, testInput.TestAddrs[0])
   180  	expectCoins = sdk.SysCoins{
   181  		// 100 - 0.002
   182  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.MustNewDecFromStr("99.999999")),
   183  		sdk.NewDecCoinFromDec(common.TestToken, sdk.MustNewDecFromStr("100")),
   184  	}
   185  	require.EqualValues(t, expectCoins.String(), acc.GetCoins().String())
   186  	// check fee pool
   187  	feeCollector := testInput.SupplyKeeper.GetModuleAccount(ctx, auth.FeeCollectorName)
   188  	collectedFees := feeCollector.GetCoins()
   189  	require.EqualValues(t, "0.000001000000000000"+common.NativeToken, collectedFees.String())
   190  	// check depth book
   191  	depthBook = keeper.GetDepthBookCopy(types.TestTokenPair)
   192  	require.EqualValues(t, 0, len(depthBook.Items))
   193  	require.Equal(t, 1, len(keeper.GetDiskCache().GetUpdatedDepthbookKeys()))
   194  	// check order ids
   195  	key := types.FormatOrderIDsKey(types.TestTokenPair, sdk.MustNewDecFromStr("9.8"), types.BuyOrder)
   196  	orderIDs := keeper.GetProductPriceOrderIDs(key)
   197  	require.EqualValues(t, 0, len(orderIDs))
   198  	require.Equal(t, 1, len(keeper.GetDiskCache().GetUpdatedOrderIDKeys()))
   199  	// check updated order ids
   200  	updatedOrderIDs := keeper.GetUpdatedOrderIDs()
   201  	require.EqualValues(t, order.OrderID, updatedOrderIDs[0])
   202  	// check closed order id
   203  	keeper.Cache2Disk(ctx)
   204  	closedOrderIDs := keeper.GetLastClosedOrderIDs(ctx)
   205  	require.Equal(t, 1, len(closedOrderIDs))
   206  	require.Equal(t, order.OrderID, closedOrderIDs[0])
   207  	// other check
   208  	require.EqualValues(t, 0, keeper.diskCache.openNum)
   209  	require.EqualValues(t, 1, keeper.cache.expireNum)
   210  }