forked from ccxt/go-binance
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathexchange_info_service_test.go
251 lines (235 loc) · 8.29 KB
/
exchange_info_service_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
package eoptions
import (
"testing"
"github.com/stretchr/testify/suite"
)
type exchangeInfoServiceTestSuite struct {
baseTestSuite
}
func TestExchangeInfoService(t *testing.T) {
suite.Run(t, new(exchangeInfoServiceTestSuite))
}
func (s *exchangeInfoServiceTestSuite) TestExchangeInfo() {
data := []byte(`{
"timezone": "UTC",
"serverTime": 1592387337630,
"optionContracts": [
{
"id": 1,
"baseAsset": "BTC",
"quoteAsset": "USDT",
"underlying": "BTCUSDT",
"settleAsset": "USDT"
}
],
"optionAssets": [
{
"id": 1,
"name": "USDT"
}
],
"optionSymbols": [
{
"contractId": 2,
"expiryDate": 1660521600000,
"filters": [
{
"filterType": "PRICE_FILTER",
"minPrice": "0.02",
"maxPrice": "80000.01",
"tickSize": "0.01"
},
{
"filterType": "LOT_SIZE",
"minQty": "0.01",
"maxQty": "100",
"stepSize": "0.01"
}
],
"id": 17,
"symbol": "BTC-220815-50000-C",
"side": "CALL",
"strikePrice": "50000",
"underlying": "BTCUSDT",
"unit": 1,
"makerFeeRate": "0.0002",
"takerFeeRate": "0.0002",
"minQty": "0.01",
"maxQty": "100",
"initialMargin": "0.15",
"maintenanceMargin": "0.075",
"minInitialMargin": "0.1",
"minMaintenanceMargin": "0.05",
"priceScale": 2,
"quantityScale": 2,
"quoteAsset": "USDT"
}
],
"rateLimits": [
{
"rateLimitType": "REQUEST_WEIGHT",
"interval": "MINUTE",
"intervalNum": 1,
"limit": 2400
},
{
"rateLimitType": "ORDERS",
"interval": "MINUTE",
"intervalNum": 1,
"limit": 1200
},
{
"rateLimitType": "ORDERS",
"interval": "SECOND",
"intervalNum": 10,
"limit": 300
}
]
}
`)
s.mockDo(data, nil)
defer s.assertDo()
s.assertReq(func(r *request) {
e := newRequest()
s.assertRequestEqual(e, r)
})
res, err := s.client.NewExchangeInfoService().Do(newContext())
s.r().NoError(err)
ei := &ExchangeInfo{
Timezone: "UTC",
ServerTime: 1592387337630,
OptionContracts: []OptionContract{
{
Id: 1,
BaseAsset: "BTC",
QuoteAsset: "USDT",
Underlying: "BTCUSDT",
SettleAsset: "USDT",
},
},
OptionAssets: []OptionAsset{
{
Id: 1,
Name: "USDT",
},
},
OptionSymbols: []OptionSymbol{
{
ContractId: 2,
ExpiryDate: 1660521600000,
Filters: []map[string]interface{}{
{"filterType": "PRICE_FILTER", "minPrice": "0.02", "maxPrice": "80000.01", "tickSize": "0.01"},
{"filterType": "LOT_SIZE", "minQty": "0.01", "maxQty": "100", "stepSize": "0.01"},
},
Id: 17,
Symbol: "BTC-220815-50000-C",
Side: "CALL",
StrikePrice: "50000",
Underlying: "BTCUSDT",
Unit: 1,
MakerFeeRate: "0.0002",
TakerFeeRate: "0.0002",
MinQty: "0.01",
MaxQty: "100",
InitialMargin: "0.15",
MaintenanceMargin: "0.075",
MinInitialMargin: "0.1",
MinMaintenanceMargin: "0.05",
PriceScale: 2,
QuantityScale: 2,
QuoteAsset: "USDT",
},
},
RateLimits: []RateLimit{
{RateLimitType: "REQUEST_WEIGHT", Interval: "MINUTE", IntervalNum: 1, Limit: 2400},
{RateLimitType: "ORDERS", Interval: "MINUTE", IntervalNum: 1, Limit: 1200},
{RateLimitType: "ORDERS", Interval: "SECOND", IntervalNum: 10, Limit: 300},
},
}
s.assertExchangeInfoEqual(ei, res)
s.r().Len(ei.OptionSymbols[0].Filters, 2, "Filters")
ePriceFilter := &PriceFilter{
MinPrice: "0.02",
MaxPrice: "80000.01",
TickSize: "0.01",
}
s.assertPriceFilterEqual(ePriceFilter, res.OptionSymbols[0].PriceFilter())
eLotSizeFilter := &LotSizeFilter{
MinQuantity: "0.01",
MaxQuantity: "100",
StepSize: "0.01",
}
s.assertLotSizeFilterEqual(eLotSizeFilter, res.OptionSymbols[0].LotSizeFilter())
}
func (s *exchangeInfoServiceTestSuite) assertExchangeInfoEqual(e, a *ExchangeInfo) {
r := s.r()
r.Equal(e.Timezone, a.Timezone, "Timezone")
r.Equal(e.ServerTime, a.ServerTime, "ServerTime")
r.Len(a.OptionContracts, len(e.OptionContracts), "OptionContracts")
for i := range a.OptionContracts {
r.Equal(e.OptionContracts[i].Id, a.OptionContracts[i].Id, "Id")
r.Equal(e.OptionContracts[i].BaseAsset, a.OptionContracts[i].BaseAsset, "BaseAsset")
r.Equal(e.OptionContracts[i].QuoteAsset, a.OptionContracts[i].QuoteAsset, "QuoteAsset")
r.Equal(e.OptionContracts[i].Underlying, a.OptionContracts[i].Underlying, "Underlying")
r.Equal(e.OptionContracts[i].SettleAsset, a.OptionContracts[i].SettleAsset, "SettleAsset")
}
r.Len(a.OptionAssets, len(e.OptionAssets), "OptionAssets")
for i := range a.OptionAssets {
r.Equal(e.OptionAssets[i].Id, a.OptionAssets[i].Id, "Id")
r.Equal(e.OptionAssets[i].Name, a.OptionAssets[i].Name, "Name")
}
r.Len(a.OptionSymbols, len(e.OptionSymbols), "Symbols")
for i := range a.OptionSymbols {
r.Equal(e.OptionSymbols[i].ContractId, a.OptionSymbols[i].ContractId, "ContractId")
r.Equal(e.OptionSymbols[i].ExpiryDate, a.OptionSymbols[i].ExpiryDate, "ExpiryDate")
r.Equal(e.OptionSymbols[i].Id, a.OptionSymbols[i].Id, "Id")
r.Equal(e.OptionSymbols[i].Symbol, a.OptionSymbols[i].Symbol, "Symbol")
r.Equal(e.OptionSymbols[i].Side, a.OptionSymbols[i].Side, "Side")
r.Equal(e.OptionSymbols[i].StrikePrice, a.OptionSymbols[i].StrikePrice, "StrikePrice")
r.Equal(e.OptionSymbols[i].Underlying, a.OptionSymbols[i].Underlying, "Underlying")
r.Equal(e.OptionSymbols[i].Unit, a.OptionSymbols[i].Unit, "Unit")
r.Equal(e.OptionSymbols[i].MakerFeeRate, a.OptionSymbols[i].MakerFeeRate, "MakerFeeRate")
r.Equal(e.OptionSymbols[i].TakerFeeRate, a.OptionSymbols[i].TakerFeeRate, "TakerFeeRate")
r.Equal(e.OptionSymbols[i].MinQty, a.OptionSymbols[i].MinQty, "MinQty")
r.Equal(e.OptionSymbols[i].MaxQty, a.OptionSymbols[i].MaxQty, "MaxQty")
r.Equal(e.OptionSymbols[i].InitialMargin, a.OptionSymbols[i].InitialMargin, "InitialMargin")
r.Equal(e.OptionSymbols[i].MaintenanceMargin, a.OptionSymbols[i].MaintenanceMargin, "MaintenanceMargin")
r.Equal(e.OptionSymbols[i].MinInitialMargin, a.OptionSymbols[i].MinInitialMargin, "MinInitialMargin")
r.Equal(e.OptionSymbols[i].MinMaintenanceMargin, a.OptionSymbols[i].MinMaintenanceMargin, "MinMaintenanceMargin")
r.Equal(e.OptionSymbols[i].PriceScale, a.OptionSymbols[i].PriceScale, "PriceScale")
r.Equal(e.OptionSymbols[i].QuantityScale, a.OptionSymbols[i].QuantityScale, "QuantityScale")
r.Equal(e.OptionSymbols[i].QuoteAsset, a.OptionSymbols[i].QuoteAsset, "QuoteAsset")
for fi, currentFilter := range a.OptionSymbols[i].Filters {
r.Len(currentFilter, len(e.OptionSymbols[i].Filters[fi]))
switch currentFilter["filterType"] {
case "PRICE_FILTER":
r.Equal(e.OptionSymbols[i].PriceFilter().MinPrice, a.OptionSymbols[i].PriceFilter().MinPrice, "MinPrice")
r.Equal(e.OptionSymbols[i].PriceFilter().MaxPrice, a.OptionSymbols[i].PriceFilter().MaxPrice, "MaxPrice")
r.Equal(e.OptionSymbols[i].PriceFilter().TickSize, a.OptionSymbols[i].PriceFilter().TickSize, "TickSize")
case "LOT_SIZE":
r.Equal(e.OptionSymbols[i].LotSizeFilter().MinQuantity, a.OptionSymbols[i].LotSizeFilter().MinQuantity, "MinQuantity")
r.Equal(e.OptionSymbols[i].LotSizeFilter().MaxQuantity, a.OptionSymbols[i].LotSizeFilter().MaxQuantity, "MaxQuantity")
r.Equal(e.OptionSymbols[i].LotSizeFilter().StepSize, a.OptionSymbols[i].LotSizeFilter().StepSize, "StepSize")
}
}
}
r.Len(a.RateLimits, len(e.RateLimits), "RateLimits")
for i := range a.RateLimits {
r.Equal(e.RateLimits[i].RateLimitType, a.RateLimits[i].RateLimitType, "RateLimitType")
r.Equal(e.RateLimits[i].Limit, a.RateLimits[i].Limit, "Limit")
r.Equal(e.RateLimits[i].Interval, a.RateLimits[i].Interval, "Interval")
r.Equal(e.RateLimits[i].IntervalNum, a.RateLimits[i].IntervalNum, "IntervalNum")
}
}
func (s *exchangeInfoServiceTestSuite) assertLotSizeFilterEqual(e, a *LotSizeFilter) {
r := s.r()
r.Equal(e.MaxQuantity, a.MaxQuantity, "MaxQuantity")
r.Equal(e.MinQuantity, a.MinQuantity, "MinQuantity")
r.Equal(e.StepSize, a.StepSize, "StepSize")
}
func (s *exchangeInfoServiceTestSuite) assertPriceFilterEqual(e, a *PriceFilter) {
r := s.r()
r.Equal(e.MaxPrice, a.MaxPrice, "MaxPrice")
r.Equal(e.MinPrice, a.MinPrice, "MinPrice")
r.Equal(e.TickSize, a.TickSize, "TickSize")
}