Raise the coverage-gap Repair only from a live poll

A coverage gap is a claim about what the device currently reports, so
replaying a discovery snapshot shouldn't make it. Offline it would restate
the last live poll's conclusion while pointing the user at a diagnostics
download that stays empty until the appliance answers, and any drift in the
resolved device name between snapshot and live would churn the issue.

Not deduplication: HA already keys issues on (domain, issue_id), preserves
dismissed_version across async_get_or_create, and reloads non-persistent
issues with their dismissal intact -- one row per entry, and an "Ignore"
survives restarts.
This commit is contained in:
Marc Billow committed 2026-08-15 20:13:02 +00:00
1 parent e684146f61
commit edff7385c6
3 files changed
+45 -3

No files matched your search

+23
View File
@@ -18,6 +18,7 @@ from unittest.mock import patch
import pytest
from homeassistant.config_entries import ConfigEntryState
from homeassistant.core import HomeAssistant
from homeassistant.helpers import issue_registry as ir
from homeassistant.util import dt as dt_util
from pytest_homeassistant_custom_component.common import async_fire_time_changed
@@ -327,6 +328,28 @@ async def test_reconcile_is_quiet_when_live_discovery_agrees(
reload.assert_not_called()
def test_coverage_gap_repair_is_live_only(hass: HomeAssistant, mock_entry) -> None:
"""A coverage gap is a claim about what the device reports, so replaying
a snapshot must not raise the Repair -- it would restate last run's
conclusion while the diagnostics download it points at is still empty."""
gappy = {
"/information/vs/0": {
"x.com.samsung.da.modelNum": "TOTALLY_UNKNOWN_BOARD",
"x.com.samsung.da.serialNum": "TEST-SERIAL-0000",
},
"/nothing/maps/this/vs/0": {"someField": 1},
}
issue_id = f"device_gap_{mock_entry.entry_id}"
coordinator = LocalThingsCoordinator(hass, mock_entry)
coordinator._run_discovery(gappy, from_snapshot=True)
assert coordinator._unbound_hrefs # the gap is real, it just stays quiet
assert ir.async_get(hass).async_get_issue(DOMAIN, issue_id) is None
coordinator._run_discovery(gappy)
assert ir.async_get(hass).async_get_issue(DOMAIN, issue_id) is not None
async def test_live_load_never_reconciles(
hass: HomeAssistant, mock_entry, mock_coordinator_session
) -> None: