30 lines
1.6 KiB
JavaScript
30 lines
1.6 KiB
JavaScript
// Focused UI behavior checks, with no browser or controller required.
|
|
const fs = require('fs');
|
|
const vm = require('vm');
|
|
const ctx = vm.createContext({
|
|
tr: key => key,
|
|
app: { zones: [], devices: [], groups: [] },
|
|
});
|
|
vm.runInContext(fs.readFileSync('web/js-dynamic/entities.js', 'utf8'), ctx);
|
|
const zone = {
|
|
enabled: true,
|
|
control_owner: 'automation',
|
|
control_source: 'automation.flow',
|
|
simple_heat: { day_target: 20, night_target: 20.6 },
|
|
current_temperature: 20.2,
|
|
demand: false,
|
|
};
|
|
function check(fn, expected, ...args) {
|
|
const value = ctx[fn](...args);
|
|
if (value !== expected) throw new Error(`${fn}: ${value} != ${expected}`);
|
|
}
|
|
check('zoneControlOwnerLabel', 'zones.ownerFlow', zone);
|
|
check('zoneRuntimeStatusLabel', 'zones.flowDayOff', zone, 'off', { power: false });
|
|
check('zoneRuntimeStatusLabel', 'zones.flowDayPendingOff', zone, 'off', { power: true });
|
|
check('zoneRuntimeStatusLabel', 'zones.flowStandby', zone, 'heat', { power: true, enabled: true, online: true });
|
|
check('zoneRuntimeStatusLabel', 'zones.flowHeating', { ...zone, demand: true }, 'heat', { power: true, enabled: true, online: true, mode: 'heat' });
|
|
check('zoneRuntimeStatusLabel', 'zones.flowCoasting', { ...zone, heat_coasting: true }, 'heat', { power: true, enabled: true, online: true });
|
|
check('zoneRuntimeStatusLabel', 'zones.manualDeviceControl', { ...zone, device_manual_override: true }, 'heat', { power: true });
|
|
check('zoneControlOwnerLabel', 'zones.ownerExternal', { ...zone, control_owner: 'direct_manual', control_source: 'external' });
|
|
console.log('OK: 8 UI Flow/manual status scenarios');
|