decred.org/dcrdex@v1.0.5/server/db/interface_test.go (about)

     1  // This code is available on the terms of the project LICENSE.md file,
     2  // also available online at https://blueoakcouncil.org/license/1.0.0.
     3  
     4  package db
     5  
     6  import (
     7  	"encoding/hex"
     8  	"testing"
     9  
    10  	"decred.org/dcrdex/dex"
    11  	"decred.org/dcrdex/dex/order"
    12  )
    13  
    14  func TestValidateOrder(t *testing.T) {
    15  	mktInfo, err := dex.NewMarketInfoFromSymbols("dcr", "btc", LotSize, RateStep, EpochDuration, 0, MarketBuyBuffer)
    16  	if err != nil {
    17  		t.Fatalf("invalid market: %v", err)
    18  	}
    19  
    20  	AssetDCR = mktInfo.Base
    21  	AssetBTC = mktInfo.Quote
    22  
    23  	orderBadLotSize := newLimitOrder(false, 4900000, 1, order.StandingTiF, 0)
    24  	orderBadLotSize.Quantity /= 2
    25  
    26  	orderBadType := newLimitOrder(false, 4900000, 1, order.StandingTiF, 0)
    27  	orderBadType.OrderType = order.CancelOrderType // bad type
    28  
    29  	orderBadMarket := newLimitOrder(false, 4900000, 1, order.StandingTiF, 0)
    30  	orderBadMarket.BaseAsset = AssetDCR
    31  	orderBadMarket.QuoteAsset = AssetDCR // same as base
    32  
    33  	marketOrderBadType := newMarketSellOrder(1, 0)
    34  	marketOrderBadType.OrderType = order.CancelOrderType // wrong type
    35  
    36  	marketOrderBadAmt := newMarketSellOrder(1, 0)
    37  	marketOrderBadAmt.Quantity /= 2
    38  
    39  	marketOrderBadRemaining := newMarketSellOrder(1, 0)
    40  	marketOrderBadRemaining.FillAmt = marketOrderBadAmt.Quantity / 2
    41  
    42  	// order ID for a cancel order
    43  	orderID0, _ := hex.DecodeString("dd64e2ae2845d281ba55a6d46eceb9297b2bdec5c5bada78f9ae9e373164df0d")
    44  	var targetOrderID order.OrderID
    45  	copy(targetOrderID[:], orderID0)
    46  
    47  	cancelOrderBadType := newCancelOrder(targetOrderID, AssetDCR, AssetBTC, 0)
    48  	cancelOrderBadType.OrderType = order.LimitOrderType // wrong type
    49  
    50  	type args struct {
    51  		ord    order.Order
    52  		status order.OrderStatus
    53  		mkt    *dex.MarketInfo
    54  	}
    55  	tests := []struct {
    56  		name string
    57  		args args
    58  		want bool
    59  	}{
    60  		{
    61  			name: "limit booked immediate (bad)",
    62  			args: args{
    63  				ord:    newLimitOrder(false, 4900000, 1, order.ImmediateTiF, 0),
    64  				status: order.OrderStatusBooked,
    65  				mkt:    mktInfo,
    66  			},
    67  			want: false,
    68  		},
    69  		{
    70  			name: "unknown order status",
    71  			args: args{
    72  				ord:    newMarketSellOrder(1, 0),
    73  				status: order.OrderStatusUnknown,
    74  				mkt:    mktInfo,
    75  			},
    76  			want: false,
    77  		},
    78  		{
    79  			name: "bad lot size",
    80  			args: args{
    81  				ord:    orderBadLotSize,
    82  				status: order.OrderStatusEpoch,
    83  				mkt:    mktInfo,
    84  			},
    85  			want: false,
    86  		},
    87  		{
    88  			name: "bad order type",
    89  			args: args{
    90  				ord:    orderBadType,
    91  				status: order.OrderStatusEpoch,
    92  				mkt:    mktInfo,
    93  			},
    94  			want: false,
    95  		},
    96  		{
    97  			name: "bad market",
    98  			args: args{
    99  				ord:    orderBadMarket,
   100  				status: order.OrderStatusEpoch,
   101  				mkt:    mktInfo,
   102  			},
   103  			want: false,
   104  		},
   105  		{
   106  			name: "ok",
   107  			args: args{
   108  				ord:    newMarketSellOrder(1, 0),
   109  				status: order.OrderStatusEpoch,
   110  				mkt:    mktInfo,
   111  			},
   112  			want: true,
   113  		},
   114  		{
   115  			name: "market order bad status (booked)",
   116  			args: args{
   117  				ord:    newMarketSellOrder(1, 0),
   118  				status: order.OrderStatusBooked,
   119  				mkt:    mktInfo,
   120  			},
   121  			want: false,
   122  		},
   123  		{
   124  			name: "market order bad status (canceled)",
   125  			args: args{
   126  				ord:    newMarketSellOrder(1, 0),
   127  				status: order.OrderStatusCanceled,
   128  				mkt:    mktInfo,
   129  			},
   130  			want: false,
   131  		},
   132  		{
   133  			name: "market order bad type",
   134  			args: args{
   135  				ord:    marketOrderBadType,
   136  				status: order.OrderStatusEpoch,
   137  				mkt:    mktInfo,
   138  			},
   139  			want: false,
   140  		},
   141  		{
   142  			name: "market order bad amount",
   143  			args: args{
   144  				ord:    marketOrderBadAmt,
   145  				status: order.OrderStatusEpoch,
   146  				mkt:    mktInfo,
   147  			},
   148  			want: false,
   149  		},
   150  		{
   151  			name: "market order bad remaining",
   152  			args: args{
   153  				ord:    marketOrderBadRemaining,
   154  				status: order.OrderStatusEpoch,
   155  				mkt:    mktInfo,
   156  			},
   157  			want: false,
   158  		},
   159  		{
   160  			name: "cancel bad status (booked)",
   161  			args: args{
   162  				ord:    newCancelOrder(targetOrderID, AssetDCR, AssetBTC, 0),
   163  				status: order.OrderStatusBooked,
   164  				mkt:    mktInfo,
   165  			},
   166  			want: false,
   167  		},
   168  		{
   169  			name: "cancel bad status (canceled)",
   170  			args: args{
   171  				ord:    newCancelOrder(targetOrderID, AssetDCR, AssetBTC, 0),
   172  				status: order.OrderStatusBooked,
   173  				mkt:    mktInfo,
   174  			},
   175  			want: false,
   176  		},
   177  		{
   178  			name: "cancel bad status (booked)",
   179  			args: args{
   180  				ord:    newCancelOrder(targetOrderID, AssetDCR, AssetBTC, 0),
   181  				status: order.OrderStatusBooked,
   182  				mkt:    mktInfo,
   183  			},
   184  			want: false,
   185  		},
   186  		{
   187  			name: "cancel bad type (limit)",
   188  			args: args{
   189  				ord:    cancelOrderBadType,
   190  				status: order.OrderStatusEpoch,
   191  				mkt:    mktInfo,
   192  			},
   193  			want: false,
   194  		},
   195  	}
   196  	for _, tt := range tests {
   197  		t.Run(tt.name, func(t *testing.T) {
   198  			if got := ValidateOrder(tt.args.ord, tt.args.status, tt.args.mkt); got != tt.want {
   199  				t.Errorf("ValidateOrder() = %v, want %v", got, tt.want)
   200  			}
   201  		})
   202  	}
   203  }