1
0
mirror of https://github.com/home-assistant/core.git synced 2025-12-24 12:59:34 +00:00

Make WS command backup/generate send events (#130524)

* Make WS command backup/generate send events

* Update backup.create service
This commit is contained in:
Erik Montnemery
2024-11-13 16:16:49 +01:00
committed by GitHub
parent ac4cb52dbb
commit 093b16c723
7 changed files with 199 additions and 85 deletions

View File

@@ -2,7 +2,7 @@
from __future__ import annotations
from pathlib import Path
import asyncio
from unittest.mock import AsyncMock, MagicMock, Mock, mock_open, patch
import aiohttp
@@ -10,7 +10,10 @@ from multidict import CIMultiDict, CIMultiDictProxy
import pytest
from homeassistant.components.backup import BackupManager
from homeassistant.components.backup.manager import BackupPlatformProtocol
from homeassistant.components.backup.manager import (
BackupPlatformProtocol,
BackupProgress,
)
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError
from homeassistant.setup import async_setup_component
@@ -20,59 +23,30 @@ from .common import TEST_BACKUP
from tests.common import MockPlatform, mock_platform
async def _mock_backup_generation(manager: BackupManager):
async def _mock_backup_generation(
manager: BackupManager, mocked_json_bytes: Mock, mocked_tarfile: Mock
) -> None:
"""Mock backup generator."""
def _mock_iterdir(path: Path) -> list[Path]:
if not path.name.endswith("testing_config"):
return []
return [
Path("test.txt"),
Path(".DS_Store"),
Path(".storage"),
]
progress: list[BackupProgress] = []
with (
patch(
"homeassistant.components.backup.manager.SecureTarFile"
) as mocked_tarfile,
patch("pathlib.Path.iterdir", _mock_iterdir),
patch("pathlib.Path.stat", MagicMock(st_size=123)),
patch("pathlib.Path.is_file", lambda x: x.name != ".storage"),
patch(
"pathlib.Path.is_dir",
lambda x: x.name == ".storage",
),
patch(
"pathlib.Path.exists",
lambda x: x != manager.backup_dir,
),
patch(
"pathlib.Path.is_symlink",
lambda _: False,
),
patch(
"pathlib.Path.mkdir",
MagicMock(),
),
patch(
"homeassistant.components.backup.manager.json_bytes",
return_value=b"{}", # Empty JSON
) as mocked_json_bytes,
patch(
"homeassistant.components.backup.manager.HAVERSION",
"2025.1.0",
),
):
await manager.async_create_backup()
def on_progress(_progress: BackupProgress) -> None:
"""Mock progress callback."""
progress.append(_progress)
assert mocked_json_bytes.call_count == 1
backup_json_dict = mocked_json_bytes.call_args[0][0]
assert isinstance(backup_json_dict, dict)
assert backup_json_dict["homeassistant"] == {"version": "2025.1.0"}
assert manager.backup_dir.as_posix() in str(
mocked_tarfile.call_args_list[0][0][0]
)
assert manager.backup_task is None
await manager.async_create_backup(on_progress=on_progress)
assert manager.backup_task is not None
assert progress == []
await manager.backup_task
assert progress == [BackupProgress(done=True, stage=None, success=True)]
assert mocked_json_bytes.call_count == 1
backup_json_dict = mocked_json_bytes.call_args[0][0]
assert isinstance(backup_json_dict, dict)
assert backup_json_dict["homeassistant"] == {"version": "2025.1.0"}
assert manager.backup_dir.as_posix() in str(mocked_tarfile.call_args_list[0][0][0])
async def _setup_mock_domain(
@@ -176,21 +150,26 @@ async def test_getting_backup_that_does_not_exist(
async def test_async_create_backup_when_backing_up(hass: HomeAssistant) -> None:
"""Test generate backup."""
event = asyncio.Event()
manager = BackupManager(hass)
manager.backing_up = True
manager.backup_task = hass.async_create_task(event.wait())
with pytest.raises(HomeAssistantError, match="Backup already in progress"):
await manager.async_create_backup()
await manager.async_create_backup(on_progress=None)
event.set()
@pytest.mark.usefixtures("mock_backup_generation")
async def test_async_create_backup(
hass: HomeAssistant,
caplog: pytest.LogCaptureFixture,
mocked_json_bytes: Mock,
mocked_tarfile: Mock,
) -> None:
"""Test generate backup."""
manager = BackupManager(hass)
manager.loaded_backups = True
await _mock_backup_generation(manager)
await _mock_backup_generation(manager, mocked_json_bytes, mocked_tarfile)
assert "Generated new backup with slug " in caplog.text
assert "Creating backup directory" in caplog.text
@@ -247,7 +226,9 @@ async def test_not_loading_bad_platforms(
)
async def test_exception_plaform_pre(hass: HomeAssistant) -> None:
async def test_exception_plaform_pre(
hass: HomeAssistant, mocked_json_bytes: Mock, mocked_tarfile: Mock
) -> None:
"""Test exception in pre step."""
manager = BackupManager(hass)
manager.loaded_backups = True
@@ -264,10 +245,12 @@ async def test_exception_plaform_pre(hass: HomeAssistant) -> None:
)
with pytest.raises(HomeAssistantError):
await _mock_backup_generation(manager)
await _mock_backup_generation(manager, mocked_json_bytes, mocked_tarfile)
async def test_exception_plaform_post(hass: HomeAssistant) -> None:
async def test_exception_plaform_post(
hass: HomeAssistant, mocked_json_bytes: Mock, mocked_tarfile: Mock
) -> None:
"""Test exception in post step."""
manager = BackupManager(hass)
manager.loaded_backups = True
@@ -284,7 +267,7 @@ async def test_exception_plaform_post(hass: HomeAssistant) -> None:
)
with pytest.raises(HomeAssistantError):
await _mock_backup_generation(manager)
await _mock_backup_generation(manager, mocked_json_bytes, mocked_tarfile)
async def test_loading_platforms_when_running_async_pre_backup_actions(