@@ -39,7 +39,7 @@ def generate_id():
3939]
4040sequence = 3419033239
4141test_book = {
42- "sequence" : 3419033239 ,
42+ "sequence" : sequence ,
4343 "bids" : bids1 ,
4444 "asks" : asks1 ,
4545}
@@ -108,9 +108,6 @@ def generate_id():
108108 'id' : asks1 [2 ][2 ]}],
109109}
110110"""
111- {"type":"done","side":"sell","order_id":"4eef1226-4b38-422c-a5b1-56def7107f9a","reason":"canceled","product_id":"BTC-USD","price":"2601.76000000","remaining_size":"3.09000000","sequence":3419023013,"time":"2017-06-25T11:23:14.775000Z"}
112- {"type":"received","order_id":"26c22ff5-01b1-4ca3-859c-6349d6eb06b4","order_type":"limit","size":"0.10000000","price":"2602.22000000","side":"sell","product_id":"BTC-USD","sequence":3419023014,"time":"2017-06-25T11:23:14.792000Z"}
113- {"type":"open","side":"sell","price":"2602.22000000","order_id":"26c22ff5-01b1-4ca3-859c-6349d6eb06b4","remaining_size":"0.10000000","product_id":"BTC-USD","sequence":3419023015,"time":"2017-06-25T11:23:14.792000Z"}
114111{"type":"heartbeat","last_trade_id":17393422,"product_id":"BTC-USD","sequence":3419023015,"time":"2017-06-25T11:23:14.838000Z"}
115112{"type":"received","order_id":"c1ac921c-021f-446d-ad6f-06057a6c17f5","order_type":"limit","size":"0.01495400","price":"309.41000000","side":"buy","product_id":"ETH-USD","sequence":617133250,"time":"2017-06-25T11:23:14.864000Z"}
116113{"type":"open","side":"buy","price":"309.41000000","order_id":"c1ac921c-021f-446d-ad6f-06057a6c17f5","remaining_size":"0.01495400","product_id":"ETH-USD","sequence":617133251,"time":"2017-06-25T11:23:14.864000Z"}
@@ -155,7 +152,6 @@ async def test_basic_init(self, mock_book, mock_connect):
155152 assert dict (orderbook ._bids [product_id ].items ()) == bids1_internal
156153 assert orderbook ._sequences [product_id ] == sequence
157154
158- print (orderbook .get_current_book (product_id )['bids' ])
159155 assert orderbook .get_current_book (product_id ) == {
160156 "sequence" : 3419033239 ,
161157 "bids" : [[Decimal (r [0 ]), Decimal (r [1 ]), r [2 ]] for r in bids1 ],
@@ -282,15 +278,13 @@ async def test_logfile(self, mock_book, mock_connect):
282278 mock_connect .return_value .aenter .receive_str .side_effect = [
283279 json .dumps (message_expected )
284280 ]
285-
286281 product_id = 'ETH-USD'
287282 book = {'bids' : [], 'asks' : [], 'sequence' : 1 }
288283 mock_book .return_value = book
289284 calls = [call (f'B { product_id } { json .dumps (book )} \n ' )]
290285 with patch ('aiofiles.open' ,
291286 new_callable = AsyncContextManagerMock ) as mock_open :
292287 mock_open .return_value .aenter .write = CoroutineMock ()
293- # mock_open.return_value.aexit = AsyncContextManagerMock()
294288 mock_write = mock_open .return_value .aenter .write
295289 async with gdax .orderbook .OrderBook (
296290 [product_id ],
@@ -301,3 +295,95 @@ async def test_logfile(self, mock_book, mock_connect):
301295 message = await orderbook .handle_message ()
302296 calls .append (call (f'W { json .dumps (message_expected )} \n ' ))
303297 mock_write .assert_has_calls (calls )
298+
299+ @patch ('gdax.trader.Trader.get_product_order_book' )
300+ async def test_orderbook_advanced (self , mock_book , mock_connect ):
301+ mock_connect .return_value .aenter .receive_str = CoroutineMock ()
302+ mock_connect .return_value .aenter .send_json = CoroutineMock ()
303+ messages_expected = [
304+ { # ignored
305+ "product_id" : "BTC-USD" ,
306+ "sequence" : sequence - 1 ,
307+ },
308+ { # ignored
309+ "type" : "received" ,
310+ "order_id" : "26c22ff5-01b1-4ca3-859c-6349d6eb06b4" ,
311+ "order_type" : "limit" ,
312+ "size" : "0.10000000" ,
313+ "price" : "2602.22000000" ,
314+ "side" : "sell" ,
315+ "product_id" : "BTC-USD" ,
316+ "sequence" : sequence + 1 ,
317+ "time" : "2017-06-25T11:23:14.792000Z"
318+ },
319+ {
320+ "type" : "done" ,
321+ "side" : "sell" ,
322+ "order_id" : asks1 [0 ][2 ],
323+ "reason" : "canceled" ,
324+ "product_id" : "BTC-USD" ,
325+ "price" : "2596.74" ,
326+ "remaining_size" : "0.00000000" ,
327+ "sequence" : sequence + 2 ,
328+ "time" : "2017-06-25T11:23:14.775000Z"
329+ },
330+ {
331+ "type" : "open" ,
332+ "side" : "sell" ,
333+ "price" : "2602.22000000" ,
334+ "order_id" : "26c22ff5-01b1-4ca3-859c-6349d6eb06b4" ,
335+ "remaining_size" : "0.10000000" ,
336+ "product_id" : "BTC-USD" ,
337+ "sequence" : sequence + 3 ,
338+ "time" : "2017-06-25T11:23:14.792000Z"
339+ },
340+ {
341+ "type" : "done" ,
342+ "side" : "sell" ,
343+ "order_id" : "94b38e12-cc81-46b4-ad86-cbf435ce03a2" ,
344+ "reason" : "canceled" ,
345+ "product_id" : "BTC-USD" ,
346+ # no price specified
347+ "remaining_size" : "0.20000000" ,
348+ "sequence" : sequence + 4 ,
349+ "time" : "2017-06-25T11:23:14.937000Z"
350+ }
351+ ]
352+ mock_connect .return_value .aenter .receive_str .side_effect = [
353+ json .dumps (message_expected )
354+ for message_expected in messages_expected
355+ ]
356+ product_id = 'BTC-USD'
357+ book = {'bids' : [], 'asks' : [], 'sequence' : 1 }
358+ mock_book .return_value = test_book
359+ async with gdax .orderbook .OrderBook (product_id ) as orderbook :
360+ current_book = orderbook .get_current_book (product_id )
361+ message = await orderbook .handle_message ()
362+ assert message == messages_expected [0 ]
363+ assert orderbook .get_current_book (product_id ) == current_book
364+
365+ message = await orderbook .handle_message ()
366+ assert message == messages_expected [1 ]
367+ current_book ['sequence' ] += 1
368+ assert orderbook .get_current_book (product_id ) == current_book
369+
370+ price = Decimal ('2596.74' )
371+ price2 = Decimal ('2596.77' )
372+ assert orderbook .get_asks (product_id , price ) == \
373+ asks1_internal [price ]
374+ assert orderbook .get_ask (product_id ) == price
375+
376+ message = await orderbook .handle_message ()
377+ assert message == messages_expected [2 ]
378+ assert orderbook .get_asks (product_id , price ) is None
379+ assert orderbook .get_ask (product_id ) == price2
380+ current_book ['sequence' ] += 1
381+ assert orderbook .get_current_book (product_id ) != current_book
382+
383+ message = await orderbook .handle_message ()
384+ assert message == messages_expected [3 ]
385+ # TODO
386+
387+ message = await orderbook .handle_message ()
388+ assert message == messages_expected [4 ]
389+ # TODO
0 commit comments