mirror of
https://github.com/Matysh/houseplan-card
synced 2026-07-31 16:38:31 +00:00
Audit HP-1540-01 (High): an auto-discovered vacuum has no config marker until the device dialog is saved once, yet the live-position section was already interactive. setVac, _vacSaveMatrix and auto-calibration all did cfg.markers.find(...) and silently bailed out — while the auto-calibration toast still claimed success. Every vacuum edit now materializes a minimal marker (same id/binding the dialog Save would produce), _vacSaveMatrix reports whether the write landed, and success toasts are gated on it. HP-1540-04: the auto-calibration room matcher accepted only polygon rooms and told users their room names did not match. It goes through the shared roomPoly() now, so legacy x/y/w/h rectangles count like everywhere else. HP-1540-06: the no-rooms/no-match/rough-fit toasts pointed at the removed point calibration; they now point at the fit panel that shipped instead, and docs/VACUUM.md Setup UX describes the actual UI. Also extracted vacMapIdFromAttrs as the explicit frontend half of the map-id contract (backend half lands with HP-1540-02). Regressions: demo/smoke_vacuum_firstuse.mjs starts from cfg.markers=[] (the fixture gap the audit called out) with rectangle plan rooms and a zero map_index, and fails 11 checks on the v1.54.0 bundle; i18n unit test asserts no point/точк wording in either language.
36 lines
1.3 KiB
JavaScript
36 lines
1.3 KiB
JavaScript
import test from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { readFileSync } from 'node:fs';
|
|
|
|
const en = JSON.parse(readFileSync(new URL('../src/i18n/en.json', import.meta.url)));
|
|
const ru = JSON.parse(readFileSync(new URL('../src/i18n/ru.json', import.meta.url)));
|
|
|
|
test('i18n: en and ru dictionaries carry the same key set', () => {
|
|
const enKeys = Object.keys(en).sort();
|
|
const ruKeys = Object.keys(ru).sort();
|
|
assert.deepEqual(enKeys, ruKeys);
|
|
});
|
|
|
|
test('i18n: no empty values', () => {
|
|
for (const [lang, d] of [['en', en], ['ru', ru]]) {
|
|
for (const [k, v] of Object.entries(d)) {
|
|
assert.ok(typeof v === 'string' && v.length > 0, `${lang}:${k} is empty`);
|
|
}
|
|
}
|
|
});
|
|
|
|
test('i18n: placeholders match between languages', () => {
|
|
const ph = (s) => (s.match(/\{\w+\}/g) || []).sort().join(',');
|
|
for (const k of Object.keys(en)) {
|
|
assert.equal(ph(en[k]), ph(ru[k]), `placeholder mismatch in ${k}`);
|
|
}
|
|
});
|
|
|
|
test('vac toasts never mention the removed point calibration (HP-1540-06)', () => {
|
|
for (const [lang, d] of [['en', en], ['ru', ru]]) {
|
|
for (const k of ['vac.autocal_no_rooms', 'vac.autocal_no_match', 'vac.autocal_res_warn']) {
|
|
assert.ok(!/point|точк/i.test(d[k]), `${lang}:${k} still points at point calibration`);
|
|
}
|
|
}
|
|
});
|