diff --git a/homeassistant/components/backup/config.py b/homeassistant/components/backup/config.py index bcfa95463d1..8edd6cf0f2b 100644 --- a/homeassistant/components/backup/config.py +++ b/homeassistant/components/backup/config.py @@ -320,6 +320,7 @@ class BackupSchedule: time: dt.time | None = None cron_event: CronSim | None = field(init=False, default=None) next_automatic_backup: datetime | None = field(init=False, default=None) + next_automatic_backup_additional = False @callback def apply( @@ -378,6 +379,14 @@ class BackupSchedule: # add a day to the next time to avoid scheduling at the same time again self.cron_event = CronSim(cron_pattern, now + timedelta(days=1)) + # Compare the computed next time with the next time from the cron pattern + # to determine if an additional backup has been scheduled + cron_event_configured = CronSim(cron_pattern, now) + next_configured_time = next(cron_event_configured) + self.next_automatic_backup_additional = next_time < next_configured_time + else: + self.next_automatic_backup_additional = False + async def _create_backup(now: datetime) -> None: """Create backup.""" manager.remove_next_backup_event = None diff --git a/homeassistant/components/backup/websocket.py b/homeassistant/components/backup/websocket.py index 672dd5ebb13..70fc568c05c 100644 --- a/homeassistant/components/backup/websocket.py +++ b/homeassistant/components/backup/websocket.py @@ -61,6 +61,7 @@ async def handle_info( "last_attempted_automatic_backup": manager.config.data.last_attempted_automatic_backup, "last_completed_automatic_backup": manager.config.data.last_completed_automatic_backup, "next_automatic_backup": manager.config.data.schedule.next_automatic_backup, + "next_automatic_backup_additional": manager.config.data.schedule.next_automatic_backup_additional, }, ) @@ -329,7 +330,8 @@ async def handle_config_info( { "config": config | { - "next_automatic_backup": manager.config.data.schedule.next_automatic_backup + "next_automatic_backup": manager.config.data.schedule.next_automatic_backup, + "next_automatic_backup_additional": manager.config.data.schedule.next_automatic_backup_additional, } }, ) diff --git a/tests/components/backup/snapshots/test_backup.ambr b/tests/components/backup/snapshots/test_backup.ambr index f1208877690..f91473e3b70 100644 --- a/tests/components/backup/snapshots/test_backup.ambr +++ b/tests/components/backup/snapshots/test_backup.ambr @@ -84,6 +84,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, }), 'success': True, 'type': 'result', @@ -114,6 +115,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, }), 'success': True, 'type': 'result', @@ -144,6 +146,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, }), 'success': True, 'type': 'result', @@ -174,6 +177,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, }), 'success': True, 'type': 'result', @@ -204,6 +208,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, }), 'success': True, 'type': 'result', diff --git a/tests/components/backup/snapshots/test_websocket.ambr b/tests/components/backup/snapshots/test_websocket.ambr index 2c88dc50577..43b4c1260dd 100644 --- a/tests/components/backup/snapshots/test_websocket.ambr +++ b/tests/components/backup/snapshots/test_websocket.ambr @@ -245,6 +245,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -284,6 +285,7 @@ 'last_attempted_automatic_backup': '2024-10-26T04:45:00+01:00', 'last_completed_automatic_backup': '2024-10-26T04:45:00+01:00', 'next_automatic_backup': '2024-11-14T04:55:00+01:00', + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': 3, 'days': 7, @@ -326,6 +328,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': 3, 'days': None, @@ -361,6 +364,7 @@ 'last_attempted_automatic_backup': '2024-10-27T04:45:00+01:00', 'last_completed_automatic_backup': '2024-10-26T04:45:00+01:00', 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': 7, @@ -396,6 +400,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': '2024-11-18T04:55:00+01:00', + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -432,6 +437,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -467,6 +473,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': '2024-11-17T04:55:00+01:00', + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -503,6 +510,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -538,6 +546,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': 7, @@ -609,6 +618,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -644,6 +654,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': '2024-11-14T04:55:00+01:00', + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': 3, 'days': None, @@ -715,6 +726,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -750,6 +762,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': '2024-11-14T04:55:00+01:00', + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': 7, @@ -821,6 +834,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -856,6 +870,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': '2024-11-14T06:00:00+01:00', + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -927,6 +942,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -962,6 +978,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': '2024-11-18T04:55:00+01:00', + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -1035,6 +1052,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -1070,6 +1088,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -1141,6 +1160,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -1176,6 +1196,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': '2024-11-17T04:55:00+01:00', + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -1251,6 +1272,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -1290,6 +1312,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': '2024-11-14T04:55:00+01:00', + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -1365,6 +1388,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -1400,6 +1424,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': '2024-11-14T04:55:00+01:00', + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': 3, 'days': 7, @@ -1471,6 +1496,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -1506,6 +1532,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': '2024-11-14T04:55:00+01:00', + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -1577,6 +1604,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -1612,6 +1640,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': '2024-11-14T04:55:00+01:00', + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': 3, 'days': None, @@ -1683,6 +1712,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -1718,6 +1748,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': '2024-11-14T04:55:00+01:00', + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': 7, @@ -1789,6 +1820,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -1823,6 +1855,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -1857,6 +1890,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -1891,6 +1925,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -1925,6 +1960,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -1959,6 +1995,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -1993,6 +2030,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -2027,6 +2065,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -2061,6 +2100,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -2095,6 +2135,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -2129,6 +2170,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -2163,6 +2205,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -2197,6 +2240,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -2231,6 +2275,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -2265,6 +2310,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -2299,6 +2345,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -2333,6 +2380,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -2367,6 +2415,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, 'retention': dict({ 'copies': None, 'days': None, @@ -2394,6 +2443,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, }), 'success': True, 'type': 'result', @@ -2421,6 +2471,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, }), 'success': True, 'type': 'result', @@ -2464,6 +2515,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, }), 'success': True, 'type': 'result', @@ -2491,6 +2543,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, }), 'success': True, 'type': 'result', @@ -2534,6 +2587,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, }), 'success': True, 'type': 'result', @@ -2588,6 +2642,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, }), 'success': True, 'type': 'result', @@ -2626,6 +2681,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, }), 'success': True, 'type': 'result', @@ -2675,6 +2731,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, }), 'success': True, 'type': 'result', @@ -2719,6 +2776,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, }), 'success': True, 'type': 'result', @@ -2773,6 +2831,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, }), 'success': True, 'type': 'result', @@ -2828,6 +2887,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, }), 'success': True, 'type': 'result', @@ -2884,6 +2944,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, }), 'success': True, 'type': 'result', @@ -2938,6 +2999,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, }), 'success': True, 'type': 'result', @@ -2992,6 +3054,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, }), 'success': True, 'type': 'result', @@ -3046,6 +3109,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, }), 'success': True, 'type': 'result', @@ -3101,6 +3165,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, }), 'success': True, 'type': 'result', @@ -3546,6 +3611,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, }), 'success': True, 'type': 'result', @@ -3589,6 +3655,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, }), 'success': True, 'type': 'result', @@ -3633,6 +3700,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, }), 'success': True, 'type': 'result', @@ -3698,6 +3766,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, }), 'success': True, 'type': 'result', @@ -3742,6 +3811,7 @@ 'last_attempted_automatic_backup': None, 'last_completed_automatic_backup': None, 'next_automatic_backup': None, + 'next_automatic_backup_additional': False, }), 'success': True, 'type': 'result', diff --git a/tests/components/backup/test_manager.py b/tests/components/backup/test_manager.py index 4c7eaf634b3..b7a4291fb60 100644 --- a/tests/components/backup/test_manager.py +++ b/tests/components/backup/test_manager.py @@ -275,6 +275,7 @@ async def test_async_initiate_backup( "last_attempted_automatic_backup": None, "last_completed_automatic_backup": None, "next_automatic_backup": None, + "next_automatic_backup_additional": False, } await ws_client.send_json_auto_id({"type": "backup/subscribe_events"}) @@ -521,6 +522,7 @@ async def test_async_initiate_backup_with_agent_error( "last_attempted_automatic_backup": None, "last_completed_automatic_backup": None, "next_automatic_backup": None, + "next_automatic_backup_additional": False, } await ws_client.send_json_auto_id( @@ -616,6 +618,7 @@ async def test_async_initiate_backup_with_agent_error( "last_attempted_automatic_backup": None, "last_completed_automatic_backup": None, "next_automatic_backup": None, + "next_automatic_backup_additional": False, } await hass.async_block_till_done() @@ -884,6 +887,7 @@ async def test_async_initiate_backup_non_agent_upload_error( "last_attempted_automatic_backup": None, "last_completed_automatic_backup": None, "next_automatic_backup": None, + "next_automatic_backup_additional": False, } await ws_client.send_json_auto_id({"type": "backup/subscribe_events"}) @@ -995,6 +999,7 @@ async def test_async_initiate_backup_with_task_error( "last_attempted_automatic_backup": None, "last_completed_automatic_backup": None, "next_automatic_backup": None, + "next_automatic_backup_additional": False, } await ws_client.send_json_auto_id({"type": "backup/subscribe_events"}) @@ -1100,6 +1105,7 @@ async def test_initiate_backup_file_error( "last_attempted_automatic_backup": None, "last_completed_automatic_backup": None, "next_automatic_backup": None, + "next_automatic_backup_additional": False, } await ws_client.send_json_auto_id({"type": "backup/subscribe_events"}) @@ -1621,6 +1627,7 @@ async def test_receive_backup_agent_error( "last_attempted_automatic_backup": None, "last_completed_automatic_backup": None, "next_automatic_backup": None, + "next_automatic_backup_additional": False, } await ws_client.send_json_auto_id( @@ -1699,6 +1706,7 @@ async def test_receive_backup_agent_error( "last_attempted_automatic_backup": None, "last_completed_automatic_backup": None, "next_automatic_backup": None, + "next_automatic_backup_additional": False, } await hass.async_block_till_done() @@ -1760,6 +1768,7 @@ async def test_receive_backup_non_agent_upload_error( "last_attempted_automatic_backup": None, "last_completed_automatic_backup": None, "next_automatic_backup": None, + "next_automatic_backup_additional": False, } await ws_client.send_json_auto_id({"type": "backup/subscribe_events"}) @@ -1881,6 +1890,7 @@ async def test_receive_backup_file_write_error( "last_attempted_automatic_backup": None, "last_completed_automatic_backup": None, "next_automatic_backup": None, + "next_automatic_backup_additional": False, } await ws_client.send_json_auto_id({"type": "backup/subscribe_events"}) @@ -1990,6 +2000,7 @@ async def test_receive_backup_read_tar_error( "last_attempted_automatic_backup": None, "last_completed_automatic_backup": None, "next_automatic_backup": None, + "next_automatic_backup_additional": False, } await ws_client.send_json_auto_id({"type": "backup/subscribe_events"}) @@ -2158,6 +2169,7 @@ async def test_receive_backup_file_read_error( "last_attempted_automatic_backup": None, "last_completed_automatic_backup": None, "next_automatic_backup": None, + "next_automatic_backup_additional": False, } await ws_client.send_json_auto_id({"type": "backup/subscribe_events"}) diff --git a/tests/components/backup/test_websocket.py b/tests/components/backup/test_websocket.py index 44a470053a5..52c04474162 100644 --- a/tests/components/backup/test_websocket.py +++ b/tests/components/backup/test_websocket.py @@ -1310,6 +1310,7 @@ async def test_config_update_errors( "attempted_backup_time", "completed_backup_time", "scheduled_backup_time", + "additional_backup", "backup_calls_1", "backup_calls_2", "call_args", @@ -1325,6 +1326,7 @@ async def test_config_update_errors( "2024-11-12T04:55:00+01:00", "2024-11-12T04:55:00+01:00", "2024-11-12T04:55:00+01:00", + False, 1, 2, BACKUP_CALL, @@ -1345,6 +1347,7 @@ async def test_config_update_errors( "2024-11-12T04:55:00+01:00", "2024-11-12T04:55:00+01:00", "2024-11-12T04:55:00+01:00", + False, 1, 2, BACKUP_CALL, @@ -1364,6 +1367,7 @@ async def test_config_update_errors( "2024-11-18T04:55:00+01:00", "2024-11-18T04:55:00+01:00", "2024-11-18T04:55:00+01:00", + False, 1, 2, BACKUP_CALL, @@ -1387,6 +1391,7 @@ async def test_config_update_errors( "2024-11-18T03:45:00+01:00", "2024-11-18T03:45:00+01:00", "2024-11-18T03:45:00+01:00", + False, 1, 2, BACKUP_CALL, @@ -1406,6 +1411,7 @@ async def test_config_update_errors( "2024-11-12T03:45:00+01:00", "2024-11-12T03:45:00+01:00", "2024-11-12T03:45:00+01:00", + False, 1, 2, BACKUP_CALL, @@ -1425,6 +1431,7 @@ async def test_config_update_errors( "2024-11-13T04:55:00+01:00", "2024-11-13T04:55:00+01:00", "2024-11-13T04:55:00+01:00", + False, 1, 2, BACKUP_CALL, @@ -1444,6 +1451,7 @@ async def test_config_update_errors( "2024-11-11T04:45:00+01:00", "2024-11-11T04:45:00+01:00", None, + False, 0, 0, None, @@ -1463,6 +1471,7 @@ async def test_config_update_errors( "2024-11-11T04:45:00+01:00", "2024-11-11T04:45:00+01:00", None, + False, 0, 0, None, @@ -1482,6 +1491,7 @@ async def test_config_update_errors( "2024-11-12T04:55:00+01:00", "2024-11-12T04:55:00+01:00", "2024-11-12T04:55:00+01:00", + False, 1, 2, BACKUP_CALL, @@ -1501,6 +1511,7 @@ async def test_config_update_errors( "2024-11-12T04:55:00+01:00", # missed event uses daily schedule once "2024-11-12T04:55:00+01:00", # missed event uses daily schedule once "2024-11-12T04:55:00+01:00", + True, 1, 1, BACKUP_CALL, @@ -1520,6 +1531,7 @@ async def test_config_update_errors( "2024-10-26T04:45:00+01:00", "2024-10-26T04:45:00+01:00", None, + False, 0, 0, None, @@ -1539,6 +1551,7 @@ async def test_config_update_errors( "2024-11-12T04:55:00+01:00", # attempted to create backup but failed "2024-11-11T04:45:00+01:00", "2024-11-12T04:55:00+01:00", + False, 1, 2, BACKUP_CALL, @@ -1558,6 +1571,7 @@ async def test_config_update_errors( "2024-11-12T04:55:00+01:00", # attempted to create backup but failed "2024-11-11T04:45:00+01:00", "2024-11-12T04:55:00+01:00", + False, 1, 2, BACKUP_CALL, @@ -1579,6 +1593,7 @@ async def test_config_schedule_logic( attempted_backup_time: str, completed_backup_time: str, scheduled_backup_time: str, + additional_backup: bool, backup_calls_1: int, backup_calls_2: int, call_args: Any, @@ -1630,6 +1645,7 @@ async def test_config_schedule_logic( await client.send_json_auto_id({"type": "backup/info"}) result = await client.receive_json() assert result["result"]["next_automatic_backup"] == scheduled_backup_time + assert result["result"]["next_automatic_backup_additional"] == additional_backup freezer.move_to(time_1) async_fire_time_changed(hass) diff --git a/tests/components/cloud/test_backup.py b/tests/components/cloud/test_backup.py index 112e71ec2db..db742525a48 100644 --- a/tests/components/cloud/test_backup.py +++ b/tests/components/cloud/test_backup.py @@ -205,6 +205,7 @@ async def test_agents_list_backups_fail_cloud( "last_attempted_automatic_backup": None, "last_completed_automatic_backup": None, "next_automatic_backup": None, + "next_automatic_backup_additional": False, }