Implement PostgreSQL production store path
All checks were successful
Build and Publish Container Image / build-and-push (push) Successful in 41s
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:
parent
2063470ac8
commit
749461b97b
30 changed files with 2364 additions and 71 deletions
|
|
@ -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"}}
|
||||
)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue