mirror of
https://github.com/Matysh/houseplan-card
synced 2026-07-31 16:38:31 +00:00
T1: demo/serve.mjs exports check/checkAll/finish — all 48 smokes now assert named facts and exit non-zero on a mismatch or an uncaught in-card exception (verified by breaking the kiosk guard on purpose). Informational values were frozen from a v1.43.1 run and cross-read against the source; timings assert budgets, not exact numbers. T2: new CI job 'smoke' gated on 'frontend', builds a FRESH bundle before running (the committed demo/srv/assets copy is a snapshot) and uploads per-file logs on failure. T3: [auto] now means 'a named failing check exists' and each line names it (43 lines); 72 aspirational markers honestly downgraded to [manual]. Fixed the 'ZERO edit buttons' contradiction (wrong since v1.30.1) and the opening-click line (true again since v1.43.1). Three smokes carried pre-v1.39.0/v1.25 expectations and were testing old behaviour: tap defaults for lights, card-wide tap action, label drag requiring plan mode. DEVELOPMENT.md documents the harness contract.
47 lines
2.6 KiB
JavaScript
47 lines
2.6 KiB
JavaScript
import { launch, checkAll, finish } from './serve.mjs';
|
|
const { page, browser } = await launch();
|
|
const res = await page.evaluate(async () => {
|
|
const out = {};
|
|
const c = window.__card;
|
|
c._setMode('devices'); await c.updateComplete;
|
|
const near = (a, b) => a && b && Math.abs(a.x - b.x) < 1e-6 && Math.abs(a.y - b.y) < 1e-6 && a.s === b.s;
|
|
// подопытный: авто-устройство с сохранённой позицией
|
|
const dev = c._devices.find((d) => !d.virtual && !d.marker && c._layout[d.id]);
|
|
out.hasDev = !!dev;
|
|
const pos0 = { ...c._layout[dev.id] };
|
|
// 1) смена комнаты (та же space) → позиция не меняется
|
|
const otherRoom = c._spaceModel(dev.space).rooms.find((r) => r.id && r.area && r.area !== dev.area);
|
|
out.hasOtherRoom = !!otherRoom;
|
|
c._openMarkerDialog(dev);
|
|
c._markerDialog = { ...c._markerDialog, room: dev.space + '#' + otherRoom.area };
|
|
await c._saveMarker(); await c.updateComplete;
|
|
out.stayAfterRoomChange = near(c._layout[dev.id], pos0);
|
|
// вернуть комнату назад
|
|
c._openMarkerDialog(c._devices.find((d) => d.id === dev.id));
|
|
c._markerDialog = { ...c._markerDialog, room: dev.space + '#' + dev.area };
|
|
await c._saveMarker(); await c.updateComplete;
|
|
// 2) смена привязки device -> entity (id меняется) → позиция мигрирует
|
|
const freeEnt = Object.keys(c.hass.states).find((e) => e.startsWith('sensor.') &&
|
|
!c._devices.some((d) => d.id === 'lg_' + e));
|
|
out.hasFreeEnt = !!freeEnt;
|
|
c._openMarkerDialog(c._devices.find((d) => d.id === dev.id));
|
|
c._markerDialog = { ...c._markerDialog, binding: 'entity:' + freeEnt };
|
|
await c._saveMarker(); await c.updateComplete;
|
|
const newId = 'lg_' + freeEnt;
|
|
out.migrated = near(c._layout[newId], pos0);
|
|
out.oldGone = !c._layout[dev.id];
|
|
// 3) новый виртуальный маркер по-прежнему центрируется в выбранной комнате
|
|
c._openMarkerDialog();
|
|
const room = c._spaceModel().rooms.find((r) => r.id && r.area);
|
|
c._markerDialog = { ...c._markerDialog, name: 'Тест', binding: 'virtual', room: c._space + '#' + room.area };
|
|
await c._saveMarker(); await c.updateComplete;
|
|
const vid = c._serverCfg.markers.find((m) => m.name === 'Тест')?.id;
|
|
const center = c._roomCenter(room);
|
|
const vpos = c._layout[vid];
|
|
const aspect = c._curSpaceCfg.aspect || 1;
|
|
out.newCentered = vpos && Math.abs(vpos.x * 1000 - center[0]) < 1 && Math.abs(vpos.y * (1000 / aspect) - center[1]) < 1;
|
|
return out;
|
|
});
|
|
checkAll(res);
|
|
await finish(browser, res);
|