3.1 KiB
ADDED Requirements
Requirement: SurrealDB v3 image policy
The @suaveplan/testing-integration-surrealdb plugin SHALL pin to surrealdb/surrealdb:v3.0.4 (name + minor version). A follow-up operational change tracked at docs/superpowers/specs/2026-04-25-test-suite-audit.md §5 will pin to sha256:<digest>; that pinning is out of scope for this change.
Scenario: Image tag pinned
- WHEN the fixture's container factory is invoked without injection
- THEN the resulting
GenericContaineris constructed with imagesurrealdb/surrealdb:v3.0.4
Requirement: Env-bridge contract
The plugin SHALL declare and forward the following environment variables: SURREALDB_URL, SURREALDB_USERNAME, SURREALDB_PASSWORD. When all three are set on the parent process at construction time, the fixture MUST enter env-bridge passthrough mode and skip container start.
Scenario: env() returns the full set
- WHEN the fixture has started in container mode
- THEN
fixture.env()returns a record whose keys are exactlySURREALDB_URL,SURREALDB_USERNAME,SURREALDB_PASSWORD
Scenario: Env-bridge passthrough
- WHEN all three env vars are set on
process.envat construction - THEN
start()does not invoke the container factory ANDstop()is a no-op
Requirement: Healthcheck contract
isHealthy() SHALL issue an HTTP GET /health request to the SurrealDB endpoint. A 2xx response means healthy. Connection errors AND non-2xx responses MUST resolve to false, never throw.
Scenario: 2xx is healthy
- WHEN
/healthreturns 200 - THEN
isHealthy()resolvestrue
Scenario: Connection refused does not throw
- WHEN the endpoint refuses the connection
- THEN
isHealthy()resolvesfalseand does not throw
Requirement: Random password per run
In container mode the fixture SHALL generate a fresh random password per start() call. The password MUST be at least 32 bytes of entropy, rendered as URL-safe base64 or hex.
Scenario: Two independent fixtures generate different passwords
- WHEN two fixtures start in the same process
- THEN their
config.passwordvalues differ
Requirement: Injectable factories
The fixture constructor SHALL accept optional containerFactory and fetch parameters. The defaults invoke testcontainers and the global fetch. Test-of-test code MAY substitute these to drive deterministic behaviour.
Scenario: Injected fetch drives health probe
- WHEN
fetchis replaced with a stub that always returns a 503 - THEN
isHealthy()resolvesfalse
Requirement: Error-code prefix
Errors thrown from the plugin SHALL carry codes matching ^INTEGRATION\.SURREALDB\.[A-Z_]+$ (e.g. INTEGRATION.SURREALDB.START_FAILED, INTEGRATION.SURREALDB.STOP_FAILED). Cross-cutting codes (INTEGRATION.HEALTH_TIMEOUT, INTEGRATION.ABORTED) are inherited from @suaveplan/testing-integration.
Scenario: Coded error on start failure
- WHEN the container fails to bind a port
- THEN
start()rejects with a structured error whosecode === "INTEGRATION.SURREALDB.START_FAILED"