Skip to content

Commit 6022f16

Browse files
committed
add more done tests, reorganize, fix tests issue
1 parent 8c5a60d commit 6022f16

File tree

1 file changed

+118
-62
lines changed

1 file changed

+118
-62
lines changed

tests/test_orderbook.py

Lines changed: 118 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import copy
12
import json
23
import base64
34
from decimal import Decimal
@@ -33,11 +34,16 @@
3334
[Decimal("2620.18"), Decimal("0.02"), id2],
3435
]
3536
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+
4147
bids1_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

Comments
 (0)