def test_fetch_from_non_set_cache(self): """Test if a error is raised when the cache was not set""" slack = Slack('C011DUKE8', 'aaaa', max_items=5) with self.assertRaises(CacheError): _ = [msg for msg in slack.fetch_from_cache()]
def test_fetch_from_cache(self, mock_utcnow): """Test whether the cache works""" mock_utcnow.return_value = datetime.datetime( 2017, 1, 1, tzinfo=dateutil.tz.tzutc()) http_requests = setup_http_server() # First, we fetch the events from the server, # storing them in a cache cache = Cache(self.tmp_path) slack = Slack('C011DUKE8', 'aaaa', max_items=5, cache=cache) messages = [msg for msg in slack.fetch()] self.assertEqual(len(http_requests), 5) # Now, we get the messages from the cache. # The events should be the same and there won't be # any new request to the server cached_messages = [msg for msg in slack.fetch_from_cache()] self.assertEqual(len(cached_messages), len(messages)) expected = [ ("<@U0003|dizquierdo> has joined the channel", 'bb95a1facf7d61baaf57322f3d6b6d2d45af8aeb', 1427799888.0, '*****@*****.**'), ("tengo el m\u00f3vil", 'f8668de6fadeb5730e0a80d4c8e5d3f8d175f4d5', 1427135890.000071, '*****@*****.**'), ("hey acs", '29c2942a704c4e0b067daeb76edb2f826376cecf', 1427135835.000070, '*****@*****.**'), ("¿vale?", '757e88ea008db0fff739dd261179219aedb84a95', 1427135740.000069, '*****@*****.**'), ("jsmanrique: tenemos que dar m\u00e9tricas super chulas", 'e92555381bc431a53c0b594fc118850eafd6e212', 1427135733.000068, '*****@*****.**'), ("hi!", 'b92892e7b65add0e83d0839de20b2375a42014e8', 1427135689.000067, '*****@*****.**'), ("hi!", 'e59d9ca0d9a2ba1c747dc60a0904edd22d69e20e', 1427135634.000066, '*****@*****.**') ] self.assertEqual(len(cached_messages), len(expected)) for x in range(len(cached_messages)): cmessage = cached_messages[x] expc = expected[x] self.assertEqual(cmessage['data']['text'], expc[0]) self.assertEqual(cmessage['uuid'], expc[1]) self.assertEqual(cmessage['origin'], 'https://slack.com/C011DUKE8') self.assertEqual(cmessage['updated_on'], expc[2]) self.assertEqual(cmessage['category'], 'message') self.assertEqual(cmessage['tag'], 'https://slack.com/C011DUKE8') self.assertEqual(cmessage['data']['user_data']['profile']['email'], expc[3]) # Compare chached and fetched message self.assertDictEqual(cmessage['data'], messages[x]['data']) # No more requests were sent self.assertEqual(len(http_requests), 5)
def test_fetch_from_empty_cache(self): """Test if there are not any message returned when the cache is empty""" cache = Cache(self.tmp_path) slack = Slack('C011DUKE8', 'aaaa', max_items=5, cache=cache) cached_messages = [msg for msg in slack.fetch_from_cache()] self.assertEqual(len(cached_messages), 0)
def test_parse_history(self): """Test if it parses a channel history JSON stream""" raw_json = read_file('data/slack/slack_history.json') items, has_more = Slack.parse_history(raw_json) results = [item for item in items] self.assertEqual(len(results), 7) self.assertEqual(results[0]['ts'], '1486999900.000000') self.assertEqual(results[1]['ts'], '1486969200.000136') self.assertEqual(results[2]['ts'], '1427799888.000000') self.assertEqual(results[3]['ts'], '1427135890.000071') self.assertEqual(results[4]['ts'], '1427135835.000070') self.assertEqual(results[5]['ts'], '1427135740.000069') self.assertEqual(results[6]['ts'], '1427135733.000068') self.assertEqual(has_more, True) # Parse a file without results raw_json = read_file('data/slack/slack_history_empty.json') items, has_more = Slack.parse_history(raw_json) results = [item for item in items] self.assertEqual(len(results), 0) self.assertEqual(has_more, False)
def test_fetch_empty(self, mock_utcnow): """Test if nothing is returned when there are no messages""" mock_utcnow.return_value = datetime.datetime( 2017, 1, 1, tzinfo=dateutil.tz.tzutc()) http_requests = setup_http_server() from_date = datetime.datetime(2016, 1, 1, tzinfo=dateutil.tz.tzutc()) slack = Slack('C011DUKE8', 'aaaa', max_items=5) messages = [msg for msg in slack.fetch(from_date=from_date)] self.assertEqual(len(messages), 0) # Check requests expected = [{ 'channel': ['C011DUKE8'], 'token': ['aaaa'] }, { 'channel': ['C011DUKE8'], 'oldest': ['1451606399.99999'], 'latest': ['1483228800.0'], 'token': ['aaaa'], 'count': ['5'] }] self.assertEqual(len(http_requests), len(expected)) for i in range(len(expected)): self.assertDictEqual(http_requests[i].querystring, expected[i])
def setUp(self): super().setUp() self.backend_write_archive = Slack('C011DUKE8', 'aaaa', max_items=5, archive=self.archive) self.backend_read_archive = Slack('C011DUKE8', 'bbbb', max_items=5, archive=self.archive)
def test_parse_channel_info(self): """Test if it parses a channel info JSON stream""" raw_json = read_file('data/slack/slack_info.json') user = Slack.parse_channel_info(raw_json) self.assertEqual(user['id'], 'C011DUKE8') self.assertEqual(user['name'], 'test channel')
def test_parse_user(self): """Test if it parses a user info JSON stream""" raw_json = read_file('data/slack/slack_user_U0001.json') user = Slack.parse_user(raw_json) self.assertEqual(user['id'], 'U0001') self.assertEqual(user['name'], 'acs') self.assertEqual(user['profile']['email'], '*****@*****.**')
def test_initialization(self): """Test whether attributes are initializated""" slack = Slack('C011DUKE8', 'aaaa', max_items=5, tag='test') self.assertEqual(slack.origin, 'https://slack.com/C011DUKE8') self.assertEqual(slack.tag, 'test') self.assertEqual(slack.channel, 'C011DUKE8') self.assertEqual(slack.max_items, 5) self.assertIsNone(slack.client) # When tag is empty or None it will be set to # the value in URL slack = Slack('C011DUKE8', 'aaaa') self.assertEqual(slack.origin, 'https://slack.com/C011DUKE8') self.assertEqual(slack.tag, 'https://slack.com/C011DUKE8') slack = Slack('C011DUKE8', 'aaaa', tag='') self.assertEqual(slack.origin, 'https://slack.com/C011DUKE8') self.assertEqual(slack.tag, 'https://slack.com/C011DUKE8')
def test_fetch_empty(self, mock_utcnow): """Test if nothing is returned when there are no messages""" mock_utcnow.return_value = datetime.datetime(2017, 1, 1, tzinfo=dateutil.tz.tzutc()) http_requests = setup_http_server() from_date = datetime.datetime(2016, 1, 1, tzinfo=dateutil.tz.tzutc()) slack = Slack('C011DUKE8', 'aaaa', max_items=5) messages = [msg for msg in slack.fetch(from_date=from_date)] self.assertEqual(len(messages), 0) # Check requests expected = [ { 'channel': ['C011DUKE8'] }, { 'channel': ['C011DUKE8'] }, { 'channel': ['C011DUKE8'], 'cursor': ['dXNlcl9pZDpVNEMwUTZGQTc='] }, { 'channel': ['C011DUKE8'], 'oldest': ['1451606399.999990'], 'latest': ['1483228800.000000'], 'count': ['5'] } ] self.assertEqual(len(http_requests), len(expected)) for i in range(len(expected)): self.assertIn((SlackClient.AUTHORIZATION_HEADER, 'Bearer aaaa'), http_requests[i].headers._headers) self.assertDictEqual(http_requests[i].querystring, expected[i])
def test_search_fields(self, mock_utcnow): """Test whether the search_fields is properly set""" mock_utcnow.return_value = datetime.datetime(2017, 1, 1, tzinfo=dateutil.tz.tzutc()) setup_http_server() slack = Slack('C011DUKE8', 'aaaa', max_items=5) messages = [msg for msg in slack.fetch(from_date=None)] message = messages[0] self.assertEqual(slack.metadata_id(message['data']), message['search_fields']['item_id']) self.assertEqual(message['data']['channel_info']['name'], 'test channel') self.assertEqual(message['data']['channel_info']['name'], message['search_fields']['channel_name']) self.assertEqual(message['data']['channel_info']['id'], 'C011DUKE8') self.assertEqual(message['data']['channel_info']['id'], message['search_fields']['channel_id']) message = messages[1] self.assertEqual(slack.metadata_id(message['data']), message['search_fields']['item_id']) self.assertEqual(message['data']['channel_info']['name'], 'test channel') self.assertEqual(message['data']['channel_info']['name'], message['search_fields']['channel_name']) self.assertEqual(message['data']['channel_info']['id'], 'C011DUKE8') self.assertEqual(message['data']['channel_info']['id'], message['search_fields']['channel_id']) message = messages[2] self.assertEqual(slack.metadata_id(message['data']), message['search_fields']['item_id']) self.assertEqual(message['data']['channel_info']['name'], 'test channel') self.assertEqual(message['data']['channel_info']['name'], message['search_fields']['channel_name']) self.assertEqual(message['data']['channel_info']['id'], 'C011DUKE8') self.assertEqual(message['data']['channel_info']['id'], message['search_fields']['channel_id'])
def test_has_caching(self): """Test if it returns True when has_caching is called""" self.assertEqual(Slack.has_caching(), False)
def test_fetch_from_date(self, mock_utcnow): """Test if it fetches a list of messages since a given date""" mock_utcnow.return_value = datetime.datetime( 2017, 1, 1, tzinfo=dateutil.tz.tzutc()) http_requests = setup_http_server() from_date = datetime.datetime(2015, 3, 23, 18, 35, 40, 69, tzinfo=dateutil.tz.tzutc()) slack = Slack('C011DUKE8', 'aaaa', max_items=5) messages = [msg for msg in slack.fetch(from_date=from_date)] expected = [ ("<@U0003|dizquierdo> has joined the channel", 'bb95a1facf7d61baaf57322f3d6b6d2d45af8aeb', 1427799888.0, '*****@*****.**'), ("tengo el m\u00f3vil", 'f8668de6fadeb5730e0a80d4c8e5d3f8d175f4d5', 1427135890.000071, '*****@*****.**'), ("hey acs", '29c2942a704c4e0b067daeb76edb2f826376cecf', 1427135835.000070, '*****@*****.**') ] self.assertEqual(len(messages), len(expected)) for x in range(len(messages)): message = messages[x] expc = expected[x] self.assertEqual(message['data']['text'], expc[0]) self.assertEqual(message['uuid'], expc[1]) self.assertEqual(message['origin'], 'https://slack.com/C011DUKE8') self.assertEqual(message['updated_on'], expc[2]) self.assertEqual(message['category'], 'message') self.assertEqual(message['tag'], 'https://slack.com/C011DUKE8') self.assertEqual(message['data']['user_data']['profile']['email'], expc[3]) # Check requests expected = [{ 'channel': ['C011DUKE8'], 'oldest': ['1427135740.000068'], 'latest': ['1483228800.0'], 'token': ['aaaa'], 'count': ['5'] }, { 'user': ['U0003'], 'token': ['aaaa'] }, { 'user': ['U0002'], 'token': ['aaaa'] }] self.assertEqual(len(http_requests), len(expected)) for i in range(len(expected)): self.assertDictEqual(http_requests[i].querystring, expected[i])
def test_fetch_from_date(self, mock_utcnow): """Test if it fetches a list of messages since a given date""" mock_utcnow.return_value = datetime.datetime( 2017, 1, 1, tzinfo=dateutil.tz.tzutc()) http_requests = setup_http_server() from_date = datetime.datetime(2015, 3, 23, 18, 35, 40, 69, tzinfo=dateutil.tz.tzutc()) slack = Slack('C011DUKE8', 'aaaa', max_items=5) messages = [msg for msg in slack.fetch(from_date=from_date)] expected = [ ("There are no events this week.", 'b48fd01f4e010597091b7e44cecfb6074f56a1a6', 1486969200.000136, 'B0001', 'test channel'), ("<@U0003|dizquierdo> has joined the channel", 'bb95a1facf7d61baaf57322f3d6b6d2d45af8aeb', 1427799888.0, '*****@*****.**', 'test channel'), ("tengo el m\u00f3vil", 'f8668de6fadeb5730e0a80d4c8e5d3f8d175f4d5', 1427135890.000071, '*****@*****.**', 'test channel'), ("hey acs", '29c2942a704c4e0b067daeb76edb2f826376cecf', 1427135835.000070, '*****@*****.**', 'test channel') ] self.assertEqual(len(messages), len(expected)) for x in range(len(messages)): message = messages[x] expc = expected[x] self.assertEqual(message['data']['text'], expc[0]) self.assertEqual(message['uuid'], expc[1]) self.assertEqual(message['origin'], 'https://slack.com/C011DUKE8') self.assertEqual(message['updated_on'], expc[2]) self.assertEqual(message['category'], 'message') self.assertEqual(message['tag'], 'https://slack.com/C011DUKE8') # The first message was sent by a bot if x == 0: self.assertEqual(message['data']['bot_id'], expc[3]) else: self.assertEqual( message['data']['user_data']['profile']['email'], expc[3]) self.assertEqual(message['data']['channel_info']['name'], expc[4]) self.assertEqual(message['data']['channel_info']['num_members'], 164) # Check requests expected = [{ 'channel': ['C011DUKE8'] }, { 'channel': ['C011DUKE8'] }, { 'channel': ['C011DUKE8'], 'cursor': ['dXNlcl9pZDpVNEMwUTZGQTc='] }, { 'channel': ['C011DUKE8'], 'oldest': ['1427135740.000059'], 'latest': ['1483228800.000000'], 'count': ['5'] }, { 'user': ['U0003'] }, { 'user': ['U0002'] }] self.assertEqual(len(http_requests), len(expected)) for i in range(len(expected)): self.assertIn((SlackClient.AUTHORIZATION_HEADER, 'Bearer aaaa'), http_requests[i].headers._headers) self.assertDictEqual(http_requests[i].querystring, expected[i])
def test_fetch_archived_channel(self, mock_utcnow): """Test if it fetches a list of messages from an archived channel""" mock_utcnow.return_value = datetime.datetime( 2017, 1, 1, tzinfo=dateutil.tz.tzutc()) http_requests = setup_http_server(archived_channel=True) slack = Slack('C011DUKE8', 'aaaa', max_items=5) with self.assertLogs(logger, level='WARNING') as cm: messages = [msg for msg in slack.fetch(from_date=None)] self.assertEqual( cm.output[0], 'WARNING:perceval.backends.core.slack:' 'channel_info.num_members is None for archived channels C011DUKE8' ) expected = [ ("<@U0003|dizquierdo> commented on <@U0002|acs> file>: Thanks.", 'cc2338c23bf5293308d596629c598cd5ec37d14b', 1486999900.000000, '*****@*****.**', 'test channel'), ("There are no events this week.", 'b48fd01f4e010597091b7e44cecfb6074f56a1a6', 1486969200.000136, 'B0001', 'test channel'), ("<@U0003|dizquierdo> has joined the channel", 'bb95a1facf7d61baaf57322f3d6b6d2d45af8aeb', 1427799888.0, '*****@*****.**', 'test channel'), ("tengo el m\u00f3vil", 'f8668de6fadeb5730e0a80d4c8e5d3f8d175f4d5', 1427135890.000071, '*****@*****.**', 'test channel'), ("hey acs", '29c2942a704c4e0b067daeb76edb2f826376cecf', 1427135835.000070, '*****@*****.**', 'test channel'), ("¿vale?", '757e88ea008db0fff739dd261179219aedb84a95', 1427135740.000069, '*****@*****.**', 'test channel'), ("jsmanrique: tenemos que dar m\u00e9tricas super chulas", 'e92555381bc431a53c0b594fc118850eafd6e212', 1427135733.000068, '*****@*****.**', 'test channel'), ("hi!", 'b92892e7b65add0e83d0839de20b2375a42014e8', 1427135689.000067, '*****@*****.**', 'test channel'), ("hi!", 'e59d9ca0d9a2ba1c747dc60a0904edd22d69e20e', 1427135634.000066, '*****@*****.**', 'test channel') ] self.assertEqual(len(messages), len(expected)) for x in range(len(messages)): message = messages[x] expc = expected[x] self.assertEqual(message['data']['text'], expc[0]) self.assertEqual(message['uuid'], expc[1]) self.assertEqual(message['origin'], 'https://slack.com/C011DUKE8') self.assertEqual(message['updated_on'], expc[2]) self.assertEqual(message['category'], 'message') self.assertEqual(message['tag'], 'https://slack.com/C011DUKE8') # The second message was sent by a bot if x == 1: self.assertEqual(message['data']['bot_id'], expc[3]) else: self.assertEqual( message['data']['user_data']['profile']['email'], expc[3]) self.assertEqual(message['data']['channel_info']['name'], expc[4]) self.assertIsNone(message['data']['channel_info']['num_members']) # Check requests expected = [{ 'channel': ['C011DUKE8'] }, { 'channel': ['C011DUKE8'], 'oldest': ['0'], 'latest': ['1483228800.000000'], 'count': ['5'] }, { 'user': ['U0003'] }, { 'user': ['U0002'] }, { 'user': ['U0001'] }, { 'channel': ['C011DUKE8'], 'oldest': ['0'], 'latest': ['1427135733.000068'], 'count': ['5'] }] self.assertEqual(len(http_requests), len(expected)) for i in range(len(expected)): self.assertIn((SlackClient.AUTHORIZATION_HEADER, 'Bearer aaaa'), http_requests[i].headers._headers) self.assertDictEqual(http_requests[i].querystring, expected[i])
def test_has_resuming(self): """Test if it returns False when has_resuming is called""" self.assertEqual(Slack.has_resuming(), False)
def test_has_archiving(self): """Test if it returns True when has_archiving is called""" self.assertEqual(Slack.has_archiving(), True)
def setUp(self): super().setUp() self.backend = Slack('C011DUKE8', 'aaaa', max_items=5, archive=self.archive)
def test_fetch(self, mock_utcnow): """Test if it fetches a list of messages""" mock_utcnow.return_value = datetime.datetime( 2017, 1, 1, tzinfo=dateutil.tz.tzutc()) http_requests = setup_http_server() slack = Slack('C011DUKE8', 'aaaa', max_items=5) messages = [msg for msg in slack.fetch()] expected = [ ("There are no events this week.", 'b48fd01f4e010597091b7e44cecfb6074f56a1a6', 1486969200.000136, 'B0001', 'test channel'), ("<@U0003|dizquierdo> has joined the channel", 'bb95a1facf7d61baaf57322f3d6b6d2d45af8aeb', 1427799888.0, '*****@*****.**', 'test channel'), ("tengo el m\u00f3vil", 'f8668de6fadeb5730e0a80d4c8e5d3f8d175f4d5', 1427135890.000071, '*****@*****.**', 'test channel'), ("hey acs", '29c2942a704c4e0b067daeb76edb2f826376cecf', 1427135835.000070, '*****@*****.**', 'test channel'), ("¿vale?", '757e88ea008db0fff739dd261179219aedb84a95', 1427135740.000069, '*****@*****.**', 'test channel'), ("jsmanrique: tenemos que dar m\u00e9tricas super chulas", 'e92555381bc431a53c0b594fc118850eafd6e212', 1427135733.000068, '*****@*****.**', 'test channel'), ("hi!", 'b92892e7b65add0e83d0839de20b2375a42014e8', 1427135689.000067, '*****@*****.**', 'test channel'), ("hi!", 'e59d9ca0d9a2ba1c747dc60a0904edd22d69e20e', 1427135634.000066, '*****@*****.**', 'test channel') ] self.assertEqual(len(messages), len(expected)) for x in range(len(messages)): message = messages[x] expc = expected[x] self.assertEqual(message['data']['text'], expc[0]) self.assertEqual(message['uuid'], expc[1]) self.assertEqual(message['origin'], 'https://slack.com/C011DUKE8') self.assertEqual(message['updated_on'], expc[2]) self.assertEqual(message['category'], 'message') self.assertEqual(message['tag'], 'https://slack.com/C011DUKE8') # The first message was sent by a bot if x == 0: self.assertEqual(message['data']['bot_id'], expc[3]) else: self.assertEqual( message['data']['user_data']['profile']['email'], expc[3]) self.assertEqual(message['data']['channel_info']['name'], expc[4]) # Check requests expected = [{ 'channel': ['C011DUKE8'], 'token': ['aaaa'] }, { 'channel': ['C011DUKE8'], 'oldest': ['0'], 'latest': ['1483228800.0'], 'token': ['aaaa'], 'count': ['5'] }, { 'user': ['U0003'], 'token': ['aaaa'] }, { 'user': ['U0002'], 'token': ['aaaa'] }, { 'user': ['U0001'], 'token': ['aaaa'] }, { 'channel': ['C011DUKE8'], 'oldest': ['0'], 'latest': ['1427135733.000068'], 'token': ['aaaa'], 'count': ['5'] }] self.assertEqual(len(http_requests), len(expected)) for i in range(len(expected)): self.assertDictEqual(http_requests[i].querystring, expected[i])