From 3d9c35519d90ea98714772344875928df8dbc48d Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Thu, 21 Sep 2023 23:06:57 -0700 Subject: [PATCH] [BACKEND] More explicit error message for PermissionError (#736) Do not print the full stack trace when a PermissionError occurs --- src/ytdl_sub/utils/logger.py | 7 +++++++ tests/unit/main/test_main.py | 15 +++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/ytdl_sub/utils/logger.py b/src/ytdl_sub/utils/logger.py index 0b70082f..70bde484 100644 --- a/src/ytdl_sub/utils/logger.py +++ b/src/ytdl_sub/utils/logger.py @@ -221,6 +221,13 @@ class Logger: # Log validation exceptions as-is if isinstance(exception, ValidationException): logger.error(str(exception)) + # Log permission errors explicitly + elif isinstance(exception, PermissionError): + logger.error( + "A permission error occurred:\n%s\n" + "The user running ytdl-sub must have permission to this file/directory.", + str(exception), + ) # For other uncaught errors, log as bug: else: logger.exception("An uncaught error occurred:") diff --git a/tests/unit/main/test_main.py b/tests/unit/main/test_main.py index eea87a49..b8bb53e2 100644 --- a/tests/unit/main/test_main.py +++ b/tests/unit/main/test_main.py @@ -69,6 +69,21 @@ def test_main_uncaught_error(capsys, mock_sys_exit, expected_uncaught_error_mess assert mock_error.call_args.args[2] == Logger.debug_log_filename() +def test_main_permission_error(capsys, mock_sys_exit, expected_uncaught_error_message): + permission_error = PermissionError("test") + with mock_sys_exit(expected_exit_code=1), patch( + "src.ytdl_sub.main._main", side_effect=permission_error + ), patch.object(logging.Logger, "error") as mock_error: + main() + + assert mock_error.call_count == 1 + assert mock_error.call_args.args[0] == ( + "A permission error occurred:\n%s\n" + "The user running ytdl-sub must have permission to this file/directory." + ) + assert mock_error.call_args.args[1] == "test" + + def test_args_after_sub_work(mock_sys_exit): with mock_sys_exit(expected_exit_code=0), patch.object( sys,