diff --git a/zulip_bots/zulip_bots/bots/dropbox_share/test_dropbox_share.py b/zulip_bots/zulip_bots/bots/dropbox_share/test_dropbox_share.py index bb85dd1..8b36a5d 100644 --- a/zulip_bots/zulip_bots/bots/dropbox_share/test_dropbox_share.py +++ b/zulip_bots/zulip_bots/bots/dropbox_share/test_dropbox_share.py @@ -11,7 +11,7 @@ from zulip_bots.bots.dropbox_share.test_util import ( MockHttpResponse ) -def get_files_list(*args, **kwargs): +def get_root_files_list(*args, **kwargs): return MockListFolderResult( entries = [ MockFileMetadata('foo', '/foo'), @@ -20,6 +20,21 @@ def get_files_list(*args, **kwargs): has_more = False ) +def get_folder_files_list(*args, **kwargs): + return MockListFolderResult( + entries = [ + MockFileMetadata('moo', '/foo/moo'), + MockFileMetadata('noo', '/foo/noo'), + ], + has_more = False + ) + +def get_empty_files_list(*args, **kwargs): + return MockListFolderResult( + entries = [], + has_more = False + ) + def create_file(*args, **kwargs): return MockFileMetadata('foo', '/foo') @@ -36,6 +51,9 @@ def search_files(*args, **kwargs): ) ]) +def get_empty_search_result(*args, **kwargs): + return MockSearchResult([]) + def get_shared_link(*args, **kwargs): return MockPathLinkMetadata('http://www.foo.com/boo') @@ -64,10 +82,31 @@ class TestDropboxBot(BotTestCase): self.verify_reply('', get_help()) self.verify_reply('help', get_help()) - def test_dbx_ls(self): + def test_dbx_ls_root(self): bot_response = " - [foo](https://www.dropbox.com/home/foo)\n"\ " - [boo](https://www.dropbox.com/home/boo)" - with patch('dropbox.dropbox.Dropbox.files_list_folder', side_effect=get_files_list), \ + with patch('dropbox.dropbox.Dropbox.files_list_folder', side_effect=get_root_files_list), \ + self.mock_config_info(self.config_info): + self.verify_reply("ls", bot_response) + + def test_dbx_ls_folder(self): + bot_response = " - [moo](https://www.dropbox.com/home/foo/moo)\n"\ + " - [noo](https://www.dropbox.com/home/foo/noo)" + with patch('dropbox.dropbox.Dropbox.files_list_folder', side_effect=get_folder_files_list), \ + self.mock_config_info(self.config_info): + self.verify_reply("ls foo", bot_response) + + def test_dbx_ls_empty(self): + bot_response = '`No files available`' + with patch('dropbox.dropbox.Dropbox.files_list_folder', side_effect=get_empty_files_list), \ + self.mock_config_info(self.config_info): + self.verify_reply("ls", bot_response) + + def test_dbx_ls_error(self): + bot_response = "Please provide a correct folder path\n"\ + "Usage: `ls ` to list folders in directory\n"\ + "or simply `ls` for listing folders in the root directory" + with patch('dropbox.dropbox.Dropbox.files_list_folder', side_effect=Exception()), \ self.mock_config_info(self.config_info): self.verify_reply("ls", bot_response) @@ -77,24 +116,52 @@ class TestDropboxBot(BotTestCase): self.mock_config_info(self.config_info): self.verify_reply('mkdir foo', bot_response) + def test_dbx_mkdir_error(self): + bot_response = "Please provide a correct folder path and name.\n"\ + "Usage: `mkdir ` to create a folder." + with patch('dropbox.dropbox.Dropbox.files_create_folder', side_effect=Exception()), \ + self.mock_config_info(self.config_info): + self.verify_reply('mkdir foo/bar', bot_response) + def test_dbx_rm(self): bot_response = "DELETED File/Folder : [foo](https://www.dropbox.com/home/foo)" with patch('dropbox.dropbox.Dropbox.files_delete', side_effect=create_file), \ self.mock_config_info(self.config_info): self.verify_reply('rm foo', bot_response) + def test_dbx_rm_error(self): + bot_response = "Please provide a correct folder path and name.\n"\ + "Usage: `rm ` to delete a folder in root directory." + with patch('dropbox.dropbox.Dropbox.files_delete', side_effect=Exception()), \ + self.mock_config_info(self.config_info): + self.verify_reply('rm foo', bot_response) + def test_dbx_write(self): bot_response = "Written to file: [foo](https://www.dropbox.com/home/foo)" with patch('dropbox.dropbox.Dropbox.files_upload', side_effect=create_file), \ self.mock_config_info(self.config_info): self.verify_reply('write foo boo', bot_response) + def test_dbx_write_error(self): + bot_response = "Incorrect file path or file already exists.\n"\ + "Usage: `write CONTENT`" + with patch('dropbox.dropbox.Dropbox.files_upload', side_effect=Exception()), \ + self.mock_config_info(self.config_info): + self.verify_reply('write foo boo', bot_response) + def test_dbx_read(self): bot_response = "**foo** :\nboo" with patch('dropbox.dropbox.Dropbox.files_download', side_effect=download_file), \ self.mock_config_info(self.config_info): self.verify_reply('read foo', bot_response) + def test_dbx_read_error(self): + bot_response = "Please provide a correct file path\n"\ + "Usage: `read ` to read content of a file" + with patch('dropbox.dropbox.Dropbox.files_download', side_effect=Exception()), \ + self.mock_config_info(self.config_info): + self.verify_reply('read foo', bot_response) + def test_dbx_search(self): bot_response = " - [foo](https://www.dropbox.com/home/foo)\n"\ " - [fooboo](https://www.dropbox.com/home/fooboo)" @@ -102,12 +169,59 @@ class TestDropboxBot(BotTestCase): self.mock_config_info(self.config_info): self.verify_reply('search foo', bot_response) + def test_dbx_search_empty(self): + bot_response = "No files/folders found matching your query.\n"\ + "For file name searching, the last token is used for prefix matching"\ + " (i.e. “bat c” matches “bat cave” but not “batman car”)." + with patch('dropbox.dropbox.Dropbox.files_search', side_effect=get_empty_search_result), \ + self.mock_config_info(self.config_info): + self.verify_reply('search boo --fd foo', bot_response) + + def test_dbx_search_error(self): + bot_response = "Usage: `search query --mr 10 --fd `\n"\ + "Note:`--mr ` is optional and is used to specify maximun results.\n"\ + " `--fd ` to search in specific folder." + with patch('dropbox.dropbox.Dropbox.files_search', side_effect=Exception()), \ + self.mock_config_info(self.config_info): + self.verify_reply('search foo', bot_response) + def test_dbx_share(self): bot_response = 'http://www.foo.com/boo' with patch('dropbox.dropbox.Dropbox.sharing_create_shared_link', side_effect=get_shared_link), \ self.mock_config_info(self.config_info): self.verify_reply('share boo', bot_response) + def test_dbx_share_error(self): + bot_response = "Please provide a correct file name.\n"\ + "Usage: `share `" + with patch('dropbox.dropbox.Dropbox.sharing_create_shared_link', side_effect=Exception()), \ + self.mock_config_info(self.config_info): + self.verify_reply('share boo', bot_response) + + def test_dbx_help(self): + bot_response = 'syntax: ls ' + with self.mock_config_info(self.config_info): + self.verify_reply('help ls', bot_response) + + def test_dbx_usage(self): + bot_response = ''' + Usage: + ``` + @dropbox ls - Shows files/folders in the root folder. + @dropbox mkdir foo - Make folder named foo. + @dropbox ls foo/boo - Shows the files/folders in foo/boo folder. + @dropbox write test hello world - Write "hello world" to the file 'test'. + @dropbox rm test - Remove the file/folder test. + @dropbox read foo - Read the contents of file/folder foo. + @dropbox share foo - Get shareable link for the file/folder foo. + @dropbox search boo - Search for boo in root folder and get at max 20 results. + @dropbox search boo --mr 10 - Search for boo and get at max 10 results. + @dropbox search boo --fd foo - Search for boo in folder foo. + ``` + ''' + with self.mock_config_info(self.config_info): + self.verify_reply('usage', bot_response) + def test_invalid_commands(self): ls_error_response = "ERROR: syntax: ls " mkdir_error_response = "ERROR: syntax: mkdir " @@ -115,6 +229,7 @@ class TestDropboxBot(BotTestCase): write_error_response = "ERROR: syntax: write " search_error_response = "ERROR: syntax: search " share_error_response = "ERROR: syntax: share " + usage_error_response = "ERROR: syntax: usage" with self.mock_config_info(self.config_info): # ls @@ -127,3 +242,24 @@ class TestDropboxBot(BotTestCase): self.verify_reply("write foo", write_error_response) # share self.verify_reply("share foo boo", share_error_response) + # usage + self.verify_reply("usage foo", usage_error_response) + + def test_unkown_command(self): + bot_response = '''ERROR: unrecognized command + + Example commands: + + ``` + @mention-bot usage: see usage examples + @mention-bot mkdir: create a folder + @mention-bot ls: list a folder + @mention-bot write: write text + @mention-bot rm: remove a file or folder + @mention-bot read: read a file + @mention-bot search: search a file/folder + @mention-bot share: get a shareable link for the file/folder + ``` + ''' + with self.mock_config_info(self.config_info): + self.verify_reply('unknown command', bot_response)