diff --git a/homeassistant/components/backup/config.py b/homeassistant/components/backup/config.py index 6304d0aa90b..32dfa95509c 100644 --- a/homeassistant/components/backup/config.py +++ b/homeassistant/components/backup/config.py @@ -33,8 +33,8 @@ class StoredBackupConfig(TypedDict): """Represent the stored backup config.""" create_backup: StoredCreateBackupConfig - last_attempted_strategy_backup: datetime | None - last_completed_strategy_backup: datetime | None + last_attempted_strategy_backup: str | None + last_completed_strategy_backup: str | None retention: StoredRetentionConfig schedule: StoredBackupSchedule @@ -59,6 +59,16 @@ class BackupConfigData: include_folders = None retention = data["retention"] + if last_attempted_str := data["last_attempted_strategy_backup"]: + last_attempted = dt_util.parse_datetime(last_attempted_str) + else: + last_attempted = None + + if last_attempted_str := data["last_completed_strategy_backup"]: + last_completed = dt_util.parse_datetime(last_attempted_str) + else: + last_completed = None + return cls( create_backup=CreateBackupConfig( agent_ids=data["create_backup"]["agent_ids"], @@ -69,8 +79,8 @@ class BackupConfigData: name=data["create_backup"]["name"], password=data["create_backup"]["password"], ), - last_attempted_strategy_backup=data["last_attempted_strategy_backup"], - last_completed_strategy_backup=data["last_completed_strategy_backup"], + last_attempted_strategy_backup=last_attempted, + last_completed_strategy_backup=last_completed, retention=RetentionConfig( copies=retention["copies"], days=retention["days"], @@ -80,10 +90,20 @@ class BackupConfigData: def to_dict(self) -> StoredBackupConfig: """Convert backup config data to a dict.""" + if self.last_attempted_strategy_backup: + last_attempted = self.last_attempted_strategy_backup.isoformat() + else: + last_attempted = None + + if self.last_completed_strategy_backup: + last_completed = self.last_completed_strategy_backup.isoformat() + else: + last_completed = None + return StoredBackupConfig( create_backup=self.create_backup.to_dict(), - last_attempted_strategy_backup=self.last_attempted_strategy_backup, - last_completed_strategy_backup=self.last_completed_strategy_backup, + last_attempted_strategy_backup=last_attempted, + last_completed_strategy_backup=last_completed, retention=self.retention.to_dict(), schedule=self.schedule.to_dict(), ) diff --git a/tests/components/backup/conftest.py b/tests/components/backup/conftest.py index 7ccfcc4e0f0..13f2537db47 100644 --- a/tests/components/backup/conftest.py +++ b/tests/components/backup/conftest.py @@ -2,12 +2,14 @@ from __future__ import annotations +from asyncio import Future from collections.abc import Generator from pathlib import Path -from unittest.mock import MagicMock, Mock, patch +from unittest.mock import AsyncMock, MagicMock, Mock, patch import pytest +from homeassistant.components.backup.manager import WrittenBackup from homeassistant.core import HomeAssistant from .common import TEST_BACKUP_PATH_ABC123 @@ -62,6 +64,22 @@ CONFIG_DIR = { CONFIG_DIR_DIRS = {Path(".storage"), Path("backups"), Path("tmp_backups")} +@pytest.fixture(name="create_backup") +def mock_create_backup() -> Generator[AsyncMock]: + """Mock manager create backup.""" + mock_written_backup = MagicMock(spec_set=WrittenBackup) + mock_written_backup.backup.backup_id = "abc123" + mock_written_backup.open_stream = AsyncMock() + mock_written_backup.release_stream = AsyncMock() + fut = Future() + fut.set_result(mock_written_backup) + with patch( + "homeassistant.components.backup.CoreBackupReaderWriter.async_create_backup" + ) as mock_create_backup: + mock_create_backup.return_value = (MagicMock(), fut) + yield mock_create_backup + + @pytest.fixture(name="mock_backup_generation") def mock_backup_generation_fixture( hass: HomeAssistant, mocked_json_bytes: Mock, mocked_tarfile: Mock diff --git a/tests/components/backup/test_websocket.py b/tests/components/backup/test_websocket.py index 9df93ee9c46..518005e8470 100644 --- a/tests/components/backup/test_websocket.py +++ b/tests/components/backup/test_websocket.py @@ -1,8 +1,6 @@ """Tests for the Backup integration.""" -from asyncio import Future from collections.abc import Generator -from datetime import datetime from typing import Any from unittest.mock import ANY, AsyncMock, MagicMock, call, patch @@ -17,7 +15,6 @@ from homeassistant.components.backup.manager import ( CreateBackupEvent, CreateBackupState, NewBackup, - WrittenBackup, ) from homeassistant.core import HomeAssistant from homeassistant.exceptions import HomeAssistantError @@ -89,22 +86,6 @@ def mock_delay_save() -> Generator[None]: yield -@pytest.fixture(name="create_backup") -def mock_create_backup() -> Generator[AsyncMock]: - """Mock manager create backup.""" - mock_written_backup = MagicMock(spec_set=WrittenBackup) - mock_written_backup.backup.backup_id = "abc123" - mock_written_backup.open_stream = AsyncMock() - mock_written_backup.release_stream = AsyncMock() - fut = Future() - fut.set_result(mock_written_backup) - with patch( - "homeassistant.components.backup.CoreBackupReaderWriter.async_create_backup" - ) as mock_create_backup: - mock_create_backup.return_value = (MagicMock(), fut) - yield mock_create_backup - - @pytest.fixture(name="delete_backup") def mock_delete_backup() -> Generator[AsyncMock]: """Mock manager delete backup.""" @@ -798,12 +779,8 @@ async def test_agents_info( "password": "test-password", }, "retention": {"copies": 3, "days": 7}, - "last_attempted_strategy_backup": datetime.fromisoformat( - "2024-10-26T04:45:00+01:00" - ), - "last_completed_strategy_backup": datetime.fromisoformat( - "2024-10-26T04:45:00+01:00" - ), + "last_attempted_strategy_backup": "2024-10-26T04:45:00+01:00", + "last_completed_strategy_backup": "2024-10-26T04:45:00+01:00", "schedule": {"state": "daily"}, }, }, @@ -838,12 +815,8 @@ async def test_agents_info( "password": None, }, "retention": {"copies": None, "days": 7}, - "last_attempted_strategy_backup": datetime.fromisoformat( - "2024-10-27T04:45:00+01:00" - ), - "last_completed_strategy_backup": datetime.fromisoformat( - "2024-10-26T04:45:00+01:00" - ), + "last_attempted_strategy_backup": "2024-10-27T04:45:00+01:00", + "last_completed_strategy_backup": "2024-10-26T04:45:00+01:00", "schedule": {"state": "never"}, }, }, @@ -1205,12 +1178,8 @@ async def test_config_schedule_logic( "password": "test-password", }, "retention": {"copies": None, "days": None}, - "last_attempted_strategy_backup": datetime.fromisoformat( - last_completed_strategy_backup - ), - "last_completed_strategy_backup": datetime.fromisoformat( - last_completed_strategy_backup - ), + "last_attempted_strategy_backup": last_completed_strategy_backup, + "last_completed_strategy_backup": last_completed_strategy_backup, "schedule": {"state": "daily"}, }, } @@ -1486,7 +1455,7 @@ async def test_config_retention_copies_logic( }, "retention": {"copies": None, "days": None}, "last_attempted_strategy_backup": None, - "last_completed_strategy_backup": datetime.fromisoformat(last_backup_time), + "last_completed_strategy_backup": last_backup_time, "schedule": {"state": "daily"}, }, } @@ -1699,7 +1668,7 @@ async def test_config_retention_days_logic( }, "retention": {"copies": None, "days": None}, "last_attempted_strategy_backup": None, - "last_completed_strategy_backup": datetime.fromisoformat(last_backup_time), + "last_completed_strategy_backup": last_backup_time, "schedule": {"state": "never"}, }, }