mostr-zulip-bot/zulip_bots/zulip_bots/bots/trello/test_trello.py
neiljp (Neil Pilgrim) 6cdb83ce72 bot tests: Adjust TestCase inheritance to avoid need to skip/filter.
Previously the test-bots script filtered out base-class tests from
BotTestCase. With this change, BotTestCase continues to inherit from
unittest.TestCase, but the default test_* methods previously in this
class are now in a new DefaultTests class, which does not. Instead, each
bot needs to inherit from BotTestCase and DefaultTests *explicitly*.

This avoids the need to filter out the base-class tests, which
simplifies the test-bots script, and may ease any migration to eg.
pytest.

The DefaultTests class does require some non-implemented methods which
BotTestCase provides.
2018-06-09 12:49:49 -04:00

110 lines
5.4 KiB
Python

from unittest.mock import patch
from zulip_bots.bots.trello.trello import TrelloHandler
from zulip_bots.test_lib import BotTestCase, DefaultTests
from zulip_bots.test_lib import StubBotHandler
mock_config = {
'api_key': 'TEST',
'access_token': 'TEST',
'user_name': 'TEST'
}
class TestTrelloBot(BotTestCase, DefaultTests):
bot_name = "trello" # type: str
def test_bot_responds_to_empty_message(self) -> None:
with self.mock_config_info(mock_config), patch('requests.get'):
self.verify_reply('', 'Empty Query')
def test_bot_usage(self) -> None:
with self.mock_config_info(mock_config), patch('requests.get'):
self.verify_reply('help', '''
This interactive bot can be used to interact with Trello.
Use `list-commands` to get information about the supported commands.
''')
def test_bot_quit_with_invalid_config(self) -> None:
with self.mock_config_info(mock_config), self.assertRaises(StubBotHandler.BotQuitException):
with self.mock_http_conversation('invalid_key'):
TrelloHandler().initialize(StubBotHandler())
def test_invalid_command(self) -> None:
with self.mock_config_info(mock_config), patch('requests.get'):
self.verify_reply('abcd', 'Command not supported')
def test_list_commands_command(self) -> None:
expected_reply = ('**Commands:** \n'
'1. **help**: Get the bot usage information.\n'
'2. **list-commands**: Get information about the commands supported by the bot.\n'
'3. **get-all-boards**: Get all the boards under the configured account.\n'
'4. **get-all-cards <board_id>**: Get all the cards in the given board.\n'
'5. **get-all-checklists <card_id>**: Get all the checklists in the given card.\n'
'6. **get-all-lists <board_id>**: Get all the lists in the given board.\n')
with self.mock_config_info(mock_config), patch('requests.get'):
self.verify_reply('list-commands', expected_reply)
def test_get_all_boards_command(self) -> None:
with self.mock_config_info(mock_config), patch('requests.get'):
with self.mock_http_conversation('get_all_boards'):
self.verify_reply('get-all-boards', '**Boards:**\n')
with self.mock_http_conversation('get_board_descs'):
bot_instance = TrelloHandler()
bot_instance.initialize(StubBotHandler)
self.assertEqual(bot_instance.get_board_descs(['TEST']), '1.[TEST](TEST) (`TEST`)')
def test_get_all_cards_command(self) -> None:
with self.mock_config_info(mock_config), patch('requests.get'):
with self.mock_http_conversation('get_cards'):
self.verify_reply('get-all-cards TEST', '**Cards:**\n1. [TEST](TEST) (`TEST`)')
def test_get_all_checklists_command(self) -> None:
with self.mock_config_info(mock_config), patch('requests.get'):
with self.mock_http_conversation('get_checklists'):
self.verify_reply('get-all-checklists TEST', '**Checklists:**\n'
'1. `TEST`:\n'
' * [X] TEST_1\n * [X] TEST_2\n'
' * [-] TEST_3\n * [-] TEST_4')
def test_get_all_lists_command(self) -> None:
with self.mock_config_info(mock_config), patch('requests.get'):
with self.mock_http_conversation('get_lists'):
self.verify_reply('get-all-lists TEST', ('**Lists:**\n'
'1. TEST_A\n'
' * TEST_1\n'
'2. TEST_B\n'
' * TEST_2'))
def test_command_exceptions(self) -> None:
"""Add appropriate tests here for all additional commands with try/except blocks.
This ensures consistency."""
expected_error_response = 'Invalid Response. Please check configuration and parameters.'
with self.mock_config_info(mock_config), patch('requests.get'):
with self.mock_http_conversation('exception_boards'):
self.verify_reply('get-all-boards', expected_error_response)
with self.mock_http_conversation('exception_cards'):
self.verify_reply('get-all-cards TEST', expected_error_response)
with self.mock_http_conversation('exception_checklists'):
self.verify_reply('get-all-checklists TEST', expected_error_response)
with self.mock_http_conversation('exception_lists'):
self.verify_reply('get-all-lists TEST', expected_error_response)
def test_command_invalid_arguments(self) -> None:
"""Add appropriate tests here for all additional commands with more than one arguments.
This ensures consistency."""
expected_error_response = 'Invalid Arguments.'
with self.mock_config_info(mock_config), patch('requests.get'):
self.verify_reply('get-all-cards', expected_error_response)
self.verify_reply('get-all-checklists', expected_error_response)
self.verify_reply('get-all-lists', expected_error_response)