3.8 KiB
Testing
End-to-end tests run against the full chain:
Playwright → leaflet_svelte (Vite :5173)
│ proxies /api → :8000
▼
stratoflights Django (:8000)
│ TAWHIRI_BASE_URL → :8001
▼
fake_tawhiri stub (:8001)
The real production flow replaces the stub with
tawhiri or the Go-based
predictor-refactored running on :8080. Any service that speaks the
Tawhiri v2 query-string protocol is drop-in compatible.
One-time setup
Python deps for stratoflights (uses sqlite via DJANGO_ENV=production to
avoid needing Postgres):
pip install --user --break-system-packages \
Django djangorestframework djangorestframework-simplejwt drf-spectacular \
requests django-cors-headers Pillow python-dotenv channels daphne
Initialize the Django DB (sqlite at stratoflights/db.sqlite3):
cd /home/anton/stratoflights
DJANGO_ENV=production python3 manage.py migrate
DJANGO_ENV=production \
DJANGO_SUPERUSER_USERNAME=demo \
DJANGO_SUPERUSER_PASSWORD=demo \
DJANGO_SUPERUSER_EMAIL=demo@demo.demo \
python3 manage.py createsuperuser --noinput
Playwright browsers (first time only):
cd /home/anton/leaflet_svelte
npx playwright install chromium
Running tests
# Start the full stack (Vite, Django, fake predictor).
scripts/run-stack.sh
# Run the Playwright suite.
npm run test:e2e
# Tear down.
scripts/stop-stack.sh
Individual files: npm run test:e2e -- tests/e2e/workspaces.spec.ts.
UI mode for debugging: npm run test:e2e:ui.
Test organization
| File | Covers |
|---|---|
auth.spec.ts |
Anonymous → login redirect, form login, already-authed visits |
smoke.spec.ts |
Page loads, MapLibre canvas mounts, navbar renders |
workspaces.spec.ts |
Auto-create, add/remove, prediction render pipeline |
settings.spec.ts |
Locale switch updates UI text live |
saved-points.spec.ts |
Point editor modal opens |
Fixtures (tests/e2e/fixtures.ts) provide login(context) / logout(context)
helpers that go through page.context().request so cookies are shared with
the page.
Key gotchas
- Django CSRF is origin-aware. If Playwright hits
127.0.0.1:5173butCSRF_TRUSTED_ORIGINSonly listslocalhost:5173, every POST returns 403 with{"detail": "CSRF Failed: Origin checking failed"}.run-stack.shadds both hostnames toCSRF_TRUSTED_ORIGINS. - Test parallelism is disabled (
fullyParallel: false,workers: 1) because fixtures share the Django sqlite DB. If we ever want parallel workers we need per-worker DBs. - The fake tawhiri never fails. To test the frontend's error path you
need to either stop the fake or point
TAWHIRI_BASE_URLat an unreachable host. window._lsvMapis only set in dev builds (import.meta.env.DEV), so the workspace render test won't see the layer names in a production bundle.
Swapping in the Go predictor
fake_tawhiri.py is an expedient stub. To swap in the real Go predictor:
cd /home/anton/predictor-refactor/predictor-refactored
PREDICTOR_DATA_DIR=/tmp/predictor-data go run ./cmd/api &
# ^ first run downloads ~9 GB of GFS GRIB data; takes 30–60 minutes.
# Then restart stratoflights with TAWHIRI_BASE_URL pointing at it:
cd /home/anton/stratoflights
TAWHIRI_BASE_URL=http://127.0.0.1:8080/api/v1/ python3 manage.py runserver
Patched files in stratoflights
To make this stack work we made one tiny change in stratoflights so the predictor endpoint is configurable:
# stratoflights_api/services/tawhiri.py
class TawhiriClient:
BASE_URL = os.getenv("TAWHIRI_BASE_URL", "https://fly.stratonautica.ru/api/v2/")
This is backwards-compatible — the default keeps the existing behavior.