syntheogenesis / tests /README.md
Tengo Gzirishvili
CRISPR M0: validation test suite + fix KO cut-position copy-paste bug
36858f4
|
Raw
History Blame Contribute Delete
2.24 kB
# TuringDNA CRISPR engine — test suite
Dev-only regression net for the live guide-design engine. **Not shipped**
in the Docker image and intentionally **not** in `requirements.txt` (keeps
the HF Space image lean). The CRISPR engine serves real paying customers,
so this suite locks the properties that protect them.
## Run
```bash
pip install pytest # one-time, dev machine only
pytest -q # from the repo root (hf-space/)
```
`conftest.py` puts the repo root on `sys.path`, so no install/packaging
step is needed.
## What's covered
| File | Locks down |
|------|-----------|
| `test_crispr.py` | guide coordinates round-trip on **both strands**; CFD vs Doench 2016 matrix; on-target/KO/indel/base-editor ranges; Cas12a TTTV PAM rules; hostile input (HTML/protein/N) fails safe; CSV/XLSX width + `;`-locale safety |
| `test_cloning.py` | **highest-consequence** — cloning-oligo overhangs match the published Zhang (Cas9) / Zetsche (Cas12a) conventions exactly; a wrong base here fails a customer's cloning |
| `test_offtarget.py`| genome off-target search via an **injected in-memory index** (no network); index builder against a temp FASTA; readiness/status logic |
| `test_exon.py` | CDS alignment, exon mapping, and NMD-zone rule against a **hand-built `GeneStructure`** (no Ensembl calls) |
All tests are pure/stdlib and offline — no NCBI/Ensembl/AlphaFold network
calls. Network paths in `offtarget.py` / `exon.py` are exercised only via
their pure helpers and injected fixtures.
## Known follow-ups (surfaced by this suite, tracked separately)
- **Self-off-target is O(k²)** in the number of PAM sites in the input.
A multi-hundred-kb paste can tie up the worker. The server caps input at
1 Mbp but does not cap the candidate count. Consider a candidate cap or
skipping self-off-target above a size threshold.
## Fixed while writing these tests
- `crispr.py` KO cut-position: a copy-paste artifact made both branches of
a ternary identical (`cut_position = pos - 3` for every Cas9 guide,
strand-blind). Now strand-aware and consistent with the exon-annotation
cut convention. Display-only (KO efficacy isn't part of the composite
ranking), so no guide ordering changed.