diff --git a/contrib_bots/__init__.py b/contrib_bots/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/contrib_bots/bots/define/__init__.py b/contrib_bots/bots/define/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/contrib_bots/bots/define/test_define.py b/contrib_bots/bots/define/test_define.py new file mode 100644 index 0000000..a526751 --- /dev/null +++ b/contrib_bots/bots/define/test_define.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python + +from __future__ import absolute_import +from __future__ import print_function + +import os +import sys +import unittest +from unittest import TestCase + +our_dir = os.path.dirname(os.path.abspath(__file__)) + +# For dev setups, we can find the API in the repo itself. +if os.path.exists(os.path.join(our_dir, '..')): + sys.path.insert(0, '..') +from bots_test_lib import BotTestCase + +class TestDefineBot(TestCase): + + # Messages to be sent to bot for testing. + # Eventually more test messages can be added. + def request_messages(self): + # type: None -> List[Dict[str, str]] + messages = [] + message1 = {'content': "foo", 'type': "private", 'sender_email': "foo"} + message2 = {'content': "cat", 'type': "stream", 'display_recipient': "foo", 'subject': "foo"} + messages.append(message1) + messages.append(message2) + return messages + + # Reply messages from the test bot. + # Each reply message corresponding to each request message. + def bot_response_messages(self): + # type: None -> List[str] + messages = [] + message1 = "**foo**:\nDefinition not available." + message2 = ("**cat**:\n\n* (**noun**) a small domesticated carnivorous mammal " + "with soft fur, a short snout, and retractile claws. It is widely " + "kept as a pet or for catching mice, and many breeds have been " + "developed.\n  their pet cat\n\n") + messages.append(message1) + messages.append(message2) + return messages + + def test_define(self): + # type: None -> None + # Edit bot_module to test different bots, the below code can be looped for all the bots. + bot_module = "./bots/define/define.py" + messages = self.request_messages() + bot_response = self.bot_response_messages() + test_case = BotTestCase() + test_case.bot_test(messages=messages, bot_module=bot_module, bot_response=bot_response) diff --git a/contrib_bots/bots_test_lib.py b/contrib_bots/bots_test_lib.py new file mode 100644 index 0000000..3d17463 --- /dev/null +++ b/contrib_bots/bots_test_lib.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +from __future__ import absolute_import +from __future__ import print_function + +import os +import sys +import unittest + +from mock import MagicMock, patch +from unittest import TestCase + +from run import get_lib_module +from bot_lib import StateHandler +from contrib_bots import bot_lib +from six.moves import zip + +class BotTestCase(TestCase): + + def mock_test(self, messages, message_handler, bot_response): + # type: (List[Dict[str, str]], Function) -> None + # Mocking BotHandlerApi + with patch('contrib_bots.bot_lib.BotHandlerApi') as MockClass: + instance = MockClass.return_value + + for (message, response) in zip(messages, bot_response): + # Send message to the concerned bot + message_handler.handle_message(message, MockClass(), StateHandler()) + + # Check if BotHandlerApi is sending a reply message. + # This can later be modified to assert the contents of BotHandlerApi.send_message + instance.send_reply.assert_called_with(message, response) + + def bot_to_run(self, bot_module): + # type: None -> Function + lib_module = get_lib_module(bot_module) + message_handler = lib_module.handler_class() + return message_handler + + def bot_test(self, messages, bot_module, bot_response): + + message_handler = self.bot_to_run(bot_module) + self.mock_test(messages=messages, message_handler=message_handler, bot_response=bot_response) diff --git a/contrib_bots/run.py b/contrib_bots/run.py index 3df9fc2..21d1093 100755 --- a/contrib_bots/run.py +++ b/contrib_bots/run.py @@ -1,5 +1,6 @@ #!/usr/bin/env python from __future__ import print_function +from __future__ import absolute_import import importlib import logging diff --git a/contrib_bots/test-bots b/contrib_bots/test-bots new file mode 100755 index 0000000..f26f5de --- /dev/null +++ b/contrib_bots/test-bots @@ -0,0 +1,28 @@ +#!/usr/bin/env python + +from __future__ import absolute_import +from __future__ import print_function + +import os +import sys +import unittest +from unittest import TestCase + +if __name__ == '__main__': + + def dir_join(dir1, dir2): + # type: (str, str) -> str + return os.path.abspath(os.path.join(dir1, dir2)) + + bots_dir = os.path.dirname(os.path.abspath(__file__)) + root_dir = dir_join(bots_dir, '..') + bots_test_dir = dir_join(bots_dir, 'bots') + + sys.path.insert(0, root_dir) + + loader = unittest.TestLoader() + suite = loader.discover(start_dir=bots_test_dir, top_level_dir=root_dir) + runner = unittest.TextTestRunner(verbosity=2) + result = runner.run(suite) + if result.errors or result.failures: + raise Exception('Test failed!')