mirror of
https://github.com/Matysh/houseplan-card
synced 2026-07-31 08:28: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.
37 lines
1.9 KiB
JavaScript
37 lines
1.9 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;
|
|
const sent = [];
|
|
// перехват WS: config/set логируем, config/get отдаёт "серверную" копию БЕЗ локальной правки
|
|
const server = { cfg: JSON.parse(JSON.stringify(c._serverCfg)), rev: c._cfgRev };
|
|
c.hass = { ...c.hass, callWS: async (msg) => {
|
|
if (msg.type === 'houseplan/config/set') {
|
|
sent.push(JSON.parse(JSON.stringify(msg.config)));
|
|
server.cfg = JSON.parse(JSON.stringify(msg.config));
|
|
server.rev = (msg.expected_rev ?? server.rev) + 1;
|
|
return { rev: server.rev };
|
|
}
|
|
if (msg.type === 'houseplan/config/get') return { config: JSON.parse(JSON.stringify(server.cfg)), rev: server.rev };
|
|
return {};
|
|
} };
|
|
await c.updateComplete;
|
|
// локальная правка (как разметка комнаты) + дебаунс
|
|
const sp = c._curSpaceCfg;
|
|
sp.rooms.push({ id: 'race_room', name: 'RACE', area: null, poly: [[0.8, 0.8], [0.9, 0.8], [0.9, 0.9], [0.8, 0.9]] });
|
|
c._saveConfig();
|
|
out.pending = c._saveConfigDebounced.pending();
|
|
// через 100 мс приходит событие о чужой ревизии — раньше это стирало правку
|
|
c._cfgRev = server.rev; // симулируем: наша ревизия отстала
|
|
await c._reloadConfigOnly();
|
|
await new Promise((r) => setTimeout(r, 900));
|
|
// правка обязана уцелеть и уйти на сервер
|
|
out.editSent = sent.some((cf) => cf.spaces.some((s) => s.rooms?.some((r) => r.id === 'race_room')));
|
|
out.editInMemory = c._serverCfg.spaces.some((s) => s.rooms?.some((r) => r.id === 'race_room'));
|
|
out.serverHasIt = server.cfg.spaces.some((s) => s.rooms?.some((r) => r.id === 'race_room'));
|
|
return out;
|
|
});
|
|
checkAll(res);
|
|
await finish(browser, res);
|