mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-10-04 14:25:08 +00:00
A prior fix on this PR made elementKeys() append any layout-only key with
no style block of its own (a logo, a timeout indicator, a possession
arrow), so table() draws a row for it instead of losing it when the
wholesale `layout` claim removes the generic fallback. That covers a
layout-only key shaped like an object (x_offset/y_offset, ...), because
columnsFor() only ever produced columns from a key's *sub-fields*.
It missed the case where the layout-only key's own value is itself a
leaf -- a plain "show_logo" boolean directly under layout, no x/y object
underneath. elementKeys() still lists it (any row: no matching column),
so it renders as an uneditable blank row and its only control -- the
generic fallback checkbox -- is still gone. Confirmed by executing the
real widget's render() against a synthetic schema in Node (a DOM-stub
harness, not committed): the field's name never appeared as an <input>.
columnsFor() now gives such a leaf key a column keyed to itself
('layout-leaf'), and elementRow() binds it to the leaf's own path
(customization.layout.<key>, matching the name the fallback would have
used) instead of leaving every cell blank.
New regression test (test/js/unit/test_style_editor_layout_leaf_columns.js,
following this PR's existing eval-extraction pattern) checks the leaf
column is produced, is self-keyed, doesn't duplicate, and that a schema
with no leaf-valued layout key is unaffected; wired into run_all.js and
the suite table in test/js/README.md.
test/js/run_all.js: 84 + 6 + 6 = all suites passed (jsdom unavailable
here, DOM suites skip as before). Python suite untouched by this change;
test_style_editor_extra_fields.py, test_style_editor_save_roundtrip.py
and the one PIL-dependent style_editor_takeover.py case fail identically
before this commit -- missing flask/PIL in this sandbox, not this PR.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
69 lines
4.2 KiB
Markdown
69 lines
4.2 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 |
|
|
| `unit/test_style_editor_layout_leaf_columns.js` | no | `columnsFor()` from `widgets/style-editor.js`: a layout-only key whose own value is a leaf (no x/y sub-object, e.g. a `show_logo` toggle) gets a self-keyed column instead of a blank, uneditable row |
|
|
| `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.
|