Implement PostgreSQL production store path
All checks were successful
Build and Publish Container Image / build-and-push (push) Successful in 41s

Add the PostgreSQL backend, migration and stopped-write transfer tools, lease-aware deployment manifests, tenancy declarations, and shared conformance coverage. Persist grouping mutations in durable stores and separate process liveness from database readiness.
This commit is contained in:
tegwick 2026-08-19 14:42:01 +02:00
parent 2063470ac8
commit 749461b97b
30 changed files with 2364 additions and 71 deletions

View file

@ -68,7 +68,7 @@ def _patch(client, *, headers=None, metadata=None, **overrides):
def test_get_tenant_returns_record_and_etag(client) -> None:
response = client.get("/tenants/t-1")
response = client.get("/tenants/t-1", params={"actor": "tenant-engine"})
assert response.status_code == 200
assert response.headers["ETag"] == '"1"'
@ -79,13 +79,15 @@ def test_get_tenant_returns_record_and_etag(client) -> None:
def test_get_tenant_resolves_by_identifier(client) -> None:
response = client.get("/tenants/tenant:friendly:binky")
response = client.get(
"/tenants/tenant:friendly:binky", params={"actor": "tenant-engine"}
)
assert response.status_code == 200
assert response.json()["tenant_id"] == "t-1"
def test_get_unknown_tenant_is_404(client) -> None:
assert client.get("/tenants/nope").status_code == 404
assert client.get("/tenants/nope", params={"actor": "tenant-engine"}).status_code == 404
# -- update -------------------------------------------------------------
@ -98,7 +100,8 @@ def test_update_succeeds_and_advances_the_etag(client) -> None:
assert response.headers["ETag"] == '"2"'
assert response.headers["Idempotent-Replay"] == "false"
assert response.json()["display_name"] == "Binky Ltd"
assert client.get("/tenants/t-1").json()["display_name"] == "Binky Ltd"
persisted = client.get("/tenants/t-1", params={"actor": "tenant-engine"})
assert persisted.json()["display_name"] == "Binky Ltd"
def test_update_rejects_unknown_field(client) -> None:
@ -110,7 +113,8 @@ def test_update_rejects_identifier_mutation(client) -> None:
response = _patch(client, metadata={"identifier": "tenant:large:other"})
assert response.status_code == 422
assert client.get("/tenants/t-1").json()["identifier"] == "tenant:friendly:binky"
persisted = client.get("/tenants/t-1", params={"actor": "tenant-engine"})
assert persisted.json()["identifier"] == "tenant:friendly:binky"
def test_update_rejects_empty_metadata(client) -> None:
@ -138,7 +142,7 @@ def test_duplicate_idempotency_key_replays(client) -> None:
assert replay.status_code == 200
assert replay.headers["Idempotent-Replay"] == "true"
assert replay.json() == first.json()
assert client.get("/tenants/t-1").json()["version"] == 2
assert client.get("/tenants/t-1", params={"actor": "tenant-engine"}).json()["version"] == 2
def test_idempotency_key_reused_for_a_different_request_is_409(client) -> None:
@ -290,7 +294,7 @@ def test_update_permission_does_not_imply_retire_permission() -> None:
def test_store_outage_is_a_redacted_503() -> None:
client = TestClient(create_app(store=_BrokenStore(), authorizer=_AllowAllAuthorizer()))
read = client.get("/tenants/t-1")
read = client.get("/tenants/t-1", params={"actor": "tenant-engine"})
write = client.patch(
"/tenants/t-1", headers=HEADERS, json={**BODY, "metadata": {"display_name": "X"}}
)