diff --git a/demo/smoke_lock_action.mjs b/demo/smoke_lock_action.mjs index 11e6293f..61bfeab7 100644 --- a/demo/smoke_lock_action.mjs +++ b/demo/smoke_lock_action.mjs @@ -5,7 +5,6 @@ const res = await page.evaluate(async () => { const c = window.__card; const sr = () => c.shadowRoot || c.renderRoot; const calls = []; - window.confirm = () => true; // review CR-1: unlocking now confirms c.hass = { ...c.hass, callService: (d, s, data) => calls.push([d, s, data.entity_id]) }; await c.updateComplete; // добавить дверь с замком на f1 @@ -21,7 +20,9 @@ const res = await page.evaluate(async () => { let btn = sr().querySelector('.btn.lockact'); out.unlockBtnShown = !!btn && !btn.disabled; out.unlockBtnDanger = btn?.classList.contains('warn'); - btn.click(); + btn.click(); await c.updateComplete; + sr().querySelector('hp-confirm .danger-confirm-footer .btn.warn, hp-confirm .danger-confirm-footer .btn.on')?.click(); + await c.updateComplete; out.unlockCalled = JSON.stringify(calls.at(-1)) === JSON.stringify(['lock', 'unlock', lockId]); // 2) замок открыт → кнопка "Lock" c.hass = { ...c.hass, states: { ...c.hass.states, [lockId]: { state: 'unlocked', attributes: {} } } }; diff --git a/demo/smoke_lock_invariant.mjs b/demo/smoke_lock_invariant.mjs index 2a38d425..e6ae64c5 100644 --- a/demo/smoke_lock_invariant.mjs +++ b/demo/smoke_lock_invariant.mjs @@ -30,18 +30,24 @@ const res = await page.evaluate(async () => { c._cardToggle('alarm_control_panel.home'); out.cardToggleRefuses = lockCalls().length === 0; // 4) кнопка в карточке двери — единственная разрешённая поверхность, и спрашивает подтверждение - let asked = null; - window.confirm = (msg) => { asked = msg; return false; }; - c._lockAction('lock.front_door', 'unlock'); - out.unlockAsksConfirm = asked !== null && lockCalls().length === 0; - window.confirm = () => true; - c._lockAction('lock.front_door', 'unlock'); + c._openingEntityAvailable = () => true; + c._openingInfo = { + id: 'front', type: 'door', rx: 0.5, ry: 0.5, len_cm: 90, lock: 'lock.front_door', + }; + let pending = c._lockAction('lock.front_door', 'unlock'); + await c.updateComplete; + out.unlockAsksConfirm = c._dangerConfirm?.request?.key === 'unlock' && lockCalls().length === 0; + c._cancelDangerConfirm(); + await pending; + pending = c._lockAction('lock.front_door', 'unlock'); + await c.updateComplete; + (c.shadowRoot || c.renderRoot) + .querySelector('hp-confirm .danger-confirm-footer .btn.warn, hp-confirm .danger-confirm-footer .btn.on')?.click(); + await pending; out.unlockAfterConfirm = calls.at(-1) === 'lock.unlock:lock.front_door'; // запирание не спрашивает - asked = null; - window.confirm = (m) => { asked = m; return true; }; - c._lockAction('lock.front_door', 'lock'); - out.lockNoConfirm = asked === null && calls.at(-1) === 'lock.lock:lock.front_door'; + await c._lockAction('lock.front_door', 'lock'); + out.lockNoConfirm = c._dangerConfirm === null && calls.at(-1) === 'lock.lock:lock.front_door'; return out; }); checkAll(res); diff --git a/demo/smoke_saved_plans.mjs b/demo/smoke_saved_plans.mjs index f31b077e..c9ab2f5a 100644 --- a/demo/smoke_saved_plans.mjs +++ b/demo/smoke_saved_plans.mjs @@ -29,8 +29,6 @@ const res = await page.evaluate(async () => { } return base(m); } }; - window.confirm = () => true; - // пространство без плана — как после отцепления c._openSpaceDialog('edit', 'f1'); await c.updateComplete; c._spaceDialog = { ...c._spaceDialog, source: 'file', planUrl: null, planFile: null }; @@ -68,7 +66,10 @@ const res = await page.evaluate(async () => { await c.updateComplete; await c._deleteServerPlan('f2.bbb.png').catch(() => {}); out.usedNotDeleted = !deleted.includes('f2.bbb.png'); - await c._deleteServerPlan('f1.aaa.png'); + const deleting = c._deleteServerPlan('f1.aaa.png'); + await c.updateComplete; + sr().querySelector('hp-confirm .danger-confirm-footer .btn.danger')?.click(); + await deleting; await c.updateComplete; out.freeDeleted = deleted.includes('f1.aaa.png'); out.rowGone = !(c._spaceDialog.saved || []).some((p) => p.name === 'f1.aaa.png');