1+ import copy
12import json
23import base64
34from decimal import Decimal
3334 [Decimal ("2620.18" ), Decimal ("0.02" ), id2 ],
3435]
3536sequence = 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+
4147bids1_internal = {
4248 Decimal ("2525.00" ): [{
4349 'price' : Decimal ('2525.00' ),
@@ -133,7 +139,7 @@ class TestOrderbook(object):
133139 @patch ('gdax.trader.Trader.get_product_order_book' )
134140 async def test_basic_init (self , mock_book , mock_connect ):
135141 mock_connect .return_value .aenter .send_json = CoroutineMock ()
136- mock_book .return_value = test_book
142+ mock_book .return_value = _book ()
137143
138144 product_id = 'ETH-USD'
139145 product_ids = [product_id ]
@@ -295,7 +301,7 @@ async def test_logfile(self, mock_book, mock_connect):
295301 async def test_orderbook_advanced (self , mock_book , mock_connect ):
296302 # TODO: split test by message type
297303 product_id = 'BTC-USD'
298- mock_book .return_value = test_book
304+ mock_book .return_value = _book ()
299305 mock_connect .return_value .aenter .receive_str = CoroutineMock ()
300306 mock_connect .return_value .aenter .send_json = CoroutineMock ()
301307 messages_expected = [
@@ -315,28 +321,6 @@ async def test_orderbook_advanced(self, mock_book, mock_connect):
315321 "sequence" : sequence + 1 ,
316322 "time" : "2017-06-25T11:23:14.792000Z"
317323 },
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- },
340324 {
341325 "type" : "match" ,
342326 "trade_id" : 17545513 ,
@@ -346,7 +330,7 @@ async def test_orderbook_advanced(self, mock_book, mock_connect):
346330 "size" : "0.01" ,
347331 "price" : "2596.77" ,
348332 "product_id" : product_id ,
349- "sequence" : sequence + 4 ,
333+ "sequence" : sequence + 2 ,
350334 "time" : "2017-06-29T01:45:36.865000Z"
351335 },
352336 {
@@ -358,7 +342,7 @@ async def test_orderbook_advanced(self, mock_book, mock_connect):
358342 "size" : "0.41152763" ,
359343 "price" : "2595.62" ,
360344 "product_id" : product_id ,
361- "sequence" : sequence + 5 ,
345+ "sequence" : sequence + 3 ,
362346 "time" : "2017-06-29T01:45:36.865000Z"
363347 },
364348 {
@@ -368,7 +352,7 @@ async def test_orderbook_advanced(self, mock_book, mock_connect):
368352 "order_id" : "26c22ff5-01b1-4ca3-859c-6349d6eb06b4" ,
369353 "remaining_size" : "0.10000000" ,
370354 "product_id" : product_id ,
371- "sequence" : sequence + 6 ,
355+ "sequence" : sequence + 4 ,
372356 "time" : "2017-06-25T11:23:14.792000Z"
373357 },
374358 ]
@@ -389,36 +373,25 @@ async def test_orderbook_advanced(self, mock_book, mock_connect):
389373 current_book ['sequence' ] += 1
390374 assert orderbook .get_current_book (product_id ) == current_book
391375
392- # done
376+ # match
393377 price = Decimal ('2596.74' )
394378 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' )
397382 assert orderbook .get_ask (product_id ) == price
383+ assert orderbook .get_asks (product_id , price2 ) == \
384+ asks1_internal [price2 ]
398385
399386 message = await orderbook .handle_message ()
400387 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 ]
419388 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
422395 current_book ['sequence' ] += 1
423396 assert orderbook .get_current_book (product_id ) != current_book
424397
@@ -432,7 +405,7 @@ async def test_orderbook_advanced(self, mock_book, mock_connect):
432405 bids1_internal [price4 ]
433406 assert orderbook .get_bid (product_id ) == price4
434407 message = await orderbook .handle_message ()
435- assert message == messages_expected [5 ]
408+ assert message == messages_expected [3 ]
436409 bids1_internal [price3 ][0 ]['size' ] = Decimal ('1.0' )
437410 assert orderbook .get_bids (product_id , price3 ) == \
438411 bids1_internal [price3 ]
@@ -445,7 +418,7 @@ async def test_orderbook_advanced(self, mock_book, mock_connect):
445418 # open
446419 current_book = orderbook .get_current_book (product_id )
447420 message = await orderbook .handle_message ()
448- assert message == messages_expected [6 ]
421+ assert message == messages_expected [4 ]
449422 current_book ['sequence' ] += 1
450423 assert orderbook .get_current_book (product_id ) != current_book
451424 # TODO
@@ -608,7 +581,7 @@ async def test_orderbook_change(self, mock_book, mock_connect):
608581 json .dumps (message_expected )
609582 for message_expected in messages_expected
610583 ]
611- mock_book .return_value = test_book
584+ mock_book .return_value = _book ()
612585 async with gdax .orderbook .OrderBook (product_id ) as orderbook :
613586 # change1
614587 current_book = orderbook .get_current_book (product_id )
@@ -618,10 +591,10 @@ async def test_orderbook_change(self, mock_book, mock_connect):
618591
619592 message = await orderbook .handle_message ()
620593 assert message == messages_expected [0 ]
621- bids = bids1_internal [price ][:]
594+ bids = copy . deepcopy ( bids1_internal [price ])
622595 bids [0 ]['size' ] = Decimal ('101' )
623596 assert orderbook .get_bids (product_id , price ) == \
624- bids1_internal [ price ]
597+ bids
625598 current_book ['sequence' ] += 1
626599 assert orderbook .get_current_book (product_id ) != current_book
627600
@@ -633,9 +606,92 @@ async def test_orderbook_change(self, mock_book, mock_connect):
633606
634607 message = await orderbook .handle_message ()
635608 assert message == messages_expected [1 ]
636- asks = asks1_internal [price2 ][:]
609+ asks = copy . deepcopy ( asks1_internal [price2 ])
637610 asks [0 ]['size' ] = Decimal ('0.1' )
638611 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
640689 current_book ['sequence' ] += 1
641690 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