feat: Run Backend Suites Against Real Testcontainers Engines - #15
Merged
Conversation
Boot a pinned postgres:16-alpine container for the ActivityStore contract. Share one engine per file, TRUNCATE between cases, and assert unique-handle inserts wait on the first session's lock.
ThomasHartDev
force-pushed
the
thomas/feat/testcontainers
branch
from
September 4, 2026 20:34
c48950c to
4997fae
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The Postgres contract was running on PGlite. That covers SQL shape. It does not cover a lock manager, two sessions, or the real planner. This boots a pinned postgres:16-alpine container through Testcontainers, waits until pg_isready and the mapped port accept connections, and runs the same ActivityStore contract over a pg Pool.
One engine per file, TRUNCATE CASCADE between cases. Two containers get different host ports and separate catalogs. A concurrent unique-handle insert waits on the unique index (Lock wait_event) until the first transaction commits, then fails with 23505. Memory stays in-process. Later backends register a pinned image on CONTAINER_BACKENDS and reuse start / reset / stop.
Closes #14.