@@ -3,6 +3,7 @@ package bitget
3
3
import (
4
4
"context"
5
5
"encoding/json"
6
+ "fmt"
6
7
"io"
7
8
"math"
8
9
"net/http"
@@ -1073,3 +1074,189 @@ func TestExchange_SubmitOrder(t *testing.T) {
1073
1074
assert .ErrorContains (err , "not supported" )
1074
1075
})
1075
1076
}
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