From 17499baf617850a04430dc613c0a737b44367299 Mon Sep 17 00:00:00 2001 From: Serene-Arc Date: Tue, 27 Apr 2021 15:10:29 +1000 Subject: [PATCH] Add informative error when testing user existence --- bdfr/downloader.py | 20 +++++++++++------- tests/test_downloader.py | 45 +++++++++++++++++++++++++++++++++------- 2 files changed, 49 insertions(+), 16 deletions(-) diff --git a/bdfr/downloader.py b/bdfr/downloader.py index 72cc019..6b69f8c 100644 --- a/bdfr/downloader.py +++ b/bdfr/downloader.py @@ -314,8 +314,10 @@ class RedditDownloader: def _get_user_data(self) -> list[Iterator]: if any([self.args.submitted, self.args.upvoted, self.args.saved]): if self.args.user: - if not self._check_user_existence(self.args.user): - logger.error(f'User {self.args.user} does not exist') + try: + self._check_user_existence(self.args.user) + except errors.BulkDownloaderException as e: + logger.error(e) return [] generators = [] if self.args.submitted: @@ -339,14 +341,16 @@ class RedditDownloader: else: return [] - def _check_user_existence(self, name: str) -> bool: + def _check_user_existence(self, name: str): user = self.reddit_instance.redditor(name=name) try: - if not user.id: - return False - except (prawcore.exceptions.NotFound, AttributeError): - return False - return True + if user.id: + return + except prawcore.exceptions.NotFound: + raise errors.BulkDownloaderException(f'Could not find user {name}') + except AttributeError: + if hasattr(user, 'is_suspended'): + raise errors.BulkDownloaderException(f'User {name} is banned') def _create_file_name_formatter(self) -> FileNameFormatter: return FileNameFormatter(self.args.file_scheme, self.args.folder_scheme) diff --git a/tests/test_downloader.py b/tests/test_downloader.py index 189f66a..9ec13cf 100644 --- a/tests/test_downloader.py +++ b/tests/test_downloader.py @@ -462,17 +462,46 @@ def test_read_excluded_submission_ids_from_file(downloader_mock: MagicMock, tmp_ @pytest.mark.online @pytest.mark.reddit -@pytest.mark.parametrize(('test_redditor_name', 'expected'), ( - ('anthonyhui', True), # Real - ('lhnhfkuhwreolo', False), # Fake - ('Bree-Boo', False), # Banned +@pytest.mark.parametrize('test_redditor_name', ( + 'Paracortex', + 'crowdstrike', + 'HannibalGoddamnit', )) -def test_check_user_existence( +def test_check_user_existence_good( + test_redditor_name: str, + reddit_instance: praw.Reddit, + downloader_mock: MagicMock, +): + downloader_mock.reddit_instance = reddit_instance + RedditDownloader._check_user_existence(downloader_mock, test_redditor_name) + + +@pytest.mark.online +@pytest.mark.reddit +@pytest.mark.parametrize('test_redditor_name', ( + 'lhnhfkuhwreolo', + 'adlkfmnhglojh', +)) +def test_check_user_existence_nonexistent( test_redditor_name: str, - expected: bool, reddit_instance: praw.Reddit, downloader_mock: MagicMock, ): downloader_mock.reddit_instance = reddit_instance - result = RedditDownloader._check_user_existence(downloader_mock, test_redditor_name) - assert result == expected + with pytest.raises(BulkDownloaderException, match='Could not find'): + RedditDownloader._check_user_existence(downloader_mock, test_redditor_name) + + +@pytest.mark.online +@pytest.mark.reddit +@pytest.mark.parametrize('test_redditor_name', ( + 'Bree-Boo', +)) +def test_check_user_existence_banned( + test_redditor_name: str, + reddit_instance: praw.Reddit, + downloader_mock: MagicMock, +): + downloader_mock.reddit_instance = reddit_instance + with pytest.raises(BulkDownloaderException, match='is banned'): + RedditDownloader._check_user_existence(downloader_mock, test_redditor_name)