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

113 lines
3.4 KiB
JavaScript

/**
* Quick Playwright test for entity attribute introspection.
* Run from frontend-src: node test-entity-attributes.mjs
*/
import { chromium } from "playwright";
const HA_URL = "http://homeassistant-dev:8123";
async function main() {
const browser = await chromium.connect("ws://localhost:3000");
const context = await browser.newContext();
const page = await context.newPage();
// Navigate to HA
await page.goto(HA_URL);
await page.waitForTimeout(2000);
// Check if we need to login
const url = page.url();
console.log("Current URL:", url);
if (url.includes("/auth/authorize") || url.includes("onboarding")) {
// Try auto-login - look for login form
const loginField = await page.$('input[name="username"]');
if (loginField) {
await loginField.fill("dev");
const pwField = await page.$('input[name="password"]');
if (pwField) {
await pwField.fill("dev");
await page.click('mwc-button, button[type="submit"], ha-button');
await page.waitForTimeout(3000);
}
}
}
console.log("After login URL:", page.url());
// Test the WS endpoint via browser console
const result = await page.evaluate(async () => {
// Access hass object
const ha = document.querySelector("home-assistant");
if (!ha || !ha.hass) {
return { error: "No hass object found" };
}
// Test entity/attributes endpoint
try {
const res = await ha.hass.connection.sendMessagePromise({
type: "maintenance_supporter/entity/attributes",
entity_id: "sensor.sun_solar_elevation",
});
return { success: true, result: res };
} catch (e) {
return { error: e.message || String(e) };
}
});
console.log("\n=== Entity Attributes WS Test ===");
console.log(JSON.stringify(result, null, 2));
// Test with a non-existent entity to verify graceful handling
const result2 = await page.evaluate(async () => {
const ha = document.querySelector("home-assistant");
try {
const res = await ha.hass.connection.sendMessagePromise({
type: "maintenance_supporter/entity/attributes",
entity_id: "climate.nonexistent",
});
return { success: true, result: res };
} catch (e) {
return { error: e.message || String(e) };
}
});
console.log("\n=== Non-existent Entity Test ===");
console.log(JSON.stringify(result2, null, 2));
// Check binary_sensor entities
const binarySensors = await page.evaluate(async () => {
const ha = document.querySelector("home-assistant");
if (!ha || !ha.hass) return { error: "No hass" };
const states = ha.hass.states;
const ms = {};
for (const [k, v] of Object.entries(states)) {
if (k.includes("maintenance")) {
ms[k] = { state: v.state, attributes: v.attributes };
}
}
return ms;
});
console.log("\n=== Maintenance Entities ===");
console.log(JSON.stringify(binarySensors, null, 2));
// Navigate to panel and test the UI
await page.goto(HA_URL + "/maintenance_supporter_panel");
await page.waitForTimeout(3000);
// Take screenshot
await page.screenshot({ path: "/tmp/panel-test.png", fullPage: true });
console.log("\nScreenshot saved to /tmp/panel-test.png");
await context.close();
await browser.close();
console.log("\n=== All tests completed ===");
}
main().catch((e) => {
console.error("Test failed:", e);
process.exit(1);
});