mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-10-05 06:45:09 +00:00
CodeRabbit flagged elementKeys() in style-editor.js: render() claims the whole customization.layout child as the widget's own (removing it from the generic fallback renderer, since posting the same offset twice is worse), but elementKeys() only listed keys that also have their own top-level style block. A hand-written schema can put a key under layout that never got one -- a logo, a timeout indicator, a possession arrow with a position but no font or colour -- and that key's only control silently disappeared: no row in the style editor's table (elementKeys never listed it) and no fallback section either (layout was removed wholesale). elementKeys() now appends any layout-declared key not already covered by a style element, so table() renders a row for it (layout columns only, no style columns) and the wholesale layout ownership claim stays truthful. Verified against current code before fixing. New regression test (test/js/unit/test_style_editor_element_keys.js, following this repo's existing eval-extraction pattern for testing widget JS without a browser) fails against the reverted function and passes with the fix; added to run_all.js and the suite table in test/js/README.md. Full pytest suite: 4887 passed, 62 skipped, 2 failed -- both the pre-existing Europe/Kiev/Asia/Calcutta tzdata-alias gap on this sandbox, identical on origin/main, unrelated to this change. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Dpg3HLWohdCUdzz2QNHanm
68 lines
3.9 KiB
Markdown
68 lines
3.9 KiB
Markdown
# Web-interface JS tests
|
|
|
|
Covers `web_interface/static/v3/js/plugins/list_filter.js` (the shared
|
|
search/filter/sort controller) and the plugin-manager grids that use it:
|
|
Installed Plugins, the Plugin Store, and Starlark Apps.
|
|
|
|
There is no JS toolchain in this repo, so these are plain node scripts with no
|
|
test framework. Each prints `ok`/`FAIL` lines and exits non-zero on failure.
|
|
|
|
## Running
|
|
|
|
```bash
|
|
cd test/js
|
|
npm install # jsdom, for the DOM suites only
|
|
node run_all.js
|
|
```
|
|
|
|
The unit suites need nothing but node. The DOM suites additionally need a
|
|
running web interface, because they test against the **real** server-rendered
|
|
HTML and the **real** API rather than fixtures:
|
|
|
|
```bash
|
|
# in another shell, from the repo root
|
|
EMULATOR=true python3 web_interface/app.py # http://localhost:5000
|
|
|
|
# or point the suites at a device
|
|
BASE=http://10.0.10.169:5000 node run_all.js
|
|
```
|
|
|
|
`run_all.js` skips the DOM suites (rather than failing) when jsdom is missing or
|
|
nothing is listening, so it stays useful in a bare checkout.
|
|
|
|
## The suites
|
|
|
|
| Suite | Needs a server | Covers |
|
|
|---|---|---|
|
|
| `unit/test_list_filter.js` | no | `ListFilter` search/filter/sort/count/sticky, and the installed-plugins config **extracted verbatim** from `plugins_manager.js` so the test can't drift from it |
|
|
| `unit/test_render_cards.js` | no | `renderInstalledCards` markup, both empty states, and HTML-escaping of hostile plugin metadata |
|
|
| `unit/test_style_editor_element_keys.js` | no | `elementKeys()` from `widgets/style-editor.js`: a hand-written `customization.layout` entry with no style block of its own still gets a row, since the widget claims the whole `layout` block from the generic fallback renderer |
|
|
| `dom/test_installed_dom.js` | yes | The toolbar in a real DOM: pill/search/sort interaction, the HTMX partial re-swap, and a `getComputedStyle` check that `.filter-pill[data-active]` really matches the emitted markup |
|
|
| `dom/test_store_dom.js` | yes | Store pagination, per-page, category, tri-state Installed button, and persistence across a re-boot, against the live registry |
|
|
| `dom/test_no_double_fetch.js` | yes | Loads the **whole** `plugins_manager.js` and counts requests: typing in the store search must filter the cached list, not refetch `/api/v3/plugins/store/list` |
|
|
| `dom/test_tools_sections.js` | yes | The Tools tab's MQTT bridge and Pixlet editor sections: form prefill, the write-only password (blank means unchanged), the running-session banner and countdown, and that the editor link points at the host you loaded the page from |
|
|
|
|
Point the DOM suites at a rig with a full plugin set when it matters — a dev box
|
|
with two plugins installed will pass while exercising very little.
|
|
|
|
## Notes for whoever changes this next
|
|
|
|
- The suites read the shipped files off disk and, for the DOM ones, the partial
|
|
from the running server. They do not keep their own copy of the markup, so
|
|
renaming an element id will fail them loudly rather than silently pass.
|
|
- `unit/test_list_filter.js` `eval`s a slice of `plugins_manager.js` located by
|
|
the text `function installedSortName(plugin)`. If that function is renamed,
|
|
fix the slice markers rather than pasting a copy of the config into the test.
|
|
- A few assertions exist specifically to stop earlier bugs coming back:
|
|
trailing spaces surviving the search debounce; a multi-word query that spans
|
|
two adjacent search fields (field order in the haystack is load-bearing);
|
|
`window.installedPlugins` staying at full length while the grid is filtered.
|
|
- Watch for assertions that can pass vacuously. Several here deliberately guard
|
|
against it — e.g. counting only non-skeleton cards, and asserting a search
|
|
phrase matches something before comparing two results.
|
|
|
|
The old-vs-new differential suites used to verify that the store and Starlark
|
|
migrations were behaviour-preserving are not included: they compared against the
|
|
pre-refactor implementation, which now only exists in git history. See PR #540
|
|
if that comparison ever needs redoing.
|