Files
bitfinex-api-py/bfxapi/tests/test_ws_subscriptions.py
2021-11-29 09:46:49 +01:00

141 lines
5.5 KiB
Python

import pytest
import json
from .helpers import (create_stubbed_client, ws_publish_connection_init, EventWatcher)
@pytest.mark.asyncio
async def test_submit_subscribe():
client = create_stubbed_client()
symb = 'tXRPBTC'
# publish connection created message
await ws_publish_connection_init(client.ws)
# Create new subscription to orderbook
await client.ws.subscribe('book', symb)
last_sent = client.ws.get_last_sent_item()
sent_sub = json.loads(last_sent['data'])
# {'time': 1548327054030, 'data': '{"event": "subscribe", "channel": "book", "symbol": "tXRPBTC"}'}
assert sent_sub['event'] == "subscribe"
assert sent_sub['channel'] == "book"
assert sent_sub['symbol'] == symb
# create new subscription to trades
await client.ws.subscribe('trades', symb)
last_sent = client.ws.get_last_sent_item()
sent_sub = json.loads(last_sent['data'])
# {'event': 'subscribe', 'channel': 'trades', 'symbol': 'tBTCUSD'}
assert sent_sub['event'] == 'subscribe'
assert sent_sub['channel'] == 'trades'
assert sent_sub['symbol'] == symb
# create new subscription to candles
await client.ws.subscribe('candles', symb, timeframe='1m')
last_sent = client.ws.get_last_sent_item()
sent_sub = json.loads(last_sent['data'])
#{'event': 'subscribe', 'channel': 'candles', 'symbol': 'tBTCUSD', 'key': 'trade:1m:tBTCUSD'}
assert sent_sub['event'] == 'subscribe'
assert sent_sub['channel'] == 'candles'
assert sent_sub['key'] == 'trade:1m:{}'.format(symb)
@pytest.mark.asyncio
async def test_event_subscribe():
client = create_stubbed_client()
symb = 'tXRPBTC'
pair = 'XRPBTC'
# publish connection created message
await ws_publish_connection_init(client.ws)
# create a new subscription
await client.ws.subscribe('trades', symb)
# announce subscription was successful
sub_watch = EventWatcher.watch(client.ws, 'subscribed')
await client.ws.publish({"event":"subscribed","channel":"trades","chanId":2,"symbol":symb,"pair":pair})
s_res = sub_watch.wait_until_complete()
assert s_res.channel_name == 'trades'
assert s_res.symbol == symb
assert s_res.is_subscribed_bool == True
assert s_res.chan_id == 2
@pytest.mark.asyncio
async def test_submit_unsubscribe():
client = create_stubbed_client()
symb = 'tXRPBTC'
pair = 'XRPBTC'
# publish connection created message
await ws_publish_connection_init(client.ws)
# create new subscription to trades
await client.ws.subscribe('trades', symb)
# announce subscription was successful
sub_watch = EventWatcher.watch(client.ws, 'subscribed')
await client.ws.publish({"event":"subscribed","channel":"trades","chanId":2,"symbol":symb,"pair":pair})
s_res = sub_watch.wait_until_complete()
# unsubscribe from channel
await s_res.unsubscribe()
last_sent = client.ws.get_last_sent_item()
sent_unsub = json.loads(last_sent['data'])
# {'event': 'unsubscribe', 'chanId': 2}
assert sent_unsub['event'] == 'unsubscribe'
assert sent_unsub['chanId'] == 2
@pytest.mark.asyncio
async def test_event_unsubscribe():
client = create_stubbed_client()
symb = 'tXRPBTC'
pair = 'XRPBTC'
# publish connection created message
await ws_publish_connection_init(client.ws)
# create new subscription to trades
await client.ws.subscribe('trades', symb)
# announce subscription was successful
sub_watch = EventWatcher.watch(client.ws, 'subscribed')
await client.ws.publish({"event":"subscribed","channel":"trades","chanId":2,"symbol":symb,"pair":pair})
s_res = sub_watch.wait_until_complete()
# unsubscribe from channel
await s_res.unsubscribe()
last_sent = client.ws.get_last_sent_item()
sent_unsub = json.loads(last_sent['data'])
# publish confirmation of unsubscribe
unsub_watch = EventWatcher.watch(client.ws, 'unsubscribed')
await client.ws.publish({"event":"unsubscribed","status":"OK","chanId":2})
unsub_res = unsub_watch.wait_until_complete()
assert s_res.channel_name == 'trades'
assert s_res.symbol == symb
assert s_res.is_subscribed_bool == False
assert s_res.chan_id == 2
@pytest.mark.asyncio
async def test_submit_resubscribe():
client = create_stubbed_client()
symb = 'tXRPBTC'
pair = 'XRPBTC'
# publish connection created message
await ws_publish_connection_init(client.ws)
# request two new subscriptions
await client.ws.subscribe('book', symb)
await client.ws.subscribe('trades', symb)
# confirm subscriptions
await client.ws.publish({"event":"subscribed","channel":"trades","chanId":2,"symbol":symb,"pair":pair})
await client.ws.publish({"event":"subscribed","channel":"book","chanId":3,"symbol":symb,"prec":"P0","freq":"F0","len":"25","pair":pair})
# call resubscribe all
await client.ws.resubscribe_all()
## assert that 2 unsubscribe requests were sent
last_sent = client.ws.get_sent_items()[-2:]
for i in last_sent:
data = json.loads(i['data'])
assert data['event'] == 'unsubscribe'
assert (data['chanId'] == 2 or data['chanId'] == 3)
## confirm unsubscriptions
await client.ws.publish({"event":"unsubscribed","status":"OK","chanId":2})
await client.ws.publish({"event":"unsubscribed","status":"OK","chanId":3})
## confirm subscriptions
# await client.ws.publish({"event":"subscribed","channel":"trades","chanId":2,"symbol":symb,"pair":pair})
# await client.ws.publish({"event":"subscribed","channel":"book","chanId":3,"symbol":symb,"prec":"P0","freq":"F0","len":"25","pair":pair})
# wait for emit of event
n_last_sent = client.ws.get_sent_items()[-2:]
for i in n_last_sent:
data = json.loads(i['data'])
# print (data)
assert data['event'] == 'subscribe'
assert (data['channel'] == 'book' or data['channel'] == 'trades')
assert data['symbol'] == symb