-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstat_test.go
372 lines (335 loc) · 25.8 KB
/
stat_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
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
package moexiss
import (
"context"
"fmt"
"github.com/buger/jsonparser"
"net/http"
"net/http/httptest"
"net/url"
"testing"
)
func TestStatGetUrl(t *testing.T) {
c := NewClient(nil)
gotURL, err := c.Stats.getUrl(EngineStock, "shares", nil)
if err != nil {
t.Fatalf("Error: expecting <nil> error: \ngot %v \ninstead", err)
}
if got, expected := gotURL, `https://iss.moex.com/iss/engines/stock/markets/shares/secstats.json?iss.json=extended&iss.meta=off`; got != expected {
t.Fatalf("Error: expecting url :\n`%s` \ngot \n`%s` \ninstead", expected, got)
}
}
func TestStatGetUrlBadEngine(t *testing.T) {
c := NewClient(nil)
_, err := c.Stats.getUrl(EngineUndefined, "shares", nil)
if got, expected := err, ErrBadEngineParameter; got != expected {
t.Fatalf("Error: expecting %v error: \ngot %v \ninstead", expected, got)
}
}
func TestStatGetUrlBadMarket(t *testing.T) {
c := NewClient(nil)
_, err := c.Stats.getUrl(EngineStock, "", nil)
if got, expected := err, ErrBadMarketParameter; got != expected {
t.Fatalf("Error: expecting %v error: \ngot %v \ninstead", expected, got)
}
}
func TestParseSecStatItem(t *testing.T) {
expectedStruct := SecStat{
Ticker: "GAZP",
BoardId: "TQBR",
TrSession: TradingSessionUndefined,
Time: "09:49:58",
PriceMinusPrevPr: -22.98,
VolToday: 47948300,
ValToday: 12677905337,
HighBid: 304.75,
LowOffer: 250.92,
LastOffer: 260.29,
LastBid: 259.71,
Open: 253.95,
Low: 250.92,
High: 273.99,
Last: 260.29,
LClosePrice: 0,
NumTrades: 107517,
WaPrice: 264.41,
AdmittedQuote: 0,
MarketPrice: 0,
LCurrentPrice: 260.51,
ClosingAucPrice: 0,
}
var incomeJSON = `
{"SECID": "GAZP", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:58", "PRICEMINUSPREVWAPRICE": -22.98, "VOLTODAY": 47948300, "VALTODAY": 12677905337, "HIGHBID": 304.75, "LOWOFFER": 250.92, "LASTOFFER": 260.29, "LASTBID": 259.71, "OPEN": 253.95, "LOW": 250.92, "HIGH": 273.99, "LAST": 260.29, "LCLOSEPRICE": null, "NUMTRADES": 107517, "WAPRICE": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 260.51, "CLOSINGAUCTIONPRICE": null}
`
secStatItem := SecStat{}
err := parseSecStatItem([]byte(incomeJSON), &secStatItem)
if err != nil {
t.Fatalf("Error: expecting <nil> error: \ngot %v \ninstead", err)
}
if got, expected := secStatItem, expectedStruct; got != expected {
t.Fatalf("Error: expecting: \n %v \ngot:\n %v \ninstead", expected, got)
}
}
func TestParseSecStatItemErrCases(t *testing.T) {
type Case struct {
incomeJSON string
}
cases := []Case{
// no SECID
{`{"SECID1": "GAZP", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:58", "PRICEMINUSPREVWAPRICE": -22.98, "VOLTODAY": 47948300, "VALTODAY": 12677905337, "HIGHBID": 304.75, "LOWOFFER": 250.92, "LASTOFFER": 260.29, "LASTBID": 259.71, "OPEN": 253.95, "LOW": 250.92, "HIGH": 273.99, "LAST": 260.29, "LCLOSEPRICE": null, "NUMTRADES": 107517, "WAPRICE": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 260.51, "CLOSINGAUCTIONPRICE": null}`},
// no BOARDID
{`{"SECID": "GAZP", "BOARDID1": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:58", "PRICEMINUSPREVWAPRICE": -22.98, "VOLTODAY": 47948300, "VALTODAY": 12677905337, "HIGHBID": 304.75, "LOWOFFER": 250.92, "LASTOFFER": 260.29, "LASTBID": 259.71, "OPEN": 253.95, "LOW": 250.92, "HIGH": 273.99, "LAST": 260.29, "LCLOSEPRICE": null, "NUMTRADES": 107517, "WAPRICE": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 260.51, "CLOSINGAUCTIONPRICE": null}`},
// no TRADINGSESSION
{`{"SECID": "GAZP", "BOARDID": "TQBR", "TRADINGSESSION1": "0", "TIME": "09:49:58", "PRICEMINUSPREVWAPRICE": -22.98, "VOLTODAY": 47948300, "VALTODAY": 12677905337, "HIGHBID": 304.75, "LOWOFFER": 250.92, "LASTOFFER": 260.29, "LASTBID": 259.71, "OPEN": 253.95, "LOW": 250.92, "HIGH": 273.99, "LAST": 260.29, "LCLOSEPRICE": null, "NUMTRADES": 107517, "WAPRICE": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 260.51, "CLOSINGAUCTIONPRICE": null}`},
// no TIME
{`{"SECID": "GAZP", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME1": "09:49:58", "PRICEMINUSPREVWAPRICE": -22.98, "VOLTODAY": 47948300, "VALTODAY": 12677905337, "HIGHBID": 304.75, "LOWOFFER": 250.92, "LASTOFFER": 260.29, "LASTBID": 259.71, "OPEN": 253.95, "LOW": 250.92, "HIGH": 273.99, "LAST": 260.29, "LCLOSEPRICE": null, "NUMTRADES": 107517, "WAPRICE": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 260.51, "CLOSINGAUCTIONPRICE": null}`},
// no PRICEMINUSPREVWAPRICE
{`{"SECID": "GAZP", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:58", "PRICEMINUSPREVWAPRICE1": -22.98, "VOLTODAY": 47948300, "VALTODAY": 12677905337, "HIGHBID": 304.75, "LOWOFFER": 250.92, "LASTOFFER": 260.29, "LASTBID": 259.71, "OPEN": 253.95, "LOW": 250.92, "HIGH": 273.99, "LAST": 260.29, "LCLOSEPRICE": null, "NUMTRADES": 107517, "WAPRICE": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 260.51, "CLOSINGAUCTIONPRICE": null}`},
// no VOLTODAY
{`{"SECID": "GAZP", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:58", "PRICEMINUSPREVWAPRICE": -22.98, "VOLTODAY1": 47948300, "VALTODAY": 12677905337, "HIGHBID": 304.75, "LOWOFFER": 250.92, "LASTOFFER": 260.29, "LASTBID": 259.71, "OPEN": 253.95, "LOW": 250.92, "HIGH": 273.99, "LAST": 260.29, "LCLOSEPRICE": null, "NUMTRADES": 107517, "WAPRICE": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 260.51, "CLOSINGAUCTIONPRICE": null}`},
// no VALTODAY
{`{"SECID": "GAZP", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:58", "PRICEMINUSPREVWAPRICE": -22.98, "VOLTODAY": 47948300, "VALTODAY1": 12677905337, "HIGHBID": 304.75, "LOWOFFER": 250.92, "LASTOFFER": 260.29, "LASTBID": 259.71, "OPEN": 253.95, "LOW": 250.92, "HIGH": 273.99, "LAST": 260.29, "LCLOSEPRICE": null, "NUMTRADES": 107517, "WAPRICE": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 260.51, "CLOSINGAUCTIONPRICE": null}`},
// no HIGHBID
{`{"SECID": "GAZP", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:58", "PRICEMINUSPREVWAPRICE": -22.98, "VOLTODAY": 47948300, "VALTODAY": 12677905337, "HIGHBID1": 304.75, "LOWOFFER": 250.92, "LASTOFFER": 260.29, "LASTBID": 259.71, "OPEN": 253.95, "LOW": 250.92, "HIGH": 273.99, "LAST": 260.29, "LCLOSEPRICE": null, "NUMTRADES": 107517, "WAPRICE": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 260.51, "CLOSINGAUCTIONPRICE": null}`},
// no LOWOFFER
{`{"SECID": "GAZP", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:58", "PRICEMINUSPREVWAPRICE": -22.98, "VOLTODAY": 47948300, "VALTODAY": 12677905337, "HIGHBID": 304.75, "LOWOFFER1": 250.92, "LASTOFFER": 260.29, "LASTBID": 259.71, "OPEN": 253.95, "LOW": 250.92, "HIGH": 273.99, "LAST": 260.29, "LCLOSEPRICE": null, "NUMTRADES": 107517, "WAPRICE": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 260.51, "CLOSINGAUCTIONPRICE": null}`},
// no LASTOFFER
{`{"SECID": "GAZP", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:58", "PRICEMINUSPREVWAPRICE": -22.98, "VOLTODAY": 47948300, "VALTODAY": 12677905337, "HIGHBID": 304.75, "LOWOFFER": 250.92, "LASTOFFER1": 260.29, "LASTBID": 259.71, "OPEN": 253.95, "LOW": 250.92, "HIGH": 273.99, "LAST": 260.29, "LCLOSEPRICE": null, "NUMTRADES": 107517, "WAPRICE": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 260.51, "CLOSINGAUCTIONPRICE": null}`},
// no LASTBID
{`{"SECID": "GAZP", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:58", "PRICEMINUSPREVWAPRICE": -22.98, "VOLTODAY": 47948300, "VALTODAY": 12677905337, "HIGHBID": 304.75, "LOWOFFER": 250.92, "LASTOFFER": 260.29, "LASTBID1": 259.71, "OPEN": 253.95, "LOW": 250.92, "HIGH": 273.99, "LAST": 260.29, "LCLOSEPRICE": null, "NUMTRADES": 107517, "WAPRICE": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 260.51, "CLOSINGAUCTIONPRICE": null}`},
// no OPEN
{`{"SECID": "GAZP", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:58", "PRICEMINUSPREVWAPRICE": -22.98, "VOLTODAY": 47948300, "VALTODAY": 12677905337, "HIGHBID": 304.75, "LOWOFFER": 250.92, "LASTOFFER": 260.29, "LASTBID": 259.71, "OPEN1": 253.95, "LOW": 250.92, "HIGH": 273.99, "LAST": 260.29, "LCLOSEPRICE": null, "NUMTRADES": 107517, "WAPRICE": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 260.51, "CLOSINGAUCTIONPRICE": null}`},
// no LOW
{`{"SECID": "GAZP", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:58", "PRICEMINUSPREVWAPRICE": -22.98, "VOLTODAY": 47948300, "VALTODAY": 12677905337, "HIGHBID": 304.75, "LOWOFFER": 250.92, "LASTOFFER": 260.29, "LASTBID": 259.71, "OPEN": 253.95, "LOW1": 250.92, "HIGH": 273.99, "LAST": 260.29, "LCLOSEPRICE": null, "NUMTRADES": 107517, "WAPRICE": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 260.51, "CLOSINGAUCTIONPRICE": null}`},
// no HIGH
{`{"SECID": "GAZP", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:58", "PRICEMINUSPREVWAPRICE": -22.98, "VOLTODAY": 47948300, "VALTODAY": 12677905337, "HIGHBID": 304.75, "LOWOFFER": 250.92, "LASTOFFER": 260.29, "LASTBID": 259.71, "OPEN": 253.95, "LOW": 250.92, "HIGH1": 273.99, "LAST": 260.29, "LCLOSEPRICE": null, "NUMTRADES": 107517, "WAPRICE": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 260.51, "CLOSINGAUCTIONPRICE": null}`},
// no LAST
{`{"SECID": "GAZP", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:58", "PRICEMINUSPREVWAPRICE": -22.98, "VOLTODAY": 47948300, "VALTODAY": 12677905337, "HIGHBID": 304.75, "LOWOFFER": 250.92, "LASTOFFER": 260.29, "LASTBID": 259.71, "OPEN": 253.95, "LOW": 250.92, "HIGH": 273.99, "LAST1": 260.29, "LCLOSEPRICE": null, "NUMTRADES": 107517, "WAPRICE": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 260.51, "CLOSINGAUCTIONPRICE": null}`},
// no LCLOSEPRICE
{`{"SECID": "GAZP", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:58", "PRICEMINUSPREVWAPRICE": -22.98, "VOLTODAY": 47948300, "VALTODAY": 12677905337, "HIGHBID": 304.75, "LOWOFFER": 250.92, "LASTOFFER": 260.29, "LASTBID": 259.71, "OPEN": 253.95, "LOW": 250.92, "HIGH": 273.99, "LAST": 260.29, "LCLOSEPRICE1": null, "NUMTRADES": 107517, "WAPRICE": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 260.51, "CLOSINGAUCTIONPRICE": null}`},
// no NUMTRADES
{`{"SECID": "GAZP", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:58", "PRICEMINUSPREVWAPRICE": -22.98, "VOLTODAY": 47948300, "VALTODAY": 12677905337, "HIGHBID": 304.75, "LOWOFFER": 250.92, "LASTOFFER": 260.29, "LASTBID": 259.71, "OPEN": 253.95, "LOW": 250.92, "HIGH": 273.99, "LAST": 260.29, "LCLOSEPRICE": null, "NUMTRADES1": 107517, "WAPRICE": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 260.51, "CLOSINGAUCTIONPRICE": null}`},
// no WAPRICE
{`{"SECID": "GAZP", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:58", "PRICEMINUSPREVWAPRICE": -22.98, "VOLTODAY": 47948300, "VALTODAY": 12677905337, "HIGHBID": 304.75, "LOWOFFER": 250.92, "LASTOFFER": 260.29, "LASTBID": 259.71, "OPEN": 253.95, "LOW": 250.92, "HIGH": 273.99, "LAST": 260.29, "LCLOSEPRICE": null, "NUMTRADES": 107517, "WAPRICE1": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 260.51, "CLOSINGAUCTIONPRICE": null}`},
// no ADMITTEDQUOTE
{`{"SECID": "GAZP", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:58", "PRICEMINUSPREVWAPRICE": -22.98, "VOLTODAY": 47948300, "VALTODAY": 12677905337, "HIGHBID": 304.75, "LOWOFFER": 250.92, "LASTOFFER": 260.29, "LASTBID": 259.71, "OPEN": 253.95, "LOW": 250.92, "HIGH": 273.99, "LAST": 260.29, "LCLOSEPRICE": null, "NUMTRADES": 107517, "WAPRICE": 264.41, "ADMITTEDQUOTE1": null, "MARKETPRICE2": null, "LCURRENTPRICE": 260.51, "CLOSINGAUCTIONPRICE": null}`},
// no MARKETPRICE2
{`{"SECID": "GAZP", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:58", "PRICEMINUSPREVWAPRICE": -22.98, "VOLTODAY": 47948300, "VALTODAY": 12677905337, "HIGHBID": 304.75, "LOWOFFER": 250.92, "LASTOFFER": 260.29, "LASTBID": 259.71, "OPEN": 253.95, "LOW": 250.92, "HIGH": 273.99, "LAST": 260.29, "LCLOSEPRICE": null, "NUMTRADES": 107517, "WAPRICE": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE21": null, "LCURRENTPRICE": 260.51, "CLOSINGAUCTIONPRICE": null}`},
// no LCURRENTPRICE
{`{"SECID": "GAZP", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:58", "PRICEMINUSPREVWAPRICE": -22.98, "VOLTODAY": 47948300, "VALTODAY": 12677905337, "HIGHBID": 304.75, "LOWOFFER": 250.92, "LASTOFFER": 260.29, "LASTBID": 259.71, "OPEN": 253.95, "LOW": 250.92, "HIGH": 273.99, "LAST": 260.29, "LCLOSEPRICE": null, "NUMTRADES": 107517, "WAPRICE": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE1": 260.51, "CLOSINGAUCTIONPRICE": null}`},
// no CLOSINGAUCTIONPRICE
{`{"SECID": "GAZP", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:58", "PRICEMINUSPREVWAPRICE": -22.98, "VOLTODAY": 47948300, "VALTODAY": 12677905337, "HIGHBID": 304.75, "LOWOFFER": 250.92, "LASTOFFER": 260.29, "LASTBID": 259.71, "OPEN": 253.95, "LOW": 250.92, "HIGH": 273.99, "LAST": 260.29, "LCLOSEPRICE": null, "NUMTRADES": 107517, "WAPRICE": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 260.51, "CLOSINGAUCTIONPRICE1": null}`},
}
for i, c := range cases {
secStat := SecStat{}
if got, expected := parseSecStatItem([]byte(c.incomeJSON), &secStat), jsonparser.KeyPathNotFoundError; got != expected {
t.Fatalf("Error: expecting error: \n %v \ngot:\n %v \ninstead in %d case", expected, got, i)
}
}
}
func TestParseSecStat(t *testing.T) {
var incomeJSON = `
[
{"SECID": "DSKY", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:55", "PRICEMINUSPREVWAPRICE": -7.12, "VOLTODAY": 1681450, "VALTODAY": 155748831, "HIGHBID": 114.32, "LOWOFFER": 85.88, "LASTOFFER": 92.58, "LASTBID": 92.52, "OPEN": 92, "LOW": 87.22, "HIGH": 96.16, "LAST": 92.54, "LCLOSEPRICE": null, "NUMTRADES": 10500, "WAPRICE": 92.62, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 92.8, "CLOSINGAUCTIONPRICE": null},
{"SECID": "GAZP", "BOARDID": "SMAL", "TRADINGSESSION": "0", "TIME": "09:40:08", "PRICEMINUSPREVWAPRICE": -23.27, "VOLTODAY": 25, "VALTODAY": 6654, "HIGHBID": 270.42, "LOWOFFER": 258.12, "LASTOFFER": 271.29, "LASTBID": 261, "OPEN": 258.12, "LOW": 258.12, "HIGH": 287.99, "LAST": 260, "LCLOSEPRICE": null, "NUMTRADES": 16, "WAPRICE": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": null, "CLOSINGAUCTIONPRICE": null},
{"SECID": "GAZP", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:58", "PRICEMINUSPREVWAPRICE": -22.98, "VOLTODAY": 47948300, "VALTODAY": 12677905337, "HIGHBID": 304.75, "LOWOFFER": 250.92, "LASTOFFER": 260.29, "LASTBID": 259.71, "OPEN": 253.95, "LOW": 250.92, "HIGH": 273.99, "LAST": 260.29, "LCLOSEPRICE": null, "NUMTRADES": 107517, "WAPRICE": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 260.51, "CLOSINGAUCTIONPRICE": null},
{"SECID": "SBERP", "BOARDID": "SMAL", "TRADINGSESSION": "0", "TIME": "09:33:40", "PRICEMINUSPREVWAPRICE": -17.24, "VOLTODAY": 38, "VALTODAY": 7321, "HIGHBID": 208.01, "LOWOFFER": 185, "LASTOFFER": 204.97, "LASTBID": 190.01, "OPEN": 190, "LOW": 185, "HIGH": 208.01, "LAST": 193, "LCLOSEPRICE": null, "NUMTRADES": 23, "WAPRICE": 193.01, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": null, "CLOSINGAUCTIONPRICE": null},
{"SECID": "SBERP", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:57", "PRICEMINUSPREVWAPRICE": -17.85, "VOLTODAY": 9160070, "VALTODAY": 1768007018, "HIGHBID": 221.66, "LOWOFFER": 175.23, "LASTOFFER": 192.47, "LASTBID": 192.27, "OPEN": 194.8, "LOW": 184, "HIGH": 199.87, "LAST": 192.39, "LCLOSEPRICE": null, "NUMTRADES": 38395, "WAPRICE": 193.01, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 190.91, "CLOSINGAUCTIONPRICE": null}]}
]
`
secSt := make([]SecStat, 0)
err := parseSecStat([]byte(incomeJSON), &secSt)
if err != nil {
t.Fatalf("Error: expecting <nil> error: \ngot %v \ninstead", err)
}
if got, expected := len(secSt), 5; got != expected {
t.Fatalf("Error: expecting: \n %v \ngot:\n %v \ninstead", expected, got)
}
}
func TestParseSecStatUnexpectedDataTypeError(t *testing.T) {
var incomeJSON = `
[
[]
]`
secSt := make([]SecStat, 0)
if got, expected := parseSecStat([]byte(incomeJSON), &secSt), ErrUnexpectedDataType; got != expected {
t.Fatalf("Error: expecting: \n %v \ngot:\n %v \ninstead", expected, got)
}
}
func TestParseSecStatError(t *testing.T) {
var incomeJSON = `
[
{"SECID": "DSKY", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:55", "PRICEMINUSPREVWAPRICE": -7.12, "VOLTODAY": 1681450, "VALTODAY": 155748831, "HIGHBID": 114.32, "LOWOFFER": 85.88, "LASTOFFER": 92.58, "LASTBID": 92.52, "OPEN": 92, "LOW": 87.22, "HIGH": 96.16, "LAST": 92.54, "LCLOSEPRICE": null, "NUMTRADES": 10500, "WAPRICE": 92.62, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 92.8, "CLOSINGAUCTIONPRICE": null},
{"SECID": "GAZP", "BOARDID1": "SMAL", "TRADINGSESSION": "0", "TIME": "09:40:08", "PRICEMINUSPREVWAPRICE": -23.27, "VOLTODAY": 25, "VALTODAY": 6654, "HIGHBID": 270.42, "LOWOFFER": 258.12, "LASTOFFER": 271.29, "LASTBID": 261, "OPEN": 258.12, "LOW": 258.12, "HIGH": 287.99, "LAST": 260, "LCLOSEPRICE": null, "NUMTRADES": 16, "WAPRICE": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": null, "CLOSINGAUCTIONPRICE": null},
{"SECID": "GAZP", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:58", "PRICEMINUSPREVWAPRICE": -22.98, "VOLTODAY": 47948300, "VALTODAY": 12677905337, "HIGHBID": 304.75, "LOWOFFER": 250.92, "LASTOFFER": 260.29, "LASTBID": 259.71, "OPEN": 253.95, "LOW": 250.92, "HIGH": 273.99, "LAST": 260.29, "LCLOSEPRICE": null, "NUMTRADES": 107517, "WAPRICE": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 260.51, "CLOSINGAUCTIONPRICE": null},
{"SECID": "SBERP", "BOARDID": "SMAL", "TRADINGSESSION": "0", "TIME": "09:33:40", "PRICEMINUSPREVWAPRICE": -17.24, "VOLTODAY": 38, "VALTODAY": 7321, "HIGHBID": 208.01, "LOWOFFER": 185, "LASTOFFER": 204.97, "LASTBID": 190.01, "OPEN": 190, "LOW": 185, "HIGH": 208.01, "LAST": 193, "LCLOSEPRICE": null, "NUMTRADES": 23, "WAPRICE": 193.01, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": null, "CLOSINGAUCTIONPRICE": null},
{"SECID": "SBERP", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:57", "PRICEMINUSPREVWAPRICE": -17.85, "VOLTODAY": 9160070, "VALTODAY": 1768007018, "HIGHBID": 221.66, "LOWOFFER": 175.23, "LASTOFFER": 192.47, "LASTBID": 192.27, "OPEN": 194.8, "LOW": 184, "HIGH": 199.87, "LAST": 192.39, "LCLOSEPRICE": null, "NUMTRADES": 38395, "WAPRICE": 193.01, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 190.91, "CLOSINGAUCTIONPRICE": null}]}
]`
secSt := make([]SecStat, 0)
if got, expected := parseSecStat([]byte(incomeJSON), &secSt), jsonparser.KeyPathNotFoundError; got != expected {
t.Fatalf("Error: expecting: \n %v \ngot:\n %v \ninstead", expected, got)
}
}
func TestParseSecStatResponse(t *testing.T) {
var incomeJSON = `
[
{"charsetinfo": {"name": "utf-8"}},
{
"secstats": [
{"SECID": "GAZP", "BOARDID": "SMAL", "TRADINGSESSION": "1", "TIME": "09:40:08", "PRICEMINUSPREVWAPRICE": -23.27, "VOLTODAY": 25, "VALTODAY": 6654, "HIGHBID": 270.42, "LOWOFFER": 258.12, "LASTOFFER": 271.29, "LASTBID": 261, "OPEN": 258.12, "LOW": 258.12, "HIGH": 287.99, "LAST": 260, "LCLOSEPRICE": null, "NUMTRADES": 16, "WAPRICE": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": null, "CLOSINGAUCTIONPRICE": null},
{"SECID": "SBERP", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:57", "PRICEMINUSPREVWAPRICE": -17.85, "VOLTODAY": 9160070, "VALTODAY": 1768007018, "HIGHBID": 221.66, "LOWOFFER": 175.23, "LASTOFFER": 192.47, "LASTBID": 192.27, "OPEN": 194.8, "LOW": 184, "HIGH": 199.87, "LAST": 192.39, "LCLOSEPRICE": null, "NUMTRADES": 38395, "WAPRICE": 193.01, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 190.91, "CLOSINGAUCTIONPRICE": null}]}
]
`
expectedResponse := SecStatResponse{
SecStats: []SecStat{
{
Ticker: "GAZP",
BoardId: "SMAL",
TrSession: TradingSessionMain,
Time: "09:40:08",
PriceMinusPrevPr: -23.27,
VolToday: 25,
ValToday: 6654,
HighBid: 270.42,
LowOffer: 258.12,
LastOffer: 271.29,
LastBid: 261,
Open: 258.12,
Low: 258.12,
High: 287.99,
Last: 260,
LClosePrice: 0,
NumTrades: 16,
WaPrice: 264.41,
AdmittedQuote: 0,
MarketPrice: 0,
LCurrentPrice: 0,
ClosingAucPrice: 0,
},
{
Ticker: "SBERP",
BoardId: "TQBR",
TrSession: TradingSessionUndefined,
Time: "09:49:57",
PriceMinusPrevPr: -17.85,
VolToday: 9160070,
ValToday: 1768007018,
HighBid: 221.66,
LowOffer: 175.23,
LastOffer: 192.47,
LastBid: 192.27,
Open: 194.8,
Low: 184,
High: 199.87,
Last: 192.39,
LClosePrice: 0,
NumTrades: 38395,
WaPrice: 193.01,
AdmittedQuote: 0,
MarketPrice: 0,
LCurrentPrice: 190.91,
ClosingAucPrice: 0,
},
},
}
secStatR := SecStatResponse{}
var err error = nil
if got, expected := parseSecStatResponse([]byte(incomeJSON), &secStatR), err; got != expected {
t.Fatalf("Error: expecting error: \n %v \ngot:\n %v \ninstead", expected, got)
}
if got, expected := len(secStatR.SecStats), len(secStatR.SecStats); got != expected {
t.Fatalf("Error: expecting: \n %v \ngot:\n %v \ninstead", expected, got)
}
for i, gotItem := range secStatR.SecStats {
if got, expected := gotItem, expectedResponse.SecStats[i]; got != expected {
t.Fatalf("Error: expecting: \n %v \ngot:\n %v \ninstead", expected, got)
}
}
}
func TestParseSecStatResponseResponseNilError(t *testing.T) {
var incomeJSON = ``
var secStatResponse *SecStatResponse = nil
if got, expected := parseSecStatResponse([]byte(incomeJSON), secStatResponse), ErrNilPointer; got != expected {
t.Fatalf("Error: expecting error: \n %v \ngot:\n %v \ninstead", expected, got)
}
}
func TestParseSecStatResponseError(t *testing.T) {
var incomeJSON = `
[
{"charsetinfo": {"name": "utf-8"}},
{
"secstats": [
{"SECID": "GAZP", "BOARDID1": "SMAL", "TRADINGSESSION": "1", "TIME": "09:40:08", "PRICEMINUSPREVWAPRICE": -23.27, "VOLTODAY": 25, "VALTODAY": 6654, "HIGHBID": 270.42, "LOWOFFER": 258.12, "LASTOFFER": 271.29, "LASTBID": 261, "OPEN": 258.12, "LOW": 258.12, "HIGH": 287.99, "LAST": 260, "LCLOSEPRICE": null, "NUMTRADES": 16, "WAPRICE": 264.41, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": null, "CLOSINGAUCTIONPRICE": null},
{"SECID": "SBERP", "BOARDID": "TQBR", "TRADINGSESSION": "0", "TIME": "09:49:57", "PRICEMINUSPREVWAPRICE": -17.85, "VOLTODAY": 9160070, "VALTODAY": 1768007018, "HIGHBID": 221.66, "LOWOFFER": 175.23, "LASTOFFER": 192.47, "LASTBID": 192.27, "OPEN": 194.8, "LOW": 184, "HIGH": 199.87, "LAST": 192.39, "LCLOSEPRICE": null, "NUMTRADES": 38395, "WAPRICE": 193.01, "ADMITTEDQUOTE": null, "MARKETPRICE2": null, "LCURRENTPRICE": 190.91, "CLOSINGAUCTIONPRICE": null}]}
]
`
secStatR := SecStatResponse{}
if got, expected := parseSecStatResponse([]byte(incomeJSON), &secStatR), jsonparser.KeyPathNotFoundError; got != expected {
t.Fatalf("Error: expecting error: \n %v \ngot:\n %v \ninstead", expected, got)
}
}
func TestStatsService_GetSecStats(t *testing.T) {
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
byteValueResult, err := getTestingData("secstats.json")
if err != nil {
return
}
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, err = w.Write(byteValueResult)
if err != nil {
fmt.Println(err)
}
}))
defer srv.Close()
httpClient := srv.Client()
c := NewClient(httpClient)
c.BaseURL, _ = url.Parse(srv.URL + "/")
result, err := c.Stats.GetSecStats(context.Background(), EngineStock, "shares", nil)
if err != nil {
t.Fatalf("Error: expecting <nil> error: \ngot %v \ninstead", err)
}
if got, expected := len(result.SecStats), 6; got != expected {
t.Fatalf("Error: expecting: \n %v items\ngot:\n %v items\ninstead", expected, got)
}
}
func TestStatsService_GetSecStats_KeyPathNotFound(t *testing.T) {
srv := getEmptySrv()
defer srv.Close()
httpClient := srv.Client()
c := NewClient(httpClient)
c.BaseURL, _ = url.Parse(srv.URL + "/")
_, err := c.Stats.GetSecStats(context.Background(), EngineStock, "shares", nil)
if got, expected := err, jsonparser.KeyPathNotFoundError; got == nil || got != expected {
t.Fatalf("Error: expecting %v error \ngot %v \ninstead", expected, got)
}
}
func TestStatsService_GetSecStats_BadUrl(t *testing.T) {
srv := getEmptySrv()
defer srv.Close()
httpClient := srv.Client()
c := NewClient(httpClient)
c.BaseURL, _ = url.Parse(srv.URL)
_, err := c.Stats.GetSecStats(context.Background(), EngineStock, "shares", nil)
if got, expected := err, "BaseURL must have a trailing slash, but \""+srv.URL+"\" does not"; got == nil || got.Error() != expected {
t.Fatalf("Error: expecting %v error \ngot %v \ninstead", expected, got)
}
}
func TestStatsService_GetSecStats_EmptyEngine(t *testing.T) {
srv := getEmptySrv()
defer srv.Close()
httpClient := srv.Client()
c := NewClient(httpClient)
c.BaseURL, _ = url.Parse(srv.URL)
_, err := c.Stats.GetSecStats(context.Background(), "", "shares", nil)
if got, expected := err, ErrBadEngineParameter; got == nil || got != expected {
t.Fatalf("Error: expecting %v error \ngot %v \ninstead", expected, got)
}
}
func TestStatsServiceNilContextError(t *testing.T) {
c := NewClient(nil)
var ctx context.Context = nil
_, err := c.Stats.GetSecStats(ctx, EngineStock, "shares", nil)
if got, expected := err, ErrNonNilContext; got == nil || got != expected {
t.Fatalf("Error: expecting %v error \ngot %v \ninstead", expected, got)
}
}