SIENTIAPDE-2202
SIENTIAPDE-2202 Add gateway end-to-end test suite (e2e/) End-to-end suite at the repo root, following the Laborious/Orchestrator pattern: numbered scenarios per topic in e2e/scenarios.md (1:1 with test_scenario_* functions), scenario inputs as JSON, Postgres DDL mirrored from production, `integration` marker, excluded from the default pytest run. Every dependency runs for real: MongoDB, Redis, PostgreSQL, MinIO and NATS via testcontainers, OPC UA servers in process (asyncua). Pods are built from the environment like ingestor/app.py and driven one loop iteration at a time. 69 scenarios across 7 topics: slot leasing and failover, subscription reads, NATS writes and write_status (incl. the SIENTIAPDE-2202 timestamp/quality matrix, checked on the server and on the wire), gRPC ReadTag, active reads, client certificates/security, pod lifecycle. Replaces tests/functional (legacy slot v1 tests, fully commented out) and tests/functional/test_write_e2e.py (now scenarios 3.1.x). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
48
e2e/README.md
Normal file
48
e2e/README.md
Normal file
@@ -0,0 +1,48 @@
|
||||
# OPC Gateway end-to-end tests
|
||||
|
||||
End-to-end tests run every external dependency for real (MongoDB, Redis, PostgreSQL, MinIO and
|
||||
NATS via testcontainers; OPC UA servers in process with asyncua) and build each gateway pod from
|
||||
the environment exactly like `ingestor/app.py` does.
|
||||
|
||||
## Requirements
|
||||
|
||||
- Docker (for testcontainers), with the reaper disabled once per machine:
|
||||
`echo "ryuk.disabled=true" >> ~/.testcontainers.properties` (see [scenarios.md](scenarios.md)).
|
||||
- Python dev dependencies: `pip install -r requirements.txt -r requirements-dev.txt`
|
||||
|
||||
## Run locally
|
||||
|
||||
```bash
|
||||
source ./venv/bin/activate
|
||||
pytest e2e/ -o testpaths=e2e -m integration
|
||||
```
|
||||
|
||||
One topic, or stop on first failure:
|
||||
|
||||
```bash
|
||||
pytest e2e/test_writes.py -o testpaths=e2e -m integration
|
||||
pytest e2e/ -o testpaths=e2e -m integration -x
|
||||
```
|
||||
|
||||
The default `pytest` run only collects `tests/` (`testpaths`), so the E2E suite never runs there.
|
||||
|
||||
## Layout
|
||||
|
||||
| Path | Content |
|
||||
|---|---|
|
||||
| `conftest.py` | Containers (session), environment + state reset (per test), factories: `opc_servers`, `pods`, `put_slot`, `publish_command`, `client_certificate`, `opc_wire` |
|
||||
| `helpers.py` | `Pod` (one gateway pod, `tick()` = one main loop iteration), `load_scenario_input`, `wait_until`/`stays_false`, Mongo/Postgres/Redis queries, DataValue mask |
|
||||
| `opc_server.py` | In-process OPC UA server (`ns=2;s=<name>` variables, restart, secured mode, received writes) |
|
||||
| `db_schema.sql` | `sientia_data.predictions` DDL, mirrored from production |
|
||||
| `scenario_inputs/` | Slots (v2), connector and write command used by the scenarios |
|
||||
| `test_*.py` | One file per topic, `test_scenario_<topic>_<group>_<n>_*` |
|
||||
|
||||
## Coverage (separate from unit tests)
|
||||
|
||||
```bash
|
||||
COVERAGE_FILE=.coverage.e2e pytest e2e/ -o testpaths=e2e -m integration --cov=ingestor --cov-branch
|
||||
```
|
||||
|
||||
## Scenario catalog
|
||||
|
||||
See [scenarios.md](scenarios.md) for the numbered scenarios and which test implements each one.
|
||||
Reference in New Issue
Block a user