Files
2026-07-08 10:43:39 -04:00

117 lines
4.5 KiB
JavaScript

/**
* Verifies the read-only checklist preview in the task detail (overview tab).
* Adds a task with a checklist via WS, navigates to its detail, asserts the
* preview card with all 3 steps is in the DOM.
*/
import { setup, ws, cleanup } from "./e2e-helpers.mjs";
const RUN = Date.now().toString(36);
const OBJ_NAME = `Checklist Preview ${RUN}`;
const STEPS = ["Drain water", "Replace filter cartridge", "Run flush cycle"];
const log = (...a) => console.log(...a);
let pass = 0, fail = 0;
const check = (label, ok, detail) => {
if (ok) { pass++; log(` ✓ ${label}`); }
else { fail++; log(` ✗ ${label}${detail ? " — " + detail : ""}`); }
};
const PANEL_EVAL = `
window._ha=document.querySelector('home-assistant');
window._main=_ha.shadowRoot.querySelector('home-assistant-main');
window._drawer=_main.shadowRoot.querySelector('ha-drawer');
window._resolver=_drawer.querySelector('partial-panel-resolver');
window._custom=_resolver.querySelector('ha-panel-custom');
window._panel=_custom.querySelector('maintenance-supporter-panel');
window._sr=_panel.shadowRoot;
`;
async function main() {
const { browser, ctx, page } = await setup({ mobile: false });
log("\n== Step 1: enable Checklists feature");
await ws(page, {
type: "maintenance_supporter/global/update",
settings: { advanced_checklists_visible: true },
});
log("\n== Step 2: create object + task with checklist");
const obj = await ws(page, { type: "maintenance_supporter/object/create", name: OBJ_NAME });
const taskRes = await ws(page, {
type: "maintenance_supporter/task/create",
entry_id: obj.entry_id, name: "Filter Maintenance", interval_days: 30,
checklist: STEPS,
});
log(" created task_id =", taskRes.task_id);
log("\n== Step 3: wait for panel to refresh + select the task");
await page.waitForTimeout(2500);
await page.evaluate(({ eid, tid, fn }) => {
eval(fn);
window._panel._selectedEntryId = eid;
window._panel._selectedTaskId = tid;
window._panel._view = "task";
window._panel.requestUpdate();
}, { eid: obj.entry_id, tid: taskRes.task_id, fn: PANEL_EVAL });
await page.waitForTimeout(1500);
log("\n== Step 4: inspect overview tab DOM for the checklist preview card");
const result = await page.evaluate(({ fn }) => {
eval(fn);
const sr = window._sr;
const card = sr.querySelector(".checklist-preview-card");
const header = card?.querySelector(".checklist-preview-header")?.textContent?.trim();
const items = [...(card?.querySelectorAll("li") || [])].map((li) => li.textContent?.trim());
return {
hasCard: !!card,
header,
items,
cardOffsetTop: card?.offsetTop,
};
}, { fn: PANEL_EVAL });
log(" hasCard:", result.hasCard);
log(" header:", JSON.stringify(result.header));
log(" items:", JSON.stringify(result.items));
log(" offsetTop:", result.cardOffsetTop);
check("preview card rendered in task detail", result.hasCard === true, "");
check("header shows count = 3", result.header?.includes("(3)"), `header="${result.header}"`);
check("all 3 items rendered in order",
JSON.stringify(result.items) === JSON.stringify(STEPS),
`items=${JSON.stringify(result.items)}`);
await page.screenshot({ path: "checklist-preview.png", fullPage: false });
log(" saved checklist-preview.png");
log("\n== Step 5: verify preview is HIDDEN when checklist is empty");
const obj2 = await ws(page, { type: "maintenance_supporter/object/create", name: `Empty ${RUN}` });
const t2 = await ws(page, {
type: "maintenance_supporter/task/create",
entry_id: obj2.entry_id, name: "Bare Task", interval_days: 7,
});
await page.waitForTimeout(1500);
await page.evaluate(({ eid, tid, fn }) => {
eval(fn);
window._panel._selectedEntryId = eid;
window._panel._selectedTaskId = tid;
window._panel._view = "task";
window._panel.requestUpdate();
}, { eid: obj2.entry_id, tid: t2.task_id, fn: PANEL_EVAL });
await page.waitForTimeout(1000);
const empty = await page.evaluate(({ fn }) => {
eval(fn);
return !!window._sr.querySelector(".checklist-preview-card");
}, { fn: PANEL_EVAL });
check("preview hidden for tasks without checklist", empty === false, "");
log("\n== Cleanup");
await ws(page, { type: "maintenance_supporter/object/delete", entry_id: obj.entry_id });
await ws(page, { type: "maintenance_supporter/object/delete", entry_id: obj2.entry_id });
await cleanup(browser, ctx);
log(`\n=== ${pass} passed, ${fail} failed ===`);
process.exit(fail === 0 ? 0 : 1);
}
main().catch((e) => { console.error(e); process.exit(1); });