trainUs/tests/README.md
David 352a3d5e88
Some checks are pending
CI / Lint & Format (push) Waiting to run
CI / Build (push) Waiting to run
CI / Tests (${{ matrix.browser }}) (chromium) (push) Waiting to run
CI / Tests (${{ matrix.browser }}) (firefox) (push) Waiting to run
Initial commit
2026-06-18 13:06:57 +02:00

91 lines
4.6 KiB
Markdown

# Test Suite
End-to-end tests for TrainUs using **Playwright** (Python) and **pytest**.
## Setup (first time)
```bash
cd tests
python -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/playwright install firefox chromium
```
## Running Tests
The Vite dev server starts automatically on port 5199 via the `app_url` fixture in `conftest.py`. It is stopped automatically when all tests finish.
### Available commands (from project root)
| Command | Browsers | Mode |
| -------------------------------- | ------------------ | --------------------------------- |
| `npm run test` | Firefox | Sequential |
| `npm run test:chromium` | Chromium | Sequential |
| `npm run test:parallel` | Firefox + Chromium | Parallel (all CPU cores) |
| `npm run test:parallel:firefox` | Firefox | Parallel (all CPU cores) |
| `npm run test:parallel:chromium` | Chromium | Parallel (all CPU cores) |
| `npm run test:parallel:n` | Firefox + Chromium | Parallel, N workers (`WORKERS=N`) |
### Running directly with pytest
```bash
# All tests, Firefox only
cd tests && .venv/bin/python -m pytest --browser firefox -v
# Single file, Firefox
cd tests && .venv/bin/python -m pytest test_step3_exercises.py --browser firefox -v
# Parallel via shell script
./tests/run_parallel.sh
# Parallel, Firefox only, 4 workers
PYTEST_WORKERS=4 PYTEST_BROWSERS="firefox" ./tests/run_parallel.sh
# Single file in parallel via shell script
./tests/run_parallel.sh test_step3_exercises.py
```
## Browser Targets
- **Firefox** — primary browser; all tests must pass
- **Chromium** — secondary browser; all tests must also pass
## File Naming Convention
```
test_step<N>_<feature_name>.py
```
Each file corresponds to one implementation step. Tests within a file cover both green paths (happy flow) and red paths (bad inputs, edge cases, error states).
## Test Files
| File | Feature | Tests |
| --------------------------------------- | ------------------------------------------- | ------- |
| `test_step0_scaffolding.py` | App shell, navigation, i18n | 5 |
| `test_step1_database.py` | DB init, CRUD, persistence | 15 |
| `test_step2_settings.py` | Language, theme, name, DB export/restore | 21 |
| `test_step2b_schema_hardening.py` | UNIQUE constraints, suffix table | 10 |
| `test_step3_exercises.py` | Exercise CRUD, search, validation | 17 |
| `test_step3b_exercise_export_import.py` | JSON export/import, collisions, suffixes | 23 |
| `test_step3c_backup.py` | Backup filename, reminder, threshold | 11 |
| `test_step4_combos.py` | Combo CRUD, exercise ordering, reps/weight | 19 |
| `test_step5_sessions.py` | Session CRUD, items, reps/weight | 20 |
| `test_step6_collections_home.py` | Collections CRUD, home page stats | 19 |
| `test_step7_import_export.py` | Full multi-entity export/import | 14 |
| `test_step8_execution.py` | Execution mode, queue, partial logs | 17 |
| `test_step9_stats.py` | Statistics charts, streak, date range | 16 |
| `test_step10_pwa.py` | PWA manifest, install prompt, accessibility | 11 |
| `test_step12_timers.py` | EMOM/AMRAP/TABATA timers, pause/resume | 20 |
| `test_step13_markdown.py` | Markdown rendering in detail views | 9 |
| `test_step14_form_shortcuts.py` | Ctrl+Enter save, Escape cancel on forms | 10 |
| `test_step15_audio_cues.py` | TABATA/AMRAP audio cue timing (fake clock) | 7 |
| **Total** | | **264** |
## Infrastructure
- **`conftest.py`**: Pytest fixtures. Starts the Vite dev server (`npm run dev -- --port 5199`) before the first test and stops it after all tests complete. Handles multiple concurrent workers safely using file locks.
- **`pytest.ini`**: Sets `base_url = http://localhost:5199`.
- **`run_parallel.sh`**: Shell wrapper for `pytest-xdist` parallel runs. Accepts `PYTEST_WORKERS` and `PYTEST_BROWSERS` environment variables.
- **`requirements.txt`**: `playwright`, `pytest`, `pytest-playwright`, `pytest-xdist`.