From dcbf9a6c7ebdc53433fdd1ef4f763cf799495b37 Mon Sep 17 00:00:00 2001 From: Petr Polezhaev Date: Tue, 29 Sep 2026 14:14:19 +0300 Subject: [PATCH] =?UTF-8?q?ha(H4):=20=D1=81=D0=BA=D0=B2=D0=BE=D0=B7=D0=BD?= =?UTF-8?q?=D0=BE=D0=B9=20=D1=82=D0=B5=D1=81=D1=82=20repair-=D0=BF=D1=83?= =?UTF-8?q?=D1=82=D0=B8=20key=5Ferror=20->=20reconfigure=20->=20online?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ручная форма с исправленным lanip_key_id: реальная пробная сессия, reload записи, исчезновение issue key_mismatch после выхода на связь. --- tests/components/fglair/test_repairs.py | 53 +++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/tests/components/fglair/test_repairs.py b/tests/components/fglair/test_repairs.py index 1c5bc75..0b2d661 100644 --- a/tests/components/fglair/test_repairs.py +++ b/tests/components/fglair/test_repairs.py @@ -49,3 +49,56 @@ async def test_key_error_creates_and_fixes_issue( assert registry.async_get_issue(DOMAIN, issue_id) is None await hass.config_entries.async_unload(entry.entry_id) + + +async def test_reconfigure_fixes_key_error( + hass: HomeAssistant, mock_ac, socket_enabled +): + """Repair-путь целиком: bad key_id → issue → reconfigure → online → issue снят.""" + from homeassistant.config_entries import SOURCE_RECONFIGURE + from test_config_flow import MANUAL_INPUT, PREVIEW_INPUT + + proc = mock_ac( + ["--set", "operation_mode=6"], key_id=KEY_ID + 1 + ) + entry = await _setup_entry(hass, proc.port) + runtime = entry.runtime_data + await _wait_for(lambda: runtime.client.state == State.KEY_ERROR) + + registry = ir.async_get(hass) + issue_id = f"key_mismatch_{DSN}" + assert registry.async_get_issue(DOMAIN, issue_id) is not None + + # Mock помнит только один app_addr; останавливаем «залипшую» сессию, + # чтобы пробная сессия config flow получила KE (штатно это делает reload). + await runtime.client.async_stop() + + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": SOURCE_RECONFIGURE, "entry_id": entry.entry_id}, + ) + result = await hass.config_entries.flow.async_configure( + result["flow_id"], {"next_step_id": "manual"} + ) + result = await hass.config_entries.flow.async_configure( + result["flow_id"], + { + **MANUAL_INPUT, + "host": "127.0.0.1", + "device_port": proc.port, + "lanip_key_id": KEY_ID + 1, + }, + ) + assert result["step_id"] == "preview", result.get("errors") + result = await hass.config_entries.flow.async_configure( + result["flow_id"], PREVIEW_INPUT + ) + assert result["type"] == "abort" + assert result["reason"] == "reconfigure_successful" + await hass.async_block_till_done() + + runtime = entry.runtime_data + await _wait_for(lambda: runtime.client.state == State.ONLINE) + assert registry.async_get_issue(DOMAIN, issue_id) is None + assert entry.data["lanip_key_id"] == KEY_ID + 1 + assert await hass.config_entries.async_unload(entry.entry_id)