From dad3c770e3e34b16c5e6c332763ba3f2f4338097 Mon Sep 17 00:00:00 2001 From: Brad Holland Date: Tue, 21 May 2024 00:59:31 -0400 Subject: [PATCH] catch correct error type (#23) --- .pre-commit-config.yaml | 13 +++- src/main.py | 6 +- tests/conftest.py | 16 +++++ tests/test_existing_renamer.py | 123 --------------------------------- tests/test_main.py | 33 +++++++++ 5 files changed, 62 insertions(+), 129 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3c9fbd0..09ec19e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,8 +3,15 @@ repos: # Ruff version. rev: v0.4.2 hooks: - # Run the linter. - id: ruff args: [ --fix ] - # Run the formatter. - - id: ruff-format \ No newline at end of file + - id: ruff-format + - repo: local + hooks: + - id: pytest + name: pytest + entry: poetry run pytest --cov=src --cov-branch tests + language: system + types: [python] + pass_filenames: false + always_run: true diff --git a/src/main.py b/src/main.py index 18a9555..29f7a08 100644 --- a/src/main.py +++ b/src/main.py @@ -6,7 +6,7 @@ from config_schema import CONFIG_SCHEMA from existing_renamer import ExistingRenamer from loguru import logger -from pycliarr.api import CliServerError +from pycliarr.api import CliArrError from pyconfigparser import ConfigError, ConfigFileNotFoundError, configparser from series_scanner import SeriesScanner @@ -33,7 +33,7 @@ def __series_scanner_job(self, sonarr_config): api_key=sonarr_config.api_key, hours_before_air=sonarr_config.series_scanner.hours_before_air, ).scan() - except CliServerError as exc: + except CliArrError as exc: logger.error(exc) def __schedule_series_scanner(self, sonarr_config): @@ -52,7 +52,7 @@ def __existing_renamer_job(self, sonarr_config): url=sonarr_config.url, api_key=sonarr_config.api_key, ).scan() - except CliServerError as exc: + except CliArrError as exc: logger.error(exc) def __schedule_existing_renamer(self, sonarr_config): diff --git a/tests/conftest.py b/tests/conftest.py index 06c0cc9..e8d2243 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2,6 +2,7 @@ from typing import List import pytest +from loguru import logger from pycliarr.api import SonarrCli, SonarrSerieItem from pycliarr.api.base_api import json_data @@ -14,6 +15,21 @@ def get_serie(mocker) -> None: mocker.patch.object(SonarrCli, "get_serie").return_value = series +@pytest.fixture +def mock_loguru_error(mocker) -> None: + return mocker.patch.object(logger, "error") + + +@pytest.fixture +def mock_loguru_info(mocker) -> None: + return mocker.patch.object(logger, "info") + + +@pytest.fixture +def mock_loguru_debug(mocker) -> None: + return mocker.patch.object(logger, "debug") + + def episode_data( id: int, title: str, diff --git a/tests/test_existing_renamer.py b/tests/test_existing_renamer.py index 26d89c1..65cf250 100644 --- a/tests/test_existing_renamer.py +++ b/tests/test_existing_renamer.py @@ -56,126 +56,3 @@ def test_when_multiple_episodes_need_renamed( assert "Found episodes to be renamed" in caplog.text assert "Renaming S01E01, S01E02" in caplog.text rename_files.assert_called_once_with([1, 2], 1) - - # def test_when_episodes_filtered_out(self, get_serie, caplog, mocker) -> None: - # episodes: List[json_data] = [ - # episode_data( - # id=1, - # title="TBA", - # airDateDelta=timedelta(hours=2), - # seasonNumber=0, - # ), - # episode_data( - # id=2, - # title="TBA", - # airDateDelta=timedelta(hours=8), - # ), - # dict(id=3, title="NOT TBA", airDateUtc=None, seasonNumber=1, hasFile=False), - # ] - # mocker.patch.object(SonarrCli, "get_episode").return_value = episodes - # rename_files = mocker.patch.object(SonarrCli, "rename_files") - - # with caplog.at_level(logging.DEBUG): - # ExistingRenamer("test", "test.tld", "test-api-key").scan() - - # assert "Starting Existing Renamer" in caplog.text - # assert "Retrieved series list" in caplog.text - # assert "No rename needed" in caplog.text - # assert not rename_files.called - - # def test_when_episode_file_name_contains_TBA( - # self, get_serie, caplog, mocker - # ) -> None: - # episodes: List[json_data] = [ - # episode_data( - # id=1, - # title="NOT TBA", - # airDateDelta=timedelta(days=-1), - # seasonNumber=1, - # ), - # ] - # mocker.patch.object(SonarrCli, "get_episode").return_value = episodes - # rename_files = mocker.patch.object(SonarrCli, "rename_files") - - # file: json_data = file_info( - # id=1, - # file_name="The Series Titles (2010) - S01E01 - TBA.mkv", - # ) - - # mocker.patch.object(SonarrCli, "get_episode_file").return_value = file - - # with caplog.at_level(logging.DEBUG): - # ExistingRenamer("test", "test.tld", "test-api-key").scan() - - # assert "S01E01 Queuing for rename" in caplog.text - # assert "Renaming S01E01" in caplog.text - # rename_files.assert_called_once_with([1], 1) - - # def test_when_renaming_multiple_files(self, get_serie, caplog, mocker) -> None: - # episodes: List[json_data] = [ - # episode_data( - # id=1, - # title="NOT TBA", - # airDateDelta=timedelta(days=-1), - # seasonNumber=1, - # episodeNumber=1, - # ), - # episode_data( - # id=2, - # title="NOT TBA", - # airDateDelta=timedelta(days=-1), - # seasonNumber=1, - # episodeNumber=2, - # ), - # ] - # mocker.patch.object(SonarrCli, "get_episode").return_value = episodes - # rename_files = mocker.patch.object(SonarrCli, "rename_files") - - # file1: json_data = file_info( - # id=1, - # file_name="The Series Titles (2010) - S01E01 - TBA.mkv", - # ) - - # file2: json_data = file_info( - # id=2, - # file_name="The Series Titles (2010) - S01E02 - TBA.mkv", - # ) - - # get_episode_file = mocker.patch.object(SonarrCli, "get_episode_file") - # get_episode_file.return_value = file1 - # get_episode_file.side_effect = [file1, file2] - - # with caplog.at_level(logging.DEBUG): - # ExistingRenamer("test", "test.tld", "test-api-key").scan() - - # assert "S01E01 Queuing for rename" in caplog.text - # assert "S01E02 Queuing for rename" in caplog.text - # assert "Renaming S01E01, S01E02" in caplog.text - # rename_files.assert_called_once_with([1, 2], 1) - - # def test_when_episode_file_name_does_not_contain_TBA( - # self, get_serie, caplog, mocker - # ) -> None: - # episodes: List[json_data] = [ - # episode_data( - # id=1, - # title="NOT TBA", - # airDateDelta=timedelta(days=-1), - # seasonNumber=1, - # ), - # ] - # mocker.patch.object(SonarrCli, "get_episode").return_value = episodes - # rename_files = mocker.patch.object(SonarrCli, "rename_files") - - # file: json_data = file_info( - # id=1, - # file_name="The Series Titles (2010) - S01E01 - Episode1.mkv", - # ) - - # mocker.patch.object(SonarrCli, "get_episode_file").return_value = file - - # with caplog.at_level(logging.DEBUG): - # ExistingRenamer("test", "test.tld", "test-api-key").scan() - - # assert "No rename needed" in caplog.text - # assert not rename_files.called diff --git a/tests/test_main.py b/tests/test_main.py index f879cb2..31be4e0 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -2,6 +2,7 @@ from config_schema import CONFIG_SCHEMA from existing_renamer import ExistingRenamer from main import Main +from pycliarr.api import CliArrError from pyconfigparser import Config, configparser from schedule import Job from series_scanner import SeriesScanner @@ -52,6 +53,22 @@ def test_series_scanner_hourly_job(self, config, mocker) -> None: assert series_scanner.called assert job.called + def test_series_scanner_pycliarr_exception( + self, config, mock_loguru_error, mocker + ) -> None: + config.sonarr[0].series_scanner.enabled = True + mocker.patch("pyconfigparser.configparser.get_config").return_value = config + mocker.patch.object(Job, "do") + + exception = CliArrError("BOOM!") + + series_scanner = mocker.patch.object(SeriesScanner, "scan") + series_scanner.side_effect = exception + + Main().start() + + mock_loguru_error.assert_called_once_with(exception) + def test_existing_renamer_scan(self, config, mocker) -> None: config.sonarr[0].existing_renamer.enabled = True mocker.patch("pyconfigparser.configparser.get_config").return_value = config @@ -73,3 +90,19 @@ def test_existing_renamer_hourly_job(self, config, mocker) -> None: Main().start() assert existing_renamer.called assert job.called + + def test_existing_renamer_pycliarr_exception( + self, config, mock_loguru_error, mocker + ) -> None: + config.sonarr[0].existing_renamer.enabled = True + mocker.patch("pyconfigparser.configparser.get_config").return_value = config + mocker.patch.object(Job, "do") + + exception = CliArrError("BOOM!") + + existing_renamer = mocker.patch.object(ExistingRenamer, "scan") + existing_renamer.side_effect = exception + + Main().start() + + mock_loguru_error.assert_called_once_with(exception)