113 lines
3.4 KiB
JavaScript
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);
|
|
});
|