1
+ import copy
1
2
import json
2
3
import base64
3
4
from decimal import Decimal
33
34
[Decimal ("2620.18" ), Decimal ("0.02" ), id2 ],
34
35
]
35
36
sequence = 3419033239
36
- test_book = {
37
- "sequence" : sequence ,
38
- "bids" : bids1 ,
39
- "asks" : asks1 ,
40
- }
37
+
38
+
39
+ def _book ():
40
+ return copy .deepcopy ({
41
+ "sequence" : sequence ,
42
+ "bids" : bids1 ,
43
+ "asks" : asks1 ,
44
+ })
45
+
46
+
41
47
bids1_internal = {
42
48
Decimal ("2525.00" ): [{
43
49
'price' : Decimal ('2525.00' ),
@@ -133,7 +139,7 @@ class TestOrderbook(object):
133
139
@patch ('gdax.trader.Trader.get_product_order_book' )
134
140
async def test_basic_init (self , mock_book , mock_connect ):
135
141
mock_connect .return_value .aenter .send_json = CoroutineMock ()
136
- mock_book .return_value = test_book
142
+ mock_book .return_value = _book ()
137
143
138
144
product_id = 'ETH-USD'
139
145
product_ids = [product_id ]
@@ -295,7 +301,7 @@ async def test_logfile(self, mock_book, mock_connect):
295
301
async def test_orderbook_advanced (self , mock_book , mock_connect ):
296
302
# TODO: split test by message type
297
303
product_id = 'BTC-USD'
298
- mock_book .return_value = test_book
304
+ mock_book .return_value = _book ()
299
305
mock_connect .return_value .aenter .receive_str = CoroutineMock ()
300
306
mock_connect .return_value .aenter .send_json = CoroutineMock ()
301
307
messages_expected = [
@@ -315,28 +321,6 @@ async def test_orderbook_advanced(self, mock_book, mock_connect):
315
321
"sequence" : sequence + 1 ,
316
322
"time" : "2017-06-25T11:23:14.792000Z"
317
323
},
318
- {
319
- "type" : "done" ,
320
- "side" : "sell" ,
321
- "order_id" : asks1 [0 ][2 ],
322
- "reason" : "canceled" ,
323
- "product_id" : product_id ,
324
- "price" : "2596.74" ,
325
- "remaining_size" : "0.00000000" ,
326
- "sequence" : sequence + 2 ,
327
- "time" : "2017-06-25T11:23:14.775000Z"
328
- },
329
- {
330
- "type" : "done" ,
331
- "side" : "sell" ,
332
- "order_id" : asks1 [1 ][2 ],
333
- "reason" : "canceled" ,
334
- "product_id" : product_id ,
335
- # no price specified
336
- "remaining_size" : "0.20000000" ,
337
- "sequence" : sequence + 3 ,
338
- "time" : "2017-06-25T11:23:14.937000Z"
339
- },
340
324
{
341
325
"type" : "match" ,
342
326
"trade_id" : 17545513 ,
@@ -346,7 +330,7 @@ async def test_orderbook_advanced(self, mock_book, mock_connect):
346
330
"size" : "0.01" ,
347
331
"price" : "2596.77" ,
348
332
"product_id" : product_id ,
349
- "sequence" : sequence + 4 ,
333
+ "sequence" : sequence + 2 ,
350
334
"time" : "2017-06-29T01:45:36.865000Z"
351
335
},
352
336
{
@@ -358,7 +342,7 @@ async def test_orderbook_advanced(self, mock_book, mock_connect):
358
342
"size" : "0.41152763" ,
359
343
"price" : "2595.62" ,
360
344
"product_id" : product_id ,
361
- "sequence" : sequence + 5 ,
345
+ "sequence" : sequence + 3 ,
362
346
"time" : "2017-06-29T01:45:36.865000Z"
363
347
},
364
348
{
@@ -368,7 +352,7 @@ async def test_orderbook_advanced(self, mock_book, mock_connect):
368
352
"order_id" : "26c22ff5-01b1-4ca3-859c-6349d6eb06b4" ,
369
353
"remaining_size" : "0.10000000" ,
370
354
"product_id" : product_id ,
371
- "sequence" : sequence + 6 ,
355
+ "sequence" : sequence + 4 ,
372
356
"time" : "2017-06-25T11:23:14.792000Z"
373
357
},
374
358
]
@@ -389,36 +373,25 @@ async def test_orderbook_advanced(self, mock_book, mock_connect):
389
373
current_book ['sequence' ] += 1
390
374
assert orderbook .get_current_book (product_id ) == current_book
391
375
392
- # done
376
+ # match
393
377
price = Decimal ('2596.74' )
394
378
price2 = Decimal ('2596.77' )
395
- assert orderbook .get_asks (product_id , price ) == \
396
- asks1_internal [price ]
379
+ current_book = orderbook .get_current_book (product_id )
380
+ assert orderbook .get_min_ask_depth (product_id ) == \
381
+ Decimal ('0.2' )
397
382
assert orderbook .get_ask (product_id ) == price
383
+ assert orderbook .get_asks (product_id , price2 ) == \
384
+ asks1_internal [price2 ]
398
385
399
386
message = await orderbook .handle_message ()
400
387
assert message == messages_expected [2 ]
401
- assert orderbook .get_asks (product_id , price ) is None
402
- assert orderbook .get_ask (product_id ) == price2
403
- current_book ['sequence' ] += 1
404
- assert orderbook .get_current_book (product_id ) != current_book
405
-
406
- # done 2
407
- message = await orderbook .handle_message ()
408
- assert message == messages_expected [3 ]
409
- current_book ['sequence' ] += 1
410
- assert orderbook .get_current_book (product_id ) != current_book
411
- # TODO
412
-
413
- # match
414
- current_book = orderbook .get_current_book (product_id )
415
- assert orderbook .get_min_ask_depth (product_id ) == \
416
- Decimal ('0.07670504' )
417
- message = await orderbook .handle_message ()
418
- assert message == messages_expected [4 ]
419
388
assert orderbook .get_min_ask_depth (product_id ) == \
420
- Decimal ('0.06670504' )
421
- assert orderbook .get_ask (product_id ) == price2
389
+ Decimal ('0.2' )
390
+ assert orderbook .get_ask (product_id ) == price
391
+ asks = copy .deepcopy (asks1_internal [price2 ])
392
+ asks [0 ]['size' ] = Decimal ('0.06670504' )
393
+ assert orderbook .get_asks (product_id , price2 ) == \
394
+ asks
422
395
current_book ['sequence' ] += 1
423
396
assert orderbook .get_current_book (product_id ) != current_book
424
397
@@ -432,7 +405,7 @@ async def test_orderbook_advanced(self, mock_book, mock_connect):
432
405
bids1_internal [price4 ]
433
406
assert orderbook .get_bid (product_id ) == price4
434
407
message = await orderbook .handle_message ()
435
- assert message == messages_expected [5 ]
408
+ assert message == messages_expected [3 ]
436
409
bids1_internal [price3 ][0 ]['size' ] = Decimal ('1.0' )
437
410
assert orderbook .get_bids (product_id , price3 ) == \
438
411
bids1_internal [price3 ]
@@ -445,7 +418,7 @@ async def test_orderbook_advanced(self, mock_book, mock_connect):
445
418
# open
446
419
current_book = orderbook .get_current_book (product_id )
447
420
message = await orderbook .handle_message ()
448
- assert message == messages_expected [6 ]
421
+ assert message == messages_expected [4 ]
449
422
current_book ['sequence' ] += 1
450
423
assert orderbook .get_current_book (product_id ) != current_book
451
424
# TODO
@@ -608,7 +581,7 @@ async def test_orderbook_change(self, mock_book, mock_connect):
608
581
json .dumps (message_expected )
609
582
for message_expected in messages_expected
610
583
]
611
- mock_book .return_value = test_book
584
+ mock_book .return_value = _book ()
612
585
async with gdax .orderbook .OrderBook (product_id ) as orderbook :
613
586
# change1
614
587
current_book = orderbook .get_current_book (product_id )
@@ -618,10 +591,10 @@ async def test_orderbook_change(self, mock_book, mock_connect):
618
591
619
592
message = await orderbook .handle_message ()
620
593
assert message == messages_expected [0 ]
621
- bids = bids1_internal [price ][:]
594
+ bids = copy . deepcopy ( bids1_internal [price ])
622
595
bids [0 ]['size' ] = Decimal ('101' )
623
596
assert orderbook .get_bids (product_id , price ) == \
624
- bids1_internal [ price ]
597
+ bids
625
598
current_book ['sequence' ] += 1
626
599
assert orderbook .get_current_book (product_id ) != current_book
627
600
@@ -633,9 +606,92 @@ async def test_orderbook_change(self, mock_book, mock_connect):
633
606
634
607
message = await orderbook .handle_message ()
635
608
assert message == messages_expected [1 ]
636
- asks = asks1_internal [price2 ][:]
609
+ asks = copy . deepcopy ( asks1_internal [price2 ])
637
610
asks [0 ]['size' ] = Decimal ('0.1' )
638
611
assert orderbook .get_asks (product_id , price2 ) == \
639
- asks1_internal [price2 ]
612
+ asks
613
+ current_book ['sequence' ] += 1
614
+ assert orderbook .get_current_book (product_id ) != current_book
615
+
616
+ @patch ('gdax.trader.Trader.get_product_order_book' )
617
+ async def test_orderbook_done (self , mock_book , mock_connect ):
618
+ product_id = 'BTC-USD'
619
+ mock_book .return_value = _book ()
620
+ mock_connect .return_value .aenter .receive_str = CoroutineMock ()
621
+ mock_connect .return_value .aenter .send_json = CoroutineMock ()
622
+ messages_expected = [
623
+ {
624
+ "type" : "done" ,
625
+ "side" : "sell" ,
626
+ "order_id" : asks1 [0 ][2 ],
627
+ "reason" : "canceled" ,
628
+ "product_id" : product_id ,
629
+ "price" : "2596.74" ,
630
+ "remaining_size" : "0.00000000" ,
631
+ "sequence" : sequence + 1 ,
632
+ "time" : "2017-06-25T11:23:14.775000Z"
633
+ },
634
+ {
635
+ "type" : "done" ,
636
+ "side" : "buy" ,
637
+ "order_id" : bids1 [4 ][2 ],
638
+ "reason" : "canceled" ,
639
+ "product_id" : product_id ,
640
+ "price" : "2595.70" ,
641
+ "remaining_size" : "0.00000000" ,
642
+ "sequence" : sequence + 2 ,
643
+ "time" : "2017-06-25T11:23:16.937000Z"
644
+ },
645
+ {
646
+ "type" : "done" ,
647
+ "side" : "sell" ,
648
+ "order_id" : asks1 [1 ][2 ],
649
+ "reason" : "canceled" ,
650
+ "product_id" : product_id ,
651
+ # no price specified
652
+ "remaining_size" : "0.20000000" ,
653
+ "sequence" : sequence + 3 ,
654
+ "time" : "2017-06-25T11:23:15.937000Z"
655
+ },
656
+ ]
657
+ mock_connect .return_value .aenter .receive_str .side_effect = [
658
+ json .dumps (message_expected )
659
+ for message_expected in messages_expected
660
+ ]
661
+ async with gdax .orderbook .OrderBook (product_id ) as orderbook :
662
+ # done
663
+ current_book = orderbook .get_current_book (product_id )
664
+ price = Decimal ('2596.74' )
665
+ price2 = Decimal ('2596.77' )
666
+ assert orderbook .get_asks (product_id , price ) == \
667
+ asks1_internal [price ]
668
+ assert orderbook .get_ask (product_id ) == price
669
+
670
+ message = await orderbook .handle_message ()
671
+ assert message == messages_expected [0 ]
672
+ assert orderbook .get_asks (product_id , price ) is None
673
+ assert orderbook .get_ask (product_id ) == price2
674
+ current_book ['sequence' ] += 1
675
+ assert orderbook .get_current_book (product_id ) != current_book
676
+
677
+ # done2
678
+ current_book = orderbook .get_current_book (product_id )
679
+ price2 = Decimal ('2595.70' )
680
+ price3 = Decimal ('2595.62' )
681
+ assert orderbook .get_bids (product_id , price2 ) == \
682
+ bids1_internal [price2 ]
683
+ assert orderbook .get_bid (product_id ) == price2
684
+
685
+ message = await orderbook .handle_message ()
686
+ assert message == messages_expected [1 ]
687
+ assert orderbook .get_bids (product_id , price2 ) is None
688
+ assert orderbook .get_bid (product_id ) == price3
640
689
current_book ['sequence' ] += 1
641
690
assert orderbook .get_current_book (product_id ) != current_book
691
+
692
+ # done3, market order ignored
693
+ current_book = orderbook .get_current_book (product_id )
694
+ message = await orderbook .handle_message ()
695
+ assert message == messages_expected [2 ]
696
+ current_book ['sequence' ] += 1
697
+ assert orderbook .get_current_book (product_id ) == current_book
0 commit comments