iso-scalpel/tests/README.md

44 lines
2.5 KiB
Markdown
Executable File

# Tests
ISO Scalpel ships with a focused test suite built on `pytest`.
## Running
From the project root:
```bash
pip install -e '.[dev]' # pytest + ruff
python -m pytest # run everything
python -m pytest tests/test_deps.py -v # one module, verbose
python -m pytest -k OfferToInstall # a single test class
ruff check . # lint (must be clean)
```
`tests/test_deps.py` is hermetic — it mocks every third-party import and
never touches the network or filesystem, so it runs anywhere pytest does.
`tests/test_iso_model.py` and `tests/test_ui.py` require PySide6 and
pycdlib to be importable; they self-skip with `pytest.importorskip` when
either is absent (e.g. on a headless CI without the Qt runtime libs).
On Linux they also need `QT_QPA_PLATFORM=offscreen` and the Qt shared
libraries (`libegl1`, `libgl1`, …); install them with:
```bash
sudo apt install libegl1 libgl1 libglib2.0-0 libfontconfig1 \
libdbus-1-3 libxkbcommon0 libxcb-cursor0
```
## What's covered
| File | Subject |
|-----------------------|------------------------------------------------------------------------------------------------------------------|
| `tests/test_deps.py` | Dependency detection, version comparison, report formatting, install-command construction, interactive install flow (user-accept / user-decline / sudo fallback / sudo failure), `ensure_dependencies()` exit-code behaviour, `--check-deps` CLI flag parsing. |
| `tests/test_iso_model.py` | `IsoTreeModel` root-handling: `rowCount(QModelIndex())` reflects `/` contents directly (no virtual placeholder row), `fetchMore` populates without recursion, `index_from_path('/')` yields the invalid model root, `refresh_parent('/')` re-fetches without crashing, and the ISO pane shows entries + breadcrumb after `refresh()`. |
| `tests/test_ui.py` | Main-window UI contract: single-tab close-button hiding, two-tab restore, splitter sizes give the right pane non-zero width, transfer column structure + wiring, swap action absent from toolbar but bound to `Ctrl+Shift+X`, filter-box max widths, `Boot Image` action icon, `FsPane` column sizing. |
## Adding tests
Mirror each new module under `iso_scalpel/` with a `tests/test_<module>.py`.
Use `unittest.mock.patch` for any third-party imports the module touches so
the hermetic part of the suite stays runnable without PySide6 / pycdlib.