Skip to content

Commit 71b8665

Browse files
committed
pkg/exchange: add more tests for query open orders
1 parent 8066104 commit 71b8665

File tree

1 file changed

+187
-0
lines changed

1 file changed

+187
-0
lines changed

pkg/exchange/bitget/exchange_test.go

+187
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package bitget
33
import (
44
"context"
55
"encoding/json"
6+
"fmt"
67
"io"
78
"math"
89
"net/http"
@@ -1073,3 +1074,189 @@ func TestExchange_SubmitOrder(t *testing.T) {
10731074
assert.ErrorContains(err, "not supported")
10741075
})
10751076
}
1077+
1078+
func TestExchange_QueryOpenOrders(t *testing.T) {
1079+
var (
1080+
assert = assert.New(t)
1081+
ex = New("key", "secret", "passphrase")
1082+
expBtcSymbol = "BTCUSDT"
1083+
url = "/api/v2/spot/trade/unfilled-orders"
1084+
)
1085+
1086+
t.Run("succeeds", func(t *testing.T) {
1087+
transport := &httptesting.MockTransport{}
1088+
ex.client.HttpClient.Transport = transport
1089+
1090+
f, err := os.ReadFile("bitgetapi/v2/testdata/get_unfilled_orders_request_limit_order.json")
1091+
assert.NoError(err)
1092+
1093+
transport.GET(url, func(req *http.Request) (*http.Response, error) {
1094+
query := req.URL.Query()
1095+
assert.Len(query, 2)
1096+
assert.Contains(query, "symbol")
1097+
assert.Equal(query["symbol"], []string{expBtcSymbol})
1098+
assert.Equal(query["limit"], []string{strconv.FormatInt(queryLimit, 10)})
1099+
return httptesting.BuildResponseString(http.StatusOK, string(f)), nil
1100+
})
1101+
1102+
orders, err := ex.QueryOpenOrders(context.Background(), expBtcSymbol)
1103+
assert.NoError(err)
1104+
expOrder := []types.Order{
1105+
{
1106+
SubmitOrder: types.SubmitOrder{
1107+
ClientOrderID: "684a79df-f931-474f-a9a5-f1deab1cd770",
1108+
Symbol: expBtcSymbol,
1109+
Side: types.SideTypeBuy,
1110+
Type: types.OrderTypeLimit,
1111+
Quantity: fixedpoint.MustNewFromString("0.00009"),
1112+
Price: fixedpoint.MustNewFromString("66000"),
1113+
TimeInForce: types.TimeInForceGTC,
1114+
},
1115+
Exchange: types.ExchangeBitget,
1116+
OrderID: 1148903850645331968,
1117+
UUID: "1148903850645331968",
1118+
Status: types.OrderStatusNew,
1119+
ExecutedQuantity: fixedpoint.Zero,
1120+
IsWorking: true,
1121+
CreationTime: types.Time(types.NewMillisecondTimestampFromInt(1709645944272).Time()),
1122+
UpdateTime: types.Time(types.NewMillisecondTimestampFromInt(1709645944272).Time()),
1123+
},
1124+
}
1125+
assert.Equal(expOrder, orders)
1126+
})
1127+
1128+
t.Run("succeeds on pagination with mock limit + 1", func(t *testing.T) {
1129+
transport := &httptesting.MockTransport{}
1130+
ex.client.HttpClient.Transport = transport
1131+
1132+
dataTemplate := `{
1133+
"userId":"8672173294",
1134+
"symbol":"BTCUSDT",
1135+
"orderId":"%d",
1136+
"clientOid":"684a79df-f931-474f-a9a5-f1deab1cd770",
1137+
"priceAvg":"0",
1138+
"size":"0.00009",
1139+
"orderType":"market",
1140+
"side":"sell",
1141+
"status":"live",
1142+
"basePrice":"0",
1143+
"baseVolume":"0",
1144+
"quoteVolume":"0",
1145+
"enterPointSource":"API",
1146+
"orderSource":"market",
1147+
"cTime":"1709645944272",
1148+
"uTime":"1709645944272"
1149+
}`
1150+
1151+
openOrdersStr := make([]string, 0, queryLimit+1)
1152+
expOrders := make([]types.Order, 0, queryLimit+1)
1153+
for i := 0; i < queryLimit+1; i++ {
1154+
dataStr := fmt.Sprintf(dataTemplate, i)
1155+
openOrdersStr = append(openOrdersStr, dataStr)
1156+
1157+
unfilledOdr := &v2.UnfilledOrder{}
1158+
err := json.Unmarshal([]byte(dataStr), &unfilledOdr)
1159+
assert.NoError(err)
1160+
gOdr, err := unfilledOrderToGlobalOrder(*unfilledOdr)
1161+
assert.NoError(err)
1162+
expOrders = append(expOrders, *gOdr)
1163+
}
1164+
1165+
transport.GET(url, func(req *http.Request) (*http.Response, error) {
1166+
query := req.URL.Query()
1167+
assert.Contains(query, "symbol")
1168+
assert.Equal(query["symbol"], []string{expBtcSymbol})
1169+
assert.Equal(query["limit"], []string{strconv.FormatInt(queryLimit, 10)})
1170+
if len(query) == 2 {
1171+
// first time query
1172+
resp := &v2.APIResponse{
1173+
Code: "00000",
1174+
Data: []byte("[" + strings.Join(openOrdersStr[0:queryLimit], ",") + "]"),
1175+
}
1176+
respRaw, err := json.Marshal(resp)
1177+
assert.NoError(err)
1178+
1179+
return httptesting.BuildResponseString(http.StatusOK, string(respRaw)), nil
1180+
}
1181+
// second time query
1182+
// last order id, so need to -1
1183+
assert.Equal(query["idLessThan"], []string{strconv.FormatInt(queryLimit-1, 10)})
1184+
1185+
resp := &v2.APIResponse{
1186+
Code: "00000",
1187+
Data: []byte("[" + strings.Join(openOrdersStr[queryLimit:queryLimit+1], ",") + "]"),
1188+
}
1189+
respRaw, err := json.Marshal(resp)
1190+
assert.NoError(err)
1191+
return httptesting.BuildResponseString(http.StatusOK, string(respRaw)), nil
1192+
})
1193+
1194+
orders, err := ex.QueryOpenOrders(context.Background(), expBtcSymbol)
1195+
assert.NoError(err)
1196+
assert.Equal(expOrders, orders)
1197+
})
1198+
1199+
t.Run("succeeds on pagination with mock limit + 1", func(t *testing.T) {
1200+
transport := &httptesting.MockTransport{}
1201+
ex.client.HttpClient.Transport = transport
1202+
1203+
dataTemplate := `{
1204+
"userId":"8672173294",
1205+
"symbol":"BTCUSDT",
1206+
"orderId":"%d",
1207+
"clientOid":"684a79df-f931-474f-a9a5-f1deab1cd770",
1208+
"priceAvg":"0",
1209+
"size":"0.00009",
1210+
"orderType":"market",
1211+
"side":"sell",
1212+
"status":"live",
1213+
"basePrice":"0",
1214+
"baseVolume":"0",
1215+
"quoteVolume":"0",
1216+
"enterPointSource":"API",
1217+
"orderSource":"market",
1218+
"cTime":"1709645944272",
1219+
"uTime":"1709645944272"
1220+
}`
1221+
1222+
openOrdersStr := make([]string, 0, queryLimit+1)
1223+
for i := 0; i < queryLimit+1; i++ {
1224+
dataStr := fmt.Sprintf(dataTemplate, i)
1225+
openOrdersStr = append(openOrdersStr, dataStr)
1226+
}
1227+
1228+
transport.GET(url, func(req *http.Request) (*http.Response, error) {
1229+
query := req.URL.Query()
1230+
assert.Contains(query, "symbol")
1231+
assert.Equal(query["symbol"], []string{expBtcSymbol})
1232+
assert.Equal(query["limit"], []string{strconv.FormatInt(queryLimit, 10)})
1233+
// first time query
1234+
resp := &v2.APIResponse{
1235+
Code: "00000",
1236+
Data: []byte("[" + strings.Join(openOrdersStr, ",") + "]"),
1237+
}
1238+
respRaw, err := json.Marshal(resp)
1239+
assert.NoError(err)
1240+
1241+
return httptesting.BuildResponseString(http.StatusOK, string(respRaw)), nil
1242+
})
1243+
1244+
_, err := ex.QueryOpenOrders(context.Background(), expBtcSymbol)
1245+
assert.ErrorContains(err, "unexpected open orders length")
1246+
})
1247+
1248+
t.Run("error", func(t *testing.T) {
1249+
transport := &httptesting.MockTransport{}
1250+
ex.client.HttpClient.Transport = transport
1251+
1252+
f, err := os.ReadFile("bitgetapi/v2/testdata/request_error.json")
1253+
assert.NoError(err)
1254+
1255+
transport.GET(url, func(req *http.Request) (*http.Response, error) {
1256+
return httptesting.BuildResponseString(http.StatusBadRequest, string(f)), nil
1257+
})
1258+
1259+
_, err = ex.QueryOpenOrders(context.Background(), "BTCUSDT")
1260+
assert.ErrorContains(err, "Invalid IP")
1261+
})
1262+
}

0 commit comments

Comments
 (0)