diff --git a/homeassistant/components/backup/manager.py b/homeassistant/components/backup/manager.py index 4bf92449bd7..60739c39c2b 100644 --- a/homeassistant/components/backup/manager.py +++ b/homeassistant/components/backup/manager.py @@ -82,6 +82,38 @@ class BackupManager: return self.platforms[integration_domain] = platform + async def pre_backup_actions(self) -> None: + """Perform pre backup actions.""" + if not self.loaded_platforms: + await self.load_platforms() + + pre_backup_results = await asyncio.gather( + *( + platform.async_pre_backup(self.hass) + for platform in self.platforms.values() + ), + return_exceptions=True, + ) + for result in pre_backup_results: + if isinstance(result, Exception): + raise result + + async def post_backup_actions(self) -> None: + """Perform post backup actions.""" + if not self.loaded_platforms: + await self.load_platforms() + + post_backup_results = await asyncio.gather( + *( + platform.async_post_backup(self.hass) + for platform in self.platforms.values() + ), + return_exceptions=True, + ) + for result in post_backup_results: + if isinstance(result, Exception): + raise result + async def load_backups(self) -> None: """Load data of stored backup files.""" backups = await self.hass.async_add_executor_job(self._read_backups) @@ -160,22 +192,9 @@ class BackupManager: if self.backing_up: raise HomeAssistantError("Backup already in progress") - if not self.loaded_platforms: - await self.load_platforms() - try: self.backing_up = True - pre_backup_results = await asyncio.gather( - *( - platform.async_pre_backup(self.hass) - for platform in self.platforms.values() - ), - return_exceptions=True, - ) - for result in pre_backup_results: - if isinstance(result, Exception): - raise result - + await self.pre_backup_actions() backup_name = f"Core {HAVERSION}" date_str = dt_util.now().isoformat() slug = _generate_slug(date_str, backup_name) @@ -208,16 +227,7 @@ class BackupManager: return backup finally: self.backing_up = False - post_backup_results = await asyncio.gather( - *( - platform.async_post_backup(self.hass) - for platform in self.platforms.values() - ), - return_exceptions=True, - ) - for result in post_backup_results: - if isinstance(result, Exception): - raise result + await self.post_backup_actions() def _mkdir_and_generate_backup_contents( self, diff --git a/tests/components/backup/test_manager.py b/tests/components/backup/test_manager.py index 528ba40112a..f7ecab0efa1 100644 --- a/tests/components/backup/test_manager.py +++ b/tests/components/backup/test_manager.py @@ -267,3 +267,53 @@ async def test_exception_plaform_post(hass: HomeAssistant) -> None: with pytest.raises(HomeAssistantError): await _mock_backup_generation(manager) + + +async def test_loading_platforms_when_running_pre_backup_actions( + hass: HomeAssistant, + caplog: pytest.LogCaptureFixture, +) -> None: + """Test loading backup platforms when running post backup actions.""" + manager = BackupManager(hass) + + assert not manager.loaded_platforms + assert not manager.platforms + + await _setup_mock_domain( + hass, + Mock( + async_pre_backup=AsyncMock(), + async_post_backup=AsyncMock(), + ), + ) + await manager.pre_backup_actions() + + assert manager.loaded_platforms + assert len(manager.platforms) == 1 + + assert "Loaded 1 platforms" in caplog.text + + +async def test_loading_platforms_when_running_post_backup_actions( + hass: HomeAssistant, + caplog: pytest.LogCaptureFixture, +) -> None: + """Test loading backup platforms when running post backup actions.""" + manager = BackupManager(hass) + + assert not manager.loaded_platforms + assert not manager.platforms + + await _setup_mock_domain( + hass, + Mock( + async_pre_backup=AsyncMock(), + async_post_backup=AsyncMock(), + ), + ) + await manager.post_backup_actions() + + assert manager.loaded_platforms + assert len(manager.platforms) == 1 + + assert "Loaded 1 platforms" in caplog.text