Skip to content

Commit f6da6ad

Browse files
committed
Improve just e2e and coverage recipes
1 parent 9b80756 commit f6da6ad

1 file changed

Lines changed: 64 additions & 36 deletions

File tree

justfile

Lines changed: 64 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ mod release
66
default:
77
@just --list
88

9-
# Build the project
10-
build:
9+
# Build the project and local dev/test browser dependency
10+
build: _install-playwright-browsers
1111
{{ ninja }} pylib qt
1212

1313
# Build wheels (needed for some platforms)
@@ -18,66 +18,92 @@ wheels:
1818
check:
1919
{{ ninja }} pylib qt check
2020

21-
# Run all tests (Rust, Python, TypeScript). Pass --coverage to enforce coverage.
22-
test coverage='':
23-
just {{ if coverage == "--coverage" { "coverage" } else { "_test" } }}
21+
# Run all tests (Rust, Python, TypeScript). Pass --coverage to enforce coverage, and --html to include HTML reports.
22+
[arg("coverage", long="coverage", value="--coverage")]
23+
[arg("html", long="html", value="--html")]
24+
test coverage='' html='':
25+
just {{ if coverage == "--coverage" { "coverage " + html } else { "_test" } }}
2426

2527
# Run coverage for Rust, Python, TypeScript, and Svelte-related Vitest tests
26-
coverage:
27-
just _coverage-rust
28-
just _coverage-py
29-
just _coverage-ts
30-
31-
# Run Rust tests. Pass --coverage to enforce Rust coverage.
32-
test-rust coverage='':
33-
just {{ if coverage == "--coverage" { "_coverage-rust" } else { "_test-rust" } }}
34-
35-
# Run Python tests. Pass --coverage to enforce pylib and Qt Python coverage.
36-
test-py coverage='':
37-
just {{ if coverage == "--coverage" { "_coverage-py" } else { "_test-py" } }}
38-
39-
# Run TypeScript/Svelte-related Vitest tests. Pass --coverage to enforce Vitest coverage.
40-
test-ts coverage='':
41-
just {{ if coverage == "--coverage" { "_coverage-ts" } else { "_test-ts" } }}
42-
28+
[arg("html", long="html", value="--html")]
29+
coverage html='':
30+
just _coverage-rust {{ html }}
31+
just _coverage-py {{ html }}
32+
just _coverage-ts {{ html }}
33+
34+
# Run Rust tests. Pass --coverage to enforce Rust coverage, and --html to include an HTML report.
35+
[arg("coverage", long="coverage", value="--coverage")]
36+
[arg("html", long="html", value="--html")]
37+
test-rust coverage='' html='':
38+
just {{ if coverage == "--coverage" { "_coverage-rust " + html } else { "_test-rust" } }}
39+
40+
# Run Python tests. Pass --coverage to enforce pylib and Qt Python coverage, and --html to include HTML reports.
41+
[arg("coverage", long="coverage", value="--coverage")]
42+
[arg("html", long="html", value="--html")]
43+
test-py coverage='' html='':
44+
just {{ if coverage == "--coverage" { "_coverage-py " + html } else { "_test-py" } }}
45+
46+
# Run TypeScript/Svelte-related Vitest tests. Pass --coverage to enforce Vitest coverage, and --html to include an HTML report.
47+
[arg("coverage", long="coverage", value="--coverage")]
48+
[arg("html", long="html", value="--html")]
49+
test-ts coverage='' html='':
50+
just {{ if coverage == "--coverage" { "_coverage-ts " + html } else { "_test-ts" } }}
51+
52+
[private]
4353
_test:
4454
{{ ninja }} check:rust_test check:pytest check:vitest
4555

56+
[private]
4657
_test-rust:
4758
{{ ninja }} check:rust_test
4859

60+
[private]
4961
_test-py:
5062
{{ ninja }} check:pytest
5163

64+
[private]
5265
_test-ts:
5366
{{ ninja }} check:vitest
5467

55-
_coverage-rust:
68+
[private]
69+
_coverage-rust html='':
5670
mkdir -p out/coverage/rust out/bin
5771
test -x out/bin/cargo-llvm-cov || cargo install cargo-llvm-cov --version 0.8.4 --locked --root out
5872
ANKI_TEST_MODE=1 out/bin/cargo-llvm-cov llvm-cov --workspace --locked --json --summary-only --output-path out/coverage/rust/coverage-summary.json --fail-under-lines 60
73+
{{ if html == "--html" { "ANKI_TEST_MODE=1 out/bin/cargo-llvm-cov llvm-cov report --html --output-dir out/coverage/rust/html" } else { "true" } }}
5974

60-
_coverage-py:
75+
[private]
76+
_coverage-py html='':
6177
{{ ninja }} pylib qt
62-
just _coverage-py-pylib
63-
just _coverage-py-qt
78+
just _coverage-py-pylib {{ html }}
79+
just _coverage-py-qt {{ html }}
6480

65-
_coverage-py-pylib:
81+
[private]
82+
_coverage-py-pylib html='':
6683
mkdir -p out/coverage/python-pylib
6784
PYTHONPATH=out/pylib ANKI_TEST_MODE=1 out/pyenv/bin/python -m coverage run --source=pylib/anki --data-file=out/coverage/python-pylib/.coverage -m pytest -p no:cacheprovider pylib/tests
6885
out/pyenv/bin/python -m coverage json --data-file=out/coverage/python-pylib/.coverage -o out/coverage/python-pylib/coverage-summary.json
6986
out/pyenv/bin/python -m coverage report --data-file=out/coverage/python-pylib/.coverage --fail-under=65
87+
{{ if html == "--html" { "out/pyenv/bin/python -m coverage html --data-file=out/coverage/python-pylib/.coverage -d out/coverage/python-pylib/html --fail-under=65" } else { "true" } }}
7088

71-
_coverage-py-qt:
89+
[private]
90+
_coverage-py-qt html='':
7291
mkdir -p out/coverage/python-qt
7392
PYTHONPATH=pylib:out/pylib:out/qt ANKI_TEST_MODE=1 out/pyenv/bin/python -m coverage run --source=qt/aqt --data-file=out/coverage/python-qt/.coverage -m pytest -p no:cacheprovider qt/tests
7493
out/pyenv/bin/python -m coverage json --data-file=out/coverage/python-qt/.coverage -o out/coverage/python-qt/coverage-summary.json
7594
out/pyenv/bin/python -m coverage report --data-file=out/coverage/python-qt/.coverage --fail-under=20
95+
{{ if html == "--html" { "out/pyenv/bin/python -m coverage html --data-file=out/coverage/python-qt/.coverage -d out/coverage/python-qt/html --fail-under=20" } else { "true" } }}
7696

77-
_coverage-ts:
97+
[private]
98+
_coverage-ts html='':
7899
{{ ninja }} node_modules ts:generated
79100
mkdir -p out/coverage/typescript
80-
out/extracted/node/bin/yarn vitest:once --coverage.enabled true --coverage.provider=v8 --coverage.reporter=text-summary --coverage.reporter=json-summary --coverage.reportsDirectory=../out/coverage/typescript --coverage.thresholds.lines=5
101+
{{ yarn }} vitest:once --coverage.enabled true --coverage.provider=v8 --coverage.reporter=text-summary --coverage.reporter=json-summary {{ if html == "--html" { "--coverage.reporter=html" } else { "" } }} --coverage.reportsDirectory=../out/coverage/typescript --coverage.thresholds.lines=5
102+
103+
[private]
104+
_install-playwright-browsers:
105+
{{ ninja }} node_modules
106+
{{ playwright_env }} {{ yarn }} playwright install chromium
81107

82108
# Check formatting (fast, no build needed)
83109
fmt:
@@ -134,11 +160,13 @@ docs-rust:
134160
ci branch:
135161
gh workflow run ci.yml --ref {{ branch }}
136162

137-
# Run TS Playwright e2e tests against a temporary Anki instance
138-
# (Playwright's webServer config invokes qt/tests/launch_anki_for_e2e.py)
139-
test-e2e *args:
140-
{{ ninja }} node_modules ts:generated pylib qt
141-
out/extracted/node/bin/yarn playwright test {{ args }}
163+
# Run TS Playwright e2e tests against a temporary Anki instance.
164+
test-e2e *args: _install-playwright-browsers
165+
{{ ninja }} ts:generated pylib qt
166+
{{ playwright_env }} {{ yarn }} playwright test {{ args }}
167+
168+
# Helpers to get the right commands for the platform
142169

143-
# Helper to get the right ninja command for the platform
144170
ninja := if os() == "windows" { "tools\\ninja" } else { "./ninja" }
171+
playwright_env := if os() == "windows" { "set PLAYWRIGHT_BROWSERS_PATH=out\\playwright-browsers&&" } else { "PLAYWRIGHT_BROWSERS_PATH=out/playwright-browsers" }
172+
yarn := if os() == "windows" { "out\\extracted\\node\\yarn.cmd" } else { "out/extracted/node/bin/yarn" }

0 commit comments

Comments
 (0)