Change checking auth_token in `initialize` method by calling request to get user's information instead of calling POST request which modifies progress of user's goal.
108 lines
5.2 KiB
Python
108 lines
5.2 KiB
Python
from unittest.mock import patch, Mock
|
|
from zulip_bots.test_lib import StubBotHandler, BotTestCase, get_bot_message_handler
|
|
from requests.exceptions import ConnectionError
|
|
|
|
class TestBeeminderBot(BotTestCase):
|
|
bot_name = "beeminder"
|
|
normal_config = {
|
|
"auth_token": "XXXXXX",
|
|
"username": "aaron",
|
|
"goalname": "goal"
|
|
}
|
|
|
|
help_message = '''
|
|
You can add datapoints towards your beeminder goals \
|
|
following the syntax shown below :smile:.\n \
|
|
\n**@mention-botname daystamp, value, comment**\
|
|
\n* `daystamp`**:** *yyyymmdd* \
|
|
[**NOTE:** Optional field, default is *current daystamp*],\
|
|
\n* `value`**:** Enter a value [**NOTE:** Required field, can be any number],\
|
|
\n* `comment`**:** Add a comment [**NOTE:** Optional field, default is *None*]\
|
|
'''
|
|
|
|
def test_bot_responds_to_empty_message(self) -> None:
|
|
with self.mock_config_info(self.normal_config), \
|
|
self.mock_http_conversation('test_valid_auth_token'):
|
|
self.verify_reply('', self.help_message)
|
|
|
|
def test_help_message(self) -> None:
|
|
with self.mock_config_info(self.normal_config), \
|
|
self.mock_http_conversation('test_valid_auth_token'):
|
|
self.verify_reply('help', self.help_message)
|
|
|
|
def test_message_with_daystamp_and_value(self) -> None:
|
|
bot_response = '[Datapoint](https://www.beeminder.com/aaron/goal) created.'
|
|
with self.mock_config_info(self.normal_config), \
|
|
self.mock_http_conversation('test_valid_auth_token'), \
|
|
self.mock_http_conversation('test_message_with_daystamp_and_value'):
|
|
self.verify_reply('20180602, 2', bot_response)
|
|
|
|
def test_message_with_value_and_comment(self) -> None:
|
|
bot_response = '[Datapoint](https://www.beeminder.com/aaron/goal) created.'
|
|
with self.mock_config_info(self.normal_config), \
|
|
self.mock_http_conversation('test_valid_auth_token'), \
|
|
self.mock_http_conversation('test_message_with_value_and_comment'):
|
|
self.verify_reply('2, hi there!', bot_response)
|
|
|
|
def test_message_with_daystamp_and_value_and_comment(self) -> None:
|
|
bot_response = '[Datapoint](https://www.beeminder.com/aaron/goal) created.'
|
|
with self.mock_config_info(self.normal_config), \
|
|
self.mock_http_conversation('test_valid_auth_token'), \
|
|
self.mock_http_conversation('test_message_with_daystamp_and_value_and_comment'):
|
|
self.verify_reply('20180602, 2, hi there!', bot_response)
|
|
|
|
def test_syntax_error(self) -> None:
|
|
with self.mock_config_info(self.normal_config), \
|
|
self.mock_http_conversation('test_valid_auth_token'):
|
|
bot_response = "Make sure you follow the syntax.\n You can take a look \
|
|
at syntax by: @mention-botname help"
|
|
self.verify_reply("20180303, 50, comment, redundant comment", bot_response)
|
|
|
|
def test_connection_error_when_handle_message(self) -> None:
|
|
with self.mock_config_info(self.normal_config), \
|
|
self.mock_http_conversation('test_valid_auth_token'), \
|
|
patch('requests.post', side_effect=ConnectionError()), \
|
|
patch('logging.exception'):
|
|
self.verify_reply('?$!', 'Uh-Oh, couldn\'t process the request \
|
|
right now.\nPlease try again later')
|
|
|
|
def test_invalid_when_handle_message(self) -> None:
|
|
bot = get_bot_message_handler(self.bot_name)
|
|
bot_handler = StubBotHandler()
|
|
|
|
with self.mock_config_info({'auth_token': 'someInvalidKey',
|
|
'username': 'aaron',
|
|
'goalname': 'goal'}), \
|
|
patch('requests.get', side_effect=ConnectionError()), \
|
|
self.mock_http_conversation('test_invalid_when_handle_message'), \
|
|
patch('logging.exception'):
|
|
self.verify_reply('5', 'Error. Check your key!')
|
|
|
|
def test_error(self) -> None:
|
|
bot_request = 'notNumber'
|
|
bot_response = "Error occured : 422"
|
|
with self.mock_config_info(self.normal_config), \
|
|
self.mock_http_conversation('test_valid_auth_token'), \
|
|
self.mock_http_conversation('test_error'):
|
|
self.verify_reply(bot_request, bot_response)
|
|
|
|
def test_invalid_when_initialize(self) -> None:
|
|
bot = get_bot_message_handler(self.bot_name)
|
|
bot_handler = StubBotHandler()
|
|
|
|
with self.mock_config_info({'auth_token': 'someInvalidKey',
|
|
'username': 'aaron',
|
|
'goalname': 'goal'}), \
|
|
self.mock_http_conversation('test_invalid_when_initialize'), \
|
|
self.assertRaises(bot_handler.BotQuitException):
|
|
bot.initialize(bot_handler)
|
|
|
|
def test_connection_error_during_initialize(self) -> None:
|
|
bot = get_bot_message_handler(self.bot_name)
|
|
bot_handler = StubBotHandler()
|
|
|
|
with self.mock_config_info(self.normal_config), \
|
|
patch('requests.get', side_effect=ConnectionError()), \
|
|
patch('logging.exception') as mock_logging:
|
|
bot.initialize(bot_handler)
|
|
self.assertTrue(mock_logging.called)
|