mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-10-04 06:15:09 +00:00
A new "Web UI JS tests" job installs jsdom, starts the web interface in emulator mode and runs test/js/run_all.js with REQUIRE_DOM=1, which makes a DOM suite that can't run a failure rather than a silent skip. (The unit suites were already covered through pytest.) Two suites failed against main when run for real: - test_tools_sections rendered the Tools partial without LEDEscape, which base.html's app-early.js defines; it now installs it in beforeParse, and supplies two sample Starlark apps (one id with a quote) when the server has none, instead of assuming a device with apps and Pixlet. - test_store_dom assumed the live registry had at most 48 plugins; it now checks pagination whichever side of 48 it is. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
115 lines
3.8 KiB
YAML
115 lines
3.8 KiB
YAML
name: Tests
|
|
|
|
on:
|
|
pull_request:
|
|
push:
|
|
branches: [main]
|
|
# Manual runs against any branch — useful when a PR's automatic run
|
|
# needs a re-run or didn't get created.
|
|
workflow_dispatch:
|
|
|
|
# The jobs only check out the repo and run the tests.
|
|
permissions:
|
|
contents: read
|
|
|
|
jobs:
|
|
plugin-safety:
|
|
name: Plugin safety harness + unit tests
|
|
runs-on: ubuntu-latest
|
|
env:
|
|
# The bundled fixture plugin gives the harness at least one real plugin
|
|
# to render, and REQUIRE_PLUGINS turns "discovered zero plugins" into a
|
|
# hard failure instead of a silent all-skip green run.
|
|
LEDMATRIX_PLUGINS_DIR: test/fixtures/plugins
|
|
LEDMATRIX_REQUIRE_PLUGINS: "1"
|
|
steps:
|
|
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0
|
|
with:
|
|
python-version: "3.12"
|
|
cache: pip
|
|
|
|
- name: Install dependencies
|
|
run: |
|
|
python -m pip install --upgrade pip
|
|
pip install -r requirements.txt -r web_interface/requirements.txt -r requirements-test.txt
|
|
pip install RGBMatrixEmulator
|
|
|
|
- name: Run plugin safety harness
|
|
run: |
|
|
pytest --no-cov test/plugins/
|
|
|
|
unit-tests:
|
|
name: Core unit tests
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0
|
|
with:
|
|
python-version: "3.12"
|
|
cache: pip
|
|
|
|
- name: Install dependencies
|
|
run: |
|
|
python -m pip install --upgrade pip
|
|
pip install -r requirements.txt -r web_interface/requirements.txt -r requirements-test.txt
|
|
pip install RGBMatrixEmulator
|
|
|
|
# Run the ENTIRE test tree (except test/plugins, which the
|
|
# plugin-safety job owns). New test files are enrolled automatically;
|
|
# excluding anything requires a visible, commented --ignore here.
|
|
# Coverage is measured and enforced only in this step — pytest.ini
|
|
# deliberately carries no coverage flags so local runs stay fast.
|
|
- name: Run core unit suites
|
|
run: |
|
|
pytest -m "not hardware" test/ \
|
|
--ignore=test/plugins \
|
|
--cov=src --cov=web_interface \
|
|
--cov-report=term \
|
|
--cov-fail-under=52
|
|
|
|
js-tests:
|
|
name: Web UI JS tests
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0
|
|
with:
|
|
python-version: "3.12"
|
|
cache: pip
|
|
|
|
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
|
with:
|
|
node-version: "22"
|
|
|
|
- name: Install dependencies
|
|
run: |
|
|
python -m pip install --upgrade pip
|
|
pip install -r requirements.txt -r web_interface/requirements.txt
|
|
npm install --no-audit --no-fund --prefix test/js
|
|
|
|
# The DOM suites test the real server-rendered pages and API, so they
|
|
# need the web interface running. REQUIRE_DOM turns "couldn't reach it"
|
|
# into a failure instead of a silent skip.
|
|
- name: Start the web interface
|
|
run: |
|
|
EMULATOR=true python -c "from web_interface.app import app; app.run(host='127.0.0.1', port=5000, threaded=True)" > web.log 2>&1 &
|
|
for i in $(seq 60); do curl -sf -o /dev/null http://127.0.0.1:5000/ && exit 0; sleep 1; done
|
|
cat web.log
|
|
exit 1
|
|
|
|
- name: Run JS suites
|
|
env:
|
|
BASE: http://127.0.0.1:5000
|
|
REQUIRE_DOM: "1"
|
|
run: node test/js/run_all.js
|