python-zulip-api/zulip_botserver/tests/test_server.py
Robert Hönig e6ef34a964 botserver: Strip messages like we do in zulip-run-bot.
Previously, messages weren't stripped at all. This
caused most bots to break and send replies similar to
"I didn't understand your command". Nobody noticed,
because the tests were only validating that replies
were sent, but not the content in them. Thus, this
commit also adds tests to avoid further regressions.
2018-05-29 10:05:19 +02:00

139 lines
5.9 KiB
Python

import mock
import os
from typing import Any, Dict
import unittest
from .server_test_lib import BotServerTestCase
import six
import json
from zulip_botserver import server
from zulip_botserver.input_parameters import parse_args
class BotServerTests(BotServerTestCase):
class MockMessageHandler(object):
def handle_message(self, message: Dict[str, str], bot_handler: Any) -> None:
assert message == {'key': "test message"}
class MockLibModule(object):
def handler_class(self) -> Any:
return BotServerTests.MockMessageHandler()
def test_successful_request(self) -> None:
available_bots = ['helloworld']
bots_config = {
'helloworld': {
'email': 'helloworld-bot@zulip.com',
'key': '123456789qwertyuiop',
'site': 'http://localhost',
}
}
self.assert_bot_server_response(available_bots=available_bots,
bots_config=bots_config,
event=dict(message={'content': "@**test** test message"},
bot_email='helloworld-bot@zulip.com',
trigger='mention'),
expected_response="beep boop",
check_success=True)
def test_successful_request_from_two_bots(self) -> None:
available_bots = ['helloworld', 'help']
bots_config = {
'helloworld': {
'email': 'helloworld-bot@zulip.com',
'key': '123456789qwertyuiop',
'site': 'http://localhost',
},
'help': {
'email': 'help-bot@zulip.com',
'key': '123456789qwertyuiop',
'site': 'http://localhost',
}
}
self.assert_bot_server_response(available_bots=available_bots,
event=dict(message={'content': "@**test** test message"},
bot_email='helloworld-bot@zulip.com',
trigger='mention'),
expected_response="beep boop",
bots_config=bots_config,
check_success=True)
def test_request_for_unkown_bot(self) -> None:
bots_config = {
'helloworld': {
'email': 'helloworld-bot@zulip.com',
'key': '123456789qwertyuiop',
'site': 'http://localhost',
},
}
self.assert_bot_server_response(available_bots=['helloworld'],
event=dict(message={'content': "test message"},
bot_email='unknown-bot@zulip.com'),
bots_config=bots_config,
check_success=False)
@mock.patch('logging.error')
@mock.patch('zulip_bots.lib.StateHandler')
def test_wrong_bot_credentials(self, mock_StateHandler: mock.Mock, mock_LoggingError: mock.Mock) -> None:
available_bots = ['nonexistent-bot']
bots_config = {
'nonexistent-bot': {
'email': 'helloworld-bot@zulip.com',
'key': '123456789qwertyuiop',
'site': 'http://localhost',
}
}
# TODO: The following passes mypy, though the six stubs don't match the
# unittest ones, so we could file a mypy bug to improve this.
six.assertRaisesRegex(self,
ImportError,
"Bot \"nonexistent-bot\" doesn't exists. Please "
"make sure you have set up the flaskbotrc file correctly.",
lambda: self.assert_bot_server_response(
available_bots=available_bots,
event=dict(message={'content': "@**test** test message"},
bot_email='helloworld-bot@zulip.com',
trigger='mention'),
bots_config=bots_config))
@mock.patch('sys.argv', ['zulip-bot-server', '--config-file', '/foo/bar/baz.conf'])
def test_argument_parsing_defaults(self) -> None:
opts = parse_args()
assert opts.config_file == '/foo/bar/baz.conf'
assert opts.bot_name is None
assert opts.bot_config_file is None
assert opts.hostname == '127.0.0.1'
assert opts.port == 5002
def test_read_config_file(self) -> None:
with self.assertRaises(IOError):
server.read_config_file("nonexistentfile.conf")
current_dir = os.path.dirname(os.path.abspath(__file__))
bot_conf1 = server.read_config_file(os.path.join(current_dir, "test.conf"))
expected_config1 = {
'helloworld': {
'email': 'helloworld-bot@zulip.com',
'key': 'value',
'site': 'http://localhost',
},
'giphy': {
'email': 'giphy-bot@zulip.com',
'key': 'value2',
'site': 'http://localhost',
}
}
assert json.dumps(bot_conf1, sort_keys=True) == json.dumps(expected_config1, sort_keys=True)
bot_conf2 = server.read_config_file(os.path.join(current_dir, "test.conf"), "redefined_bot")
expected_config2 = {
'redefined_bot': {
'email': 'helloworld-bot@zulip.com',
'key': 'value',
'site': 'http://localhost',
}
}
assert json.dumps(bot_conf2, sort_keys=True) == json.dumps(expected_config2, sort_keys=True)
if __name__ == '__main__':
unittest.main()