New apps Added
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
/**
|
||||
* 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); });
|
||||
Reference in New Issue
Block a user