ha(H4): исправления по ревью — маскировка ключа в дампе, reload-repair, reconfigure сохраняет поля
- major: diagnostics больше не содержит полный lanip_key (esp_home — маска, entry_data redacted); ключ для ESPHome — через reconfigure/CLI; план §3 синхронизирован; дамп при незагруженной записи не падает - reconfigure: сохраняет listen_port/keepalive_ms и текущие overrides/ temp_step; превью-дефолты подхватывают значения записи - repair fix-flow: подтверждение перезагружает запись (issue снимается только когда сессия вышла из key_error; иначе создаётся заново) - key_issue_id helper, использование async_remove_issue (мёртвый код), CONF_EMAIL/PASSWORD в TO_REDACT, placeholders в fix_flow, тест плейсхолдеров ru - тесты обновлены (47 components)
This commit is contained in:
@@ -39,10 +39,9 @@ async def test_diagnostics(hass: HomeAssistant, mock_ac, socket_enabled):
|
||||
assert diag["config"]["host"] == "127.0.0.1"
|
||||
assert diag["config"]["template"] == "A"
|
||||
|
||||
assert diag["esp_home"]["lanip_key"] == LANIP_KEY
|
||||
assert diag["esp_home"]["lanip_key"] != LANIP_KEY
|
||||
assert "REDACTED" in diag["esp_home"]["lanip_key"]
|
||||
assert diag["esp_home"]["lanip_key_id"] == 64201
|
||||
assert diag["esp_home_masked"]["lanip_key"] != LANIP_KEY
|
||||
assert "REDACTED" in diag["esp_home_masked"]["lanip_key"]
|
||||
assert diag["entry_data"]["lanip_key"] == "**REDACTED**"
|
||||
|
||||
assert diag["runtime"]["state"] == "online"
|
||||
@@ -54,3 +53,7 @@ async def test_diagnostics(hass: HomeAssistant, mock_ac, socket_enabled):
|
||||
)
|
||||
|
||||
assert await hass.config_entries.async_unload(entry.entry_id)
|
||||
|
||||
unloaded = await async_get_config_entry_diagnostics(hass, entry)
|
||||
assert unloaded["runtime"]["loaded"] is False
|
||||
assert unloaded["config"]["dsn"] == DSN
|
||||
|
||||
@@ -46,7 +46,9 @@ async def test_key_error_creates_and_fixes_issue(
|
||||
assert result["type"] == "form"
|
||||
result = await flow_manager.async_configure(result["flow_id"], {})
|
||||
assert result["type"] == "create_entry"
|
||||
assert registry.async_get_issue(DOMAIN, issue_id) is None
|
||||
await hass.async_block_till_done()
|
||||
# Ключ всё ещё неверен: после reload issue создан снова, а не потерян.
|
||||
assert registry.async_get_issue(DOMAIN, issue_id) is not None
|
||||
|
||||
await hass.config_entries.async_unload(entry.entry_id)
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ from __future__ import annotations
|
||||
|
||||
import json
|
||||
import pathlib
|
||||
import re
|
||||
|
||||
ROOT = pathlib.Path(__file__).resolve().parents[3]
|
||||
COMPONENT = ROOT / "custom_components" / "fglair"
|
||||
@@ -27,3 +28,19 @@ def test_ru_covers_all_keys():
|
||||
strings = json.loads((COMPONENT / "strings.json").read_text())
|
||||
russian = json.loads((COMPONENT / "translations" / "ru.json").read_text())
|
||||
assert _keys(strings) == _keys(russian)
|
||||
|
||||
|
||||
def _placeholders(node, prefix: str = "") -> dict[str, set[str]]:
|
||||
out: dict[str, set[str]] = {}
|
||||
if isinstance(node, dict):
|
||||
for key, value in node.items():
|
||||
out.update(_placeholders(value, prefix + key + "."))
|
||||
elif isinstance(node, str):
|
||||
out[prefix] = set(re.findall(r"{(\w+)}", node))
|
||||
return out
|
||||
|
||||
|
||||
def test_ru_placeholders_match():
|
||||
strings = json.loads((COMPONENT / "strings.json").read_text())
|
||||
russian = json.loads((COMPONENT / "translations" / "ru.json").read_text())
|
||||
assert _placeholders(strings) == _placeholders(russian)
|
||||
|
||||
Reference in New Issue
Block a user