New apps Added
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
/**
|
||||
* Verifies that dialogs surface localized error messages when the WS schema
|
||||
* rejects an input. Covers the two most common shapes: length cap and range
|
||||
* cap. Asserts the error string contains the translated field label + the
|
||||
* translated constraint (e.g. "max 200 characters"), not raw voluptuous text.
|
||||
*/
|
||||
import { setup, ws, cleanup } from "./e2e-helpers.mjs";
|
||||
|
||||
const RUN = Date.now().toString(36);
|
||||
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== Direct WS call with oversize name (expect rejection)");
|
||||
let wsErr;
|
||||
try {
|
||||
await ws(page, {
|
||||
type: "maintenance_supporter/object/create",
|
||||
name: "X".repeat(500),
|
||||
});
|
||||
} catch (e) {
|
||||
wsErr = e;
|
||||
}
|
||||
check("WS rejected oversize name", !!wsErr, "no error raised");
|
||||
log(" raw error:", String(wsErr?.message || "").slice(0, 120));
|
||||
|
||||
log("\n== Call describeWsError from the panel with the raw error");
|
||||
const localized = await page.evaluate(({ rawMsg, fn }) => {
|
||||
eval(fn);
|
||||
// The ws-errors module is bundled into the panel; reach it via the panel instance.
|
||||
// We can approximate the test by driving the object-dialog: open it, submit
|
||||
// an oversize name, and read back the dialog's displayed error.
|
||||
return rawMsg; // just echoed for now
|
||||
}, { rawMsg: String(wsErr?.message || wsErr), fn: PANEL_EVAL });
|
||||
log(" echoed:", localized?.slice(0, 120));
|
||||
|
||||
log("\n== UI path: open object-dialog, enter oversize name, hit save");
|
||||
await page.evaluate((fn) => {
|
||||
eval(fn);
|
||||
window._sr.querySelector("maintenance-object-dialog").openCreate();
|
||||
}, PANEL_EVAL);
|
||||
await page.waitForTimeout(800);
|
||||
await page.evaluate(({ name, fn }) => {
|
||||
eval(fn);
|
||||
const dlg = window._sr.querySelector("maintenance-object-dialog");
|
||||
dlg._name = name;
|
||||
dlg.requestUpdate();
|
||||
}, { name: "X".repeat(500), fn: PANEL_EVAL });
|
||||
await page.waitForTimeout(300);
|
||||
await page.evaluate(({ fn }) => {
|
||||
eval(fn);
|
||||
const dlg = window._sr.querySelector("maintenance-object-dialog");
|
||||
dlg._save();
|
||||
}, { fn: PANEL_EVAL });
|
||||
await page.waitForTimeout(1500);
|
||||
|
||||
const errText = await page.evaluate(({ fn }) => {
|
||||
eval(fn);
|
||||
const dlg = window._sr.querySelector("maintenance-object-dialog");
|
||||
return dlg._error;
|
||||
}, { fn: PANEL_EVAL });
|
||||
|
||||
log(" dialog _error:", errText);
|
||||
check(
|
||||
"dialog error is localized (contains 'too long' in EN)",
|
||||
typeof errText === "string"
|
||||
&& errText.toLowerCase().includes("too long")
|
||||
&& errText.includes("200"),
|
||||
`got: "${errText}"`,
|
||||
);
|
||||
check(
|
||||
"dialog error is NOT the raw voluptuous string",
|
||||
typeof errText === "string" && !errText.includes("dictionary value @"),
|
||||
`got raw voluptuous: "${errText}"`,
|
||||
);
|
||||
|
||||
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