def test_on_message_fan(self): logging.info('*** on_message/fan ***') self.engine.set('bot.id', '*not*for*me') class MyFan(object): def __init__(self): self.called = False def put(self, arguments): self.called = True self.bot.fan = MyFan() listener = Listener(engine=self.engine) listener.DEFER_DURATION = 0.0 listener.on_message(my_message) self.assertFalse(self.bot.fan.called) label = 'fan.' + my_message.channel_id logging.debug(u"- stamping '{}'".format(label)) self.engine.set(label, time.time()) listener.on_message(my_message) self.assertTrue(self.bot.fan.called)
def test_dynamic(self): logging.info('*** Dynamic test ***') items = [ { "id": "1_lzY29zcGFyazovL3VzL01FU1NBR0UvOTJkYjNiZTAtNDNiZC0xMWU2LThhZTktZGQ1YjNkZmM1NjVk", "channel_id": "Y2lzY29zcGFyazovL3VzL1JPT00vYmJjZWIxYWQtNDNmMS0zYjU4LTkxNDctZjE0YmIwYzRkMTU0", "roomType": "group", "toPersonId": "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mMDZkNzFhNS0wODMzLTRmYTUtYTcyYS1jYzg5YjI1ZWVlMmX", "toPersonEmail": "*****@*****.**", "text": "PROJECT UPDATE - A new project plan has been published on Box: http://box.com/s/lf5vj. The PM for this project is Mike C. and the Engineering Manager is Jane W.", "markdown": "**PROJECT UPDATE** A new project plan has been published [on Box](http://box.com/s/lf5vj). The PM for this project is <@personEmail:[email protected]> and the Engineering Manager is <@personEmail:[email protected]>.", "files": ["http://www.example.com/images/media.png"], "personId": "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mNWIzNjE4Ny1jOGRkLTQ3MjctOGIyZi1mOWM0NDdmMjkwNDY", "personEmail": "*****@*****.**", "stamp": "2015-10-18T14:26:16+00:00", "mentionedPeople": [ "Y2lzY29zcGFyazovL3VzL1BFT1BMRS8yNDlmNzRkOS1kYjhhLTQzY2EtODk2Yi04NzllZDI0MGFjNTM", "Y2lzY29zcGFyazovL3VzL1BFT1BMRS83YWYyZjcyYy0xZDk1LTQxZjAtYTcxNi00MjlmZmNmYmM0ZDg" ], "from_id": "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mNWIzNjE4Ny1jOGRkLTQ3MjctOGIyZi1mOWM0NDdmMjkwNDY", }, { "id": "2_2lzY29zcGFyazovL3VzL01FU1NBR0UvOTJkYjNiZTAtNDNiZC0xMWU2LThhZTktZGQ1YjNkZmM1NjVk", "channel_id": "Y2lzY29zcGFyazovL3VzL1JPT00vYmJjZWIxYWQtNDNmMS0zYjU4LTkxNDctZjE0YmIwYzRkMTU0", "roomType": "group", "toPersonId": "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mMDZkNzFhNS0wODMzLTRmYTUtYTcyYS1jYzg5YjI1ZWVlMmX", "toPersonEmail": "*****@*****.**", "text": "/shelly version", "personId": "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mNWIzNjE4Ny1jOGRkLTQ3MjctOGIyZi1mOWM0NDdmMjkwNDY", "personEmail": "*****@*****.**", "stamp": "2015-10-18T14:26:16+00:00", "mentionedPeople": [ "Y2lzY29zcGFyazovL3VzL1BFT1BMRS8yNDlmNzRkOS1kYjhhLTQzY2EtODk2Yi04NzllZDI0MGFjNTM", "Y2lzY29zcGFyazovL3VzL1BFT1BMRS83YWYyZjcyYy0xZDk1LTQxZjAtYTcxNi00MjlmZmNmYmM0ZDg" ], "from_id": "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mNWIzNjE4Ny1jOGRkLTQ3MjctOGIyZi1mOWM0NDdmMjkwNDY", "mentioned_ids": [ "Y2lzY29zcGFyazovL3VzL1BFT1BMRS8yNDlmNzRkOS1kYjhhLTQzY2EtODk2Yi04NzllZDI0MGFjNTM", "Y2lzY29zcGFyazovL3VzL1BFT1BMRS83YWYyZjcyYy0xZDk1LTQxZjAtYTcxNi00MjlmZmNmYmM0ZDg" ], }, { "id": "2_2lzY29zcGFyazovL3VzL01FU1NBR0UvOTJkYjNiZTAtNDNiZC0xMWU2LThhZTktZGQ1YjNkZmM1NjVk", "channel_id": "Y2lzY29zcGFyazovL3VzL1JPT00vYmJjZWIxYWQtNDNmMS0zYjU4LTkxNDctZjE0YmIwYzRkMTU0", "roomType": "group", "toPersonId": "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mMDZkNzFhNS0wODMzLTRmYTUtYTcyYS1jYzg5YjI1ZWVlMmX", "toPersonEmail": "*****@*****.**", "text": "", "personId": "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mNWIzNjE4Ny1jOGRkLTQ3MjctOGIyZi1mOWM0NDdmMjkwNDY", "personEmail": "*****@*****.**", "stamp": "2015-10-18T14:26:16+00:00", "mentionedPeople": [ "Y2lzY29zcGFyazovL3VzL1BFT1BMRS8yNDlmNzRkOS1kYjhhLTQzY2EtODk2Yi04NzllZDI0MGFjNTM", "Y2lzY29zcGFyazovL3VzL1BFT1BMRS83YWYyZjcyYy0xZDk1LTQxZjAtYTcxNi00MjlmZmNmYmM0ZDg" ], "from_id": "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mNWIzNjE4Ny1jOGRkLTQ3MjctOGIyZi1mOWM0NDdmMjkwNDY", "mentioned_ids": [ "Y2lzY29zcGFyazovL3VzL1BFT1BMRS8yNDlmNzRkOS1kYjhhLTQzY2EtODk2Yi04NzllZDI0MGFjNTM", "Y2lzY29zcGFyazovL3VzL1BFT1BMRS83YWYyZjcyYy0xZDk1LTQxZjAtYTcxNi00MjlmZmNmYmM0ZDg" ], }, { "id": "3_2lzY29zcGFyazovL3VzL01FU1NBR0UvOTJkYjNiZTAtNDNiZC0xMWU2LThhZTktZGQ1YjNkZmM1NjVk", "channel_id": "Y2lzY29zcGFyazovL3VzL1JPT00vYmJjZWIxYWQtNDNmMS0zYjU4LTkxNDctZjE0YmIwYzRkMTU0", "roomType": "group", "toPersonId": "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mMDZkNzFhNS0wODMzLTRmYTUtYTcyYS1jYzg5YjI1ZWVlMmX", "toPersonEmail": "*****@*****.**", "text": "@shelly help", "personId": "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mNWIzNjE4Ny1jOGRkLTQ3MjctOGIyZi1mOWM0NDdmMjkwNDY", "personEmail": "*****@*****.**", "stamp": "2015-10-18T14:26:16+00:00", "mentionedPeople": [ "Y2lzY29zcGFyazovL3VzL1BFT1BMRS8yNDlmNzRkOS1kYjhhLTQzY2EtODk2Yi04NzllZDI0MGFjNTM", "Y2lzY29zcGFyazovL3VzL1BFT1BMRS83YWYyZjcyYy0xZDk1LTQxZjAtYTcxNi00MjlmZmNmYmM0ZDg" ], "from_id": "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mNWIzNjE4Ny1jOGRkLTQ3MjctOGIyZi1mOWM0NDdmMjkwNDY", "mentioned_ids": [ "Y2lzY29zcGFyazovL3VzL1BFT1BMRS8yNDlmNzRkOS1kYjhhLTQzY2EtODk2Yi04NzllZDI0MGFjNTM", "Y2lzY29zcGFyazovL3VzL1BFT1BMRS83YWYyZjcyYy0xZDk1LTQxZjAtYTcxNi00MjlmZmNmYmM0ZDg" ], }, { "id": "3_2lzY29zcGFyazovL3VzL01FU1NBR0UvOTJkYjNiZTAtNDNiZC0xMWU2LThhZTktZGQ1YjNkZmM1NjVk", "channel_id": "Y2lzY29zcGFyazovL3VzL1JPT00vYmJjZWIxYWQtNDNmMS0zYjU4LTkxNDctZjE0YmIwYzRkMTU0", "roomType": "group", "toPersonId": "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mMDZkNzFhNS0wODMzLTRmYTUtYTcyYS1jYzg5YjI1ZWVlMmX", "toPersonEmail": "*****@*****.**", "text": "!shelly help help", "personId": "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mNWIzNjE4Ny1jOGRkLTQ3MjctOGIyZi1mOWM0NDdmMjkwNDY", "personEmail": "*****@*****.**", "stamp": "2015-10-18T14:26:16+00:00", "mentionedPeople": [ "Y2lzY29zcGFyazovL3VzL1BFT1BMRS8yNDlmNzRkOS1kYjhhLTQzY2EtODk2Yi04NzllZDI0MGFjNTM", "Y2lzY29zcGFyazovL3VzL1BFT1BMRS83YWYyZjcyYy0xZDk1LTQxZjAtYTcxNi00MjlmZmNmYmM0ZDg" ], "from_id": "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mNWIzNjE4Ny1jOGRkLTQ3MjctOGIyZi1mOWM0NDdmMjkwNDY", "mentioned_ids": [ "Y2lzY29zcGFyazovL3VzL1BFT1BMRS8yNDlmNzRkOS1kYjhhLTQzY2EtODk2Yi04NzllZDI0MGFjNTM", "Y2lzY29zcGFyazovL3VzL1BFT1BMRS83YWYyZjcyYy0xZDk1LTQxZjAtYTcxNi00MjlmZmNmYmM0ZDg" ], }, { "id": "4_2lzY29zcGFyazovL3VzL01FU1NBR0UvOTJkYjNiZTAtNDNiZC0xMWU2LThhZTktZGQ1YjNkZmM1NjVk", "channel_id": "Y2lzY29zcGFyazovL3VzL1JPT00vYmJjZWIxYWQtNDNmMS0zYjU4LTkxNDctZjE0YmIwYzRkMTU0", "roomType": "group", "toPersonId": "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mMDZkNzFhNS0wODMzLTRmYTUtYTcyYS1jYzg5YjI1ZWVlMmX", "toPersonEmail": "*****@*****.**", "text": "PROJECT UPDATE - A new project plan has been published on Box: http://box.com/s/lf5vj. The PM for this project is Mike C. and the Engineering Manager is Jane W.", "markdown": "**PROJECT UPDATE** A new project plan has been published [on Box](http://box.com/s/lf5vj). The PM for this project is <@personEmail:[email protected]> and the Engineering Manager is <@personEmail:[email protected]>.", "files": ["http://www.example.com/images/media.png"], "personId": "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mNWIzNjE4Ny1jOGRkLTQ3MjctOGIyZi1mOWM0NDdmMjkwNDY", "personEmail": "*****@*****.**", "stamp": "2015-10-18T14:26:16+00:00", "mentionedPeople": [ "Y2lzY29zcGFyazovL3VzL1BFT1BMRS8yNDlmNzRkOS1kYjhhLTQzY2EtODk2Yi04NzllZDI0MGFjNTM", "Y2lzY29zcGFyazovL3VzL1BFT1BMRS83YWYyZjcyYy0xZDk1LTQxZjAtYTcxNi00MjlmZmNmYmM0ZDg" ], "from_id": "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mNWIzNjE4Ny1jOGRkLTQ3MjctOGIyZi1mOWM0NDdmMjkwNDY", "mentioned_ids": [ "Y2lzY29zcGFyazovL3VzL1BFT1BMRS8yNDlmNzRkOS1kYjhhLTQzY2EtODk2Yi04NzllZDI0MGFjNTM" ], }, { "id": "Y2lzY29zcGFyazovL3VzL01FU1NB0xMWU3LTljODctNTljZjJjNDRhYmIy", "roomId": "Y2lzY29zcGFyazovL3VzL1JP0zY2VmLWJiNDctOTZlZjA1NmJhYzFl", "roomType": "direct", "text": "test", "stamp": "2017-07-22T16:49:22.008Z", "hook": "shellbot-messages", "personEmail": "*****@*****.**", "personId": "Y2lzY29zcGFyazovL3VzL1LTQ5YzQtYTIyYi1mYWYwZWQwMjkyMzU", "content": "test", "from_id": 'Y2lzY29zcGFyazovL3VzL1LTQ5YzQtYTIyYi1mYWYwZWQwMjkyMzU', "from_label": '*****@*****.**', 'is_direct': True, "mentioned_ids": [], "channel_id": 'Y2lzY29zcGFyazovL3VzL1JP0zY2VmLWJiNDctOTZlZjA1NmJhYzFl', }, ] for item in items: self.engine.ears.put(str(Message(item))) self.engine.ears.put(None) tee = Queue() def filter(item): tee.put(str(item)) return item listener = Listener(engine=self.engine, filter=filter) listener.DEFER_DURATION = 0.0 listener.run() time.sleep(0.01) self.assertEqual(self.engine.get('listener.counter'), 7) with self.assertRaises(Exception): self.engine.ears.get_nowait() self.assertEqual(self.engine.mouth.get_nowait().text, 'Shelly version *unknown*') self.assertEqual( self.engine.mouth.get_nowait().text, u'Available commands:\n' + u'help - Show commands and usage') self.assertEqual( self.engine.mouth.get_nowait().text, u'Available commands:\n' + u'help - Show commands and usage') self.assertEqual( self.engine.mouth.get_nowait().text, u'help - Show commands and usage\nusage: help <command>') self.assertEqual(self.engine.mouth.get_nowait().text, u"Sorry, I do not know how to handle 'test'") with self.assertRaises(Exception): print(self.engine.mouth.get_nowait()) self.maxDiff = None for item in items: item.update({'type': 'message'}) self.assertEqual(yaml.safe_load(tee.get()), item) with self.assertRaises(Exception): print(tee.get_nowait())
def test_static(self): logging.info('*** Static test ***') listener = Listener(engine=self.engine) listener.DEFER_DURATION = 0.0 listener.start() listener.join(0.1) if listener.is_alive(): logging.info('Stopping listener') self.engine.set('general.switch', 'off') listener.join() self.assertFalse(listener.is_alive()) self.assertEqual(self.engine.get('listener.counter', 0), 0)
def test_on_inbound(self): logging.info('*** on_inbound ***') listener = Listener(engine=self.engine) listener.DEFER_DURATION = 0.0 with self.assertRaises(AssertionError): listener.on_inbound(my_message) with self.assertRaises(AssertionError): listener.on_inbound(my_private_message) with self.assertRaises(AssertionError): listener.on_inbound(my_join) with self.assertRaises(AssertionError): listener.on_inbound(my_leave) listener.on_inbound(my_event) with mock.patch.object(self.engine, 'dispatch', return_value=None) as mocked: listener.on_inbound(my_event) self.assertTrue(mocked.called)
def test_on_leave(self): logging.info('*** on_leave ***') class Handler(object): def __init__(self): self.out = False self.left = False def on_exit(self, **kwargs): self.out = True def on_leave(self, **kwargs): self.left = True handler = Handler() self.engine.register('exit', handler) self.engine.register('leave', handler) listener = Listener(engine=self.engine) listener.DEFER_DURATION = 0.0 with self.assertRaises(AssertionError): listener.on_leave(my_message) with self.assertRaises(AssertionError): listener.on_leave(my_private_message) with self.assertRaises(AssertionError): listener.on_leave(my_join) self.assertFalse(handler.out) self.assertFalse(handler.left) listener.on_leave(my_exit) self.assertTrue(handler.out) self.assertFalse(handler.left) listener.on_leave(my_leave) self.assertTrue(handler.out) self.assertTrue(handler.left) with self.assertRaises(AssertionError): listener.on_leave(my_event) with mock.patch.object(self.engine, 'dispatch', return_value=None) as mocked: listener.on_leave(my_leave) self.assertTrue(mocked.called)
def test_process_filter(self): logging.info('*** process/filter ***') class Mocked(object): def filter(self, event): event.flag = True text = event.get('text') if text: event.text = text.title() self.event = event return event mocked = Mocked() listener = Listener(engine=self.engine, filter=mocked.filter) listener.DEFER_DURATION = 0.0 self.engine.set('listener.counter', 22) mocked.event = None listener.process(str(my_message)) self.assertEqual(self.engine.get('listener.counter'), 23) self.assertEqual( mocked.event.text, 'The Pm For This Project Is Mike C. And The Engineering Manager Is Jane W.' ) self.assertTrue(mocked.event.flag) listener.process(str(my_private_message)) self.assertEqual(self.engine.get('listener.counter'), 24) self.assertEqual(mocked.event.text, 'Test') self.assertTrue(mocked.event.flag) mocked.event = None listener.process(str(my_join)) self.assertEqual(self.engine.get('listener.counter'), 25) self.assertTrue(mocked.event.flag) mocked.event = None listener.process(str(my_leave)) self.assertEqual(self.engine.get('listener.counter'), 26) self.assertTrue(mocked.event.flag) mocked.event = None listener.process(str(my_event)) self.assertEqual(self.engine.get('listener.counter'), 27) self.assertTrue(mocked.event.flag)
def test_process(self): logging.info('*** process ***') listener = Listener(engine=self.engine) listener.DEFER_DURATION = 0.0 self.engine.set('listener.counter', 22) with self.assertRaises(AssertionError): listener.process('hello world') self.assertEqual(self.engine.get('listener.counter'), 23) listener.on_message = mock.Mock() listener.process(str(my_message)) self.assertEqual(self.engine.get('listener.counter'), 24) self.assertTrue(listener.on_message.called) listener.on_message = mock.Mock() listener.process(str(my_private_message)) self.assertEqual(self.engine.get('listener.counter'), 25) self.assertTrue(listener.on_message.called) listener.on_join = mock.Mock() listener.process(str(my_join)) self.assertEqual(self.engine.get('listener.counter'), 26) self.assertTrue(listener.on_join.called) listener.on_leave = mock.Mock() listener.process(str(my_leave)) self.assertEqual(self.engine.get('listener.counter'), 27) self.assertTrue(listener.on_leave.called) listener.on_inbound = mock.Mock() listener.process(str(my_event)) self.assertEqual(self.engine.get('listener.counter'), 28) self.assertTrue(listener.on_inbound.called)
def test_work(self): logging.info("*** run") self.engine.set('general.switch', 'on') listener = Listener(engine=self.engine) listener.DEFER_DURATION = 0.0 listener.process = mock.Mock(side_effect=Exception('TEST')) self.engine.ears.put(('dummy')) self.engine.ears.put(None) listener.run() self.assertEqual(self.engine.get('listener.counter'), 0) listener = Listener(engine=self.engine) listener.DEFER_DURATION = 0.0 listener.process = mock.Mock(side_effect=KeyboardInterrupt('ctl-C')) self.engine.ears.put(('dummy')) listener.run() self.assertEqual(self.engine.get('listener.counter'), 0)