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

     1  //go:build ignore
     2  
     3  package keeper
     4  
     5  import (
     6  	"fmt"
     7  	"testing"
     8  
     9  	token "github.com/fibonacci-chain/fbc/x/token/types"
    10  
    11  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    12  	"github.com/fibonacci-chain/fbc/x/dex"
    13  	"github.com/fibonacci-chain/fbc/x/order/types"
    14  	"github.com/stretchr/testify/require"
    15  )
    16  
    17  func TestModuleAccountInvariant(t *testing.T) {
    18  	testInput := CreateTestInput(t)
    19  	keeper := testInput.OrderKeeper
    20  	ctx := testInput.Ctx.WithBlockHeight(10)
    21  	invariant := ModuleAccountInvariant(keeper)
    22  
    23  	tokenPair := dex.GetBuiltInTokenPair()
    24  	err := testInput.DexKeeper.SaveTokenPair(ctx, tokenPair)
    25  	require.NoError(t, err)
    26  
    27  	order1 := mockOrder("", types.TestTokenPair, types.BuyOrder, "10.0", "1.0")
    28  	order1.Sender = testInput.TestAddrs[0]
    29  	err = keeper.PlaceOrder(ctx, order1)
    30  	require.NoError(t, err)
    31  
    32  	msg, broken := invariant(ctx)
    33  	require.False(t, broken)
    34  	expectedLockCoins := order1.NeedLockCoins().Add2(GetOrderNewFee(order1))
    35  	require.Equal(t, invariantMsg(expectedLockCoins), msg)
    36  
    37  	order2 := mockOrder("", types.TestTokenPair, types.SellOrder, "20.0", "3.0")
    38  	order2.Sender = testInput.TestAddrs[0]
    39  	err = keeper.PlaceOrder(ctx, order2)
    40  	require.False(t, broken)
    41  	require.NoError(t, err)
    42  
    43  	msg, broken = invariant(ctx)
    44  	require.False(t, broken)
    45  	expectedLockCoins = expectedLockCoins.Add2(order2.NeedLockCoins()).Add2(GetOrderNewFee(order2))
    46  	require.Equal(t, invariantMsg(expectedLockCoins), msg)
    47  
    48  	// cancel order
    49  	ctx.SetBlockHeight(11)
    50  	keeper.CancelOrder(ctx, order1, ctx.Logger())
    51  
    52  	msg, broken = invariant(ctx)
    53  	require.False(t, broken)
    54  	expectedLockCoins = expectedLockCoins.Sub(order1.NeedLockCoins()).Sub(GetOrderNewFee(order1))
    55  	require.Equal(t, invariantMsg(expectedLockCoins), msg)
    56  
    57  	// expire order
    58  	ctx.SetBlockHeight(12)
    59  	keeper.ExpireOrder(ctx, order2, ctx.Logger())
    60  
    61  	msg, broken = invariant(ctx)
    62  	require.False(t, broken)
    63  	expectedLockCoins = expectedLockCoins.Sub(order2.NeedLockCoins()).Sub(GetOrderNewFee(order2))
    64  	require.Equal(t, invariantMsg(expectedLockCoins), msg)
    65  
    66  	// lock LockCoinsTypeQuantity
    67  	lockCoins := sdk.MustParseCoins(sdk.DefaultBondDenom, "1")
    68  	err = keeper.tokenKeeper.LockCoins(ctx, testInput.TestAddrs[1], lockCoins, token.LockCoinsTypeQuantity)
    69  	require.NoError(t, err)
    70  	msg, broken = invariant(ctx)
    71  	require.False(t, broken)
    72  	expectedLockCoins = expectedLockCoins.Add2(lockCoins)
    73  	require.Equal(t, invariantMsg(expectedLockCoins), msg)
    74  
    75  	// error case: lock LockCoinsTypeFee
    76  	err = keeper.tokenKeeper.LockCoins(ctx, testInput.TestAddrs[1], expectedLockCoins, token.LockCoinsTypeFee)
    77  	require.NoError(t, err)
    78  	_, broken = invariant(ctx)
    79  	require.True(t, broken)
    80  
    81  	err = keeper.tokenKeeper.UnlockCoins(ctx, testInput.TestAddrs[1], expectedLockCoins, token.LockCoinsTypeFee)
    82  	require.NoError(t, err)
    83  	msg, broken = invariant(ctx)
    84  	require.False(t, broken)
    85  	require.Equal(t, invariantMsg(expectedLockCoins), msg)
    86  
    87  	// error case
    88  	err = keeper.supplyKeeper.SendCoinsFromAccountToModule(ctx, testInput.TestAddrs[1], token.ModuleName, sdk.MustParseCoins(sdk.DefaultBondDenom, "11.11"))
    89  	require.NoError(t, err)
    90  	_, broken = invariant(ctx)
    91  	require.True(t, broken)
    92  }
    93  
    94  func invariantMsg(lockCoins sdk.SysCoins) string {
    95  	return sdk.FormatInvariant(types.ModuleName, "locks",
    96  		fmt.Sprintf("\ttoken ModuleAccount coins: %s\n\tsum of locks amounts:  %s\n",
    97  			lockCoins, lockCoins))
    98  }