Files
houseplan-card/demo/smoke_disabled_device.mjs

71 lines
2.4 KiB
JavaScript

// HA-disabled lifecycle: saved marker -> forced hidden -> service ghost and
// blocked Show -> same marker restored after reactivation, without config writes.
import { launch, checkAll, finish } from './serve.mjs';
const { page, browser } = await launch({ width: 1000, height: 900 }, 1);
const res = await page.evaluate(async () => {
const c = window.__card;
const sr = () => c.shadowRoot || c.renderRoot;
const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
const paint = async () => { c.requestUpdate(); await c.updateComplete; };
c._serverCfg = {
...c._serverCfg,
markers: [
...(c._serverCfg.markers || []).filter((marker) => marker.id !== 'd_light1'),
{ id: 'd_light1', binding: 'device:d_light1' },
],
};
c._cfgEpoch++;
c._regSignature = '';
c._maybeRebuildDevices();
c._setMode('view');
await paint();
const configBefore = JSON.stringify(c._serverCfg);
const layoutBefore = JSON.stringify(c._layout);
const visibleBefore = !!sr().querySelector('.dev[data-id="d_light1"]');
window.__setRegistryDisabled('device', 'd_light1', 'user');
c.hass = window.__mkHass();
await wait(220);
await paint();
const hiddenInView = !sr().querySelector('.dev[data-id="d_light1"]');
c._showHidden = true;
c._setMode('devices');
c._regSignature = '';
c._maybeRebuildDevices();
await paint();
const ghost = sr().querySelector('.dev[data-id="d_light1"][data-binding-status="ha-disabled"]');
const disabledDevice = c._devices.find((device) => device.id === 'd_light1');
c._openMarkerDialog(disabledDevice);
await paint();
const hiddenBeforeShow = c._markerDialog?.hideFromPlan;
c._toggleMarkerDialogVisibility();
await paint();
const showBlocked = /disabled|deactiv/i.test(c._toast)
&& c._markerDialog?.hideFromPlan === hiddenBeforeShow
&& sr().querySelector('.toast')?.getAttribute('role') === 'alert';
c._markerDialog = null;
window.__setRegistryDisabled('device', 'd_light1', null);
c.hass = window.__mkHass();
await wait(220);
c._showHidden = false;
c._setMode('view');
await paint();
return {
visibleBefore,
hiddenInView,
labelledGhost: !!ghost,
showBlocked,
restored: !!sr().querySelector('.dev[data-id="d_light1"]'),
configUnchanged: JSON.stringify(c._serverCfg) === configBefore,
layoutUnchanged: JSON.stringify(c._layout) === layoutBefore,
};
});
checkAll(res);
await finish(browser, res);