From 5facf4e7901ef54988714672694b2799b729a320 Mon Sep 17 00:00:00 2001 From: Mike Degatano Date: Wed, 12 Mar 2025 15:21:10 -0400 Subject: [PATCH] Fix logging error for invalid password for backup (#5747) * Fix logging error for invalid password for backup * Improved test --- supervisor/backups/backup.py | 2 +- tests/backups/test_backup.py | 45 ++++++++++++++++++++++++------------ 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/supervisor/backups/backup.py b/supervisor/backups/backup.py index f290189c5..e3a665f8f 100644 --- a/supervisor/backups/backup.py +++ b/supervisor/backups/backup.py @@ -392,7 +392,7 @@ class Backup(JobGroup): return except tarfile.ReadError as ex: raise BackupInvalidError( - f"Invalid password for backup {backup.slug}", _LOGGER.error + f"Invalid password for backup {self.slug}", _LOGGER.error ) from ex try: diff --git a/tests/backups/test_backup.py b/tests/backups/test_backup.py index 13109c48a..10e8ca7c0 100644 --- a/tests/backups/test_backup.py +++ b/tests/backups/test_backup.py @@ -1,5 +1,6 @@ """Test backups.""" +from contextlib import AbstractContextManager, nullcontext as does_not_raise from os import listdir from pathlib import Path from shutil import copy @@ -116,28 +117,44 @@ async def test_consolidate( } -@pytest.mark.asyncio @pytest.mark.parametrize( - "tarfile_side_effect, securetar_side_effect, expected_exception", + ( + "tarfile_side_effect", + "securetar_side_effect", + "expected_exception", + ), [ - (None, None, None), # Successful validation - (FileNotFoundError, None, BackupFileNotFoundError), # File not found - (None, tarfile.ReadError, BackupInvalidError), # Invalid password + (None, None, does_not_raise()), # Successful validation + ( + FileNotFoundError, + None, + pytest.raises( + BackupFileNotFoundError, + match=r"Cannot validate backup at [^, ]+, file does not exist!", + ), + ), # File not found + ( + None, + tarfile.ReadError, + pytest.raises( + BackupInvalidError, match="Invalid password for backup 93b462f8" + ), + ), # Invalid password ], ) async def test_validate_backup( coresys: CoreSys, tmp_path: Path, - tarfile_side_effect, - securetar_side_effect, - expected_exception, + tarfile_side_effect: type[Exception] | None, + securetar_side_effect: type[Exception] | None, + expected_exception: AbstractContextManager, ): """Parameterized test for validate_backup.""" enc_tar = Path(copy(get_fixture_path("backup_example_enc.tar"), tmp_path)) enc_backup = Backup(coresys, enc_tar, "test", None) await enc_backup.load() - backup_tar_mock = MagicMock() + backup_tar_mock = MagicMock(spec_set=tarfile.TarFile) backup_tar_mock.getmembers.return_value = [ MagicMock(name="test.tar.gz") ] # Fake tar entries @@ -150,16 +167,14 @@ async def test_validate_backup( patch( "tarfile.open", MagicMock( - return_value=backup_context_mock, side_effect=tarfile_side_effect + return_value=backup_context_mock, + side_effect=tarfile_side_effect, ), ), patch( "supervisor.backups.backup.SecureTarFile", MagicMock(side_effect=securetar_side_effect), ), + expected_exception, ): - if expected_exception: - with pytest.raises(expected_exception): - await enc_backup.validate_backup(None) - else: - await enc_backup.validate_backup(None) + await enc_backup.validate_backup(None)