Skip to content
This repository has been archived by the owner on Jun 8, 2022. It is now read-only.

Commit

Permalink
Test RTM and Treq/Curio implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
ovv committed Jan 9, 2018
1 parent e45789c commit df5e6fc
Show file tree
Hide file tree
Showing 7 changed files with 358 additions and 52 deletions.
62 changes: 45 additions & 17 deletions slack/io/abc.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,20 +125,48 @@ async def rtm(self, url=None, bot_id=None):
"""
while True:
if not bot_id:
auth = await self.query(methods.AUTH_TEST)
user_info = await self.query(methods.USERS_INFO, {'user': auth['user_id']})
bot_id = user_info['user']['profile']['bot_id']
LOG.info('BOT_ID is %s', bot_id)
if not url:
url = (await self.query(methods.RTM_CONNECT))['url']

async for data in self._rtm(url):
event = events.Event.from_rtm(json.loads(data))
if sansio.need_reconnect(event):
break
elif sansio.discard_event(event, bot_id):
if event['type'] == 'reconnect_url':
url = event['url']
else:
yield event
bot_id = bot_id or await self._find_bot_id()
url = url or await self._find_rtm_url()
async for event in self._incoming_from_rtm(url, bot_id):
yield event
url = None

async def _find_bot_id(self):
"""
Find the bot ID to discard incoming message from the bot itself.
Returns:
The bot ID
"""
auth = await self.query(methods.AUTH_TEST)
user_info = await self.query(methods.USERS_INFO, {'user': auth['user_id']})
bot_id = user_info['user']['profile']['bot_id']
LOG.info('BOT_ID is %s', bot_id)
return bot_id

async def _find_rtm_url(self):
"""
Call `rtm.connect` to find the websocket url.
Returns:
Url for websocket connection
"""
response = await self.query(methods.RTM_CONNECT)
return response['url']

async def _incoming_from_rtm(self, url, bot_id):
"""
Connect and discard incoming RTM event if necessary.
:param url: Websocket url
:param bot_id: Bot ID
:return: Incoming events
"""
async for data in self._rtm(url):
event = events.Event.from_rtm(json.loads(data))
if sansio.need_reconnect(event):
break
elif sansio.discard_event(event, bot_id):
continue
else:
yield event
43 changes: 26 additions & 17 deletions slack/io/requests.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,20 +121,29 @@ def rtm(self, url=None, bot_id=None):
"""
while True:
if not bot_id:
auth = self.query(methods.AUTH_TEST)
user_info = self.query(methods.USERS_INFO, {'user': auth['user_id']})
bot_id = user_info['user']['profile']['bot_id']
LOG.info('BOT_ID is %s', bot_id)
if not url:
url = (self.query(methods.RTM_CONNECT))['url']

for data in self._rtm(url):
event = events.Event.from_rtm(json.loads(data))
if sansio.need_reconnect(event):
break
elif sansio.discard_event(event, bot_id):
if event['type'] == 'reconnect_url':
url = event['url']
else:
yield event
bot_id = bot_id or self._find_bot_id()
url = url or self._find_rtm_url()
for event in self._incoming_from_rtm(url, bot_id):
yield event
url = None

def _find_bot_id(self):
auth = self.query(methods.AUTH_TEST)
user_info = self.query(methods.USERS_INFO, {'user': auth['user_id']})
bot_id = user_info['user']['profile']['bot_id']
LOG.info('BOT_ID is %s', bot_id)
return bot_id

def _find_rtm_url(self):
response = self.query(methods.RTM_CONNECT)
return response['url']

def _incoming_from_rtm(self, url, bot_id):
for data in self._rtm(url):
event = events.Event.from_rtm(json.loads(data))
if sansio.need_reconnect(event):
break
elif sansio.discard_event(event, bot_id):
continue
else:
yield event
1 change: 0 additions & 1 deletion slack/sansio.py
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,6 @@ def discard_event(event, bot_id=None):
elif 'message' in event and event['message'].get('bot_id') == bot_id:
LOG.debug('Ignoring event: %s', event)
return True

return False


Expand Down
16 changes: 16 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,22 @@ async def _rtm(self, url):
pass


@pytest.fixture(params=(data.events.rtm_events.keys(),))
def rtm_iterator(request):
async def events(url):
for key in request.param:
yield data.events.rtm_events[key]
return events


@pytest.fixture(params=(data.events.rtm_events.keys(),))
def rtm_iterator_non_async(request):
def events(url):
for key in request.param:
yield data.events.rtm_events[key]
return events


@pytest.fixture(params=(FakeIO, ))
def io_client(request):

Expand Down
19 changes: 19 additions & 0 deletions tests/data/events.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import json

CHANNEL_DELETED = {
'token': 'supersecuretoken',
'team_id': 'T000AAA0A',
Expand Down Expand Up @@ -314,6 +316,15 @@
'event_time': 123456789
}

GOODBYE = {
"type": "goodbye"
}

RECONNECT_URL = {
"type": "reconnect_url",
"url": "wss:\/\/testteam.slack.com/012345678910"
}

events = {
'channel_deleted': CHANNEL_DELETED,
'pin_added': PIN_ADDED,
Expand All @@ -331,3 +342,11 @@
'edit_threaded': MESSAGE_EDIT_THREADED,
'bot_edit': MESSAGE_BOT_EDIT
}

rtm_events = {
'channel_deleted': json.dumps(CHANNEL_DELETED['event']),
'pin_added': json.dumps(PIN_ADDED['event']),
'goodbye': json.dumps(GOODBYE),
'bot': json.dumps(MESSAGE_BOT['event']),
'reconnect_url': json.dumps(RECONNECT_URL)
}
82 changes: 75 additions & 7 deletions tests/data/methods.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,37 +5,37 @@
"id": "C00000001",
"name": "fun",
"created": 1360782804,
"creator": "U024BE7LH",
"creator": "U000AA000",
"is_archived": False,
"is_member": False,
"num_members": 6,
"topic": {
"value": "Fun times",
"creator": "U024BE7LV",
"creator": "U000AA000",
"last_set": 1369677212
},
"purpose": {
"value": "This channel is for fun",
"creator": "U024BE7LH",
"creator": "U000AA000",
"last_set": 1360782804
}
},
{
"id": "C00000002",
"name": "fun",
"created": 1360782804,
"creator": "U024BE7LH",
"creator": "U000AA000",
"is_archived": False,
"is_member": False,
"num_members": 6,
"topic": {
"value": "Fun times",
"creator": "U024BE7LV",
"creator": "U000AA000",
"last_set": 1369677212
},
"purpose": {
"value": "This channel is for fun",
"creator": "U024BE7LH",
"creator": "U000AA000",
"last_set": 1360782804
}
}
Expand All @@ -51,7 +51,75 @@
}
}

USERS_INFO = {
"ok": True,
"user": {
"id": "W012A3CDE",
"team_id": "T012AB3C4",
"name": "sirbotalotr",
"deleted": True,
"color": "9f69e7",
"real_name": "episod",
"tz": "America\/Los_Angeles",
"tz_label": "Pacific Daylight Time",
"tz_offset": -25200,
"profile": {
"avatar_hash": "ge3b51ca72de",
"status_text": "Print is dead",
"status_emoji": ":books:",
"real_name": "Egon Spengler",
"display_name": "spengler",
"real_name_normalized": "Egon Spengler",
"display_name_normalized": "spengler",
"email": "spengler@ghostbusters.example.com",
"image_24": "https:\/\/...\/avatar\/e3b51ca72dee4ef87916ae2b9240df50.jpg",
"image_32": "https:\/\/...\/avatar\/e3b51ca72dee4ef87916ae2b9240df50.jpg",
"image_48": "https:\/\/...\/avatar\/e3b51ca72dee4ef87916ae2b9240df50.jpg",
"image_72": "https:\/\/...\/avatar\/e3b51ca72dee4ef87916ae2b9240df50.jpg",
"image_192": "https:\/\/...\/avatar\/e3b51ca72dee4ef87916ae2b9240df50.jpg",
"image_512": "https:\/\/...\/avatar\/e3b51ca72dee4ef87916ae2b9240df50.jpg",
"team": "T012AB3C4",
"bot_id": "B0AAA0A00"
},
"is_admin": True,
"is_owner": False,
"is_primary_owner": False,
"is_restricted": False,
"is_ultra_restricted": False,
"is_bot": True,
"updated": 1502138686,
"is_app_user": False,
"has_2fa": False
}
}

AUTH_TEST = {
"ok": True,
"url": "https:\/\/testteam.slack.com\/",
"team": "TestTeam Workspace",
"user": "sirbotalot",
"team_id": "T12345678",
"user_id": "W12345678"
}

RTM_CONNECT = {
"ok": True,
"self": {
"id": "W012A3CDE",
"name": "sirbotalot"
},
"team": {
"domain": "testteam",
"id": "T12345678",
"name": "testteam"
},
"url": "wss:\/\/testteam.slack.com/012345678910"
}

payloads = {
'channels_iter': CHANNELS_ITER,
'channels': CHANNELS
'channels': CHANNELS,
'users.info': USERS_INFO,
'auth.test': AUTH_TEST,
'rtm.connect': RTM_CONNECT
}

0 comments on commit df5e6fc

Please sign in to comment.