Files
vitor-aignosi 4ee672a715 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>
2026-10-29 17:31:15 -03:00

1.9 KiB

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).
  • Python dev dependencies: pip install -r requirements.txt -r requirements-dev.txt

Run locally

source ./venv/bin/activate
pytest e2e/ -o testpaths=e2e -m integration

One topic, or stop on first failure:

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)

COVERAGE_FILE=.coverage.e2e pytest e2e/ -o testpaths=e2e -m integration --cov=ingestor --cov-branch

Scenario catalog

See scenarios.md for the numbered scenarios and which test implements each one.