120 lines
3.8 KiB
Markdown
120 lines
3.8 KiB
Markdown
# 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](https://fly.stratonautica.ru/api/v2/) 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):
|
||
|
||
```bash
|
||
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`):
|
||
|
||
```bash
|
||
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):
|
||
|
||
```bash
|
||
cd /home/anton/leaflet_svelte
|
||
npx playwright install chromium
|
||
```
|
||
|
||
## Running tests
|
||
|
||
```bash
|
||
# 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:5173` but
|
||
`CSRF_TRUSTED_ORIGINS` only lists `localhost:5173`, every POST returns 403
|
||
with `{"detail": "CSRF Failed: Origin checking failed"}`. `run-stack.sh`
|
||
adds both hostnames to `CSRF_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_URL` at an unreachable
|
||
host.
|
||
- **`window._lsvMap`** is 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:
|
||
|
||
```bash
|
||
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:
|
||
|
||
```python
|
||
# 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.
|