0ee948b34d
Also updates test_migrate_from_empty_applies_0001 → test_migrate_from_empty_applies_all to assert both migrations apply on a fresh DB (mechanical consequence of adding 0002). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
66 lines
2.6 KiB
Python
66 lines
2.6 KiB
Python
import psycopg
|
|
import pytest
|
|
|
|
from app.platform import db
|
|
|
|
_TABLES = {"account", "auth_code", "storefront", "storefront_membership"}
|
|
|
|
|
|
def _table_names(conn) -> set[str]:
|
|
rows = conn.execute(
|
|
"SELECT tablename FROM pg_tables WHERE schemaname = 'public'"
|
|
).fetchall()
|
|
return {r[0] for r in rows}
|
|
|
|
|
|
def test_migrate_from_empty_applies_all(fresh_db_url):
|
|
with psycopg.connect(fresh_db_url) as conn:
|
|
applied = db.migrate(conn)
|
|
assert applied == ["0001_init.sql", "0002_products.sql"]
|
|
with psycopg.connect(fresh_db_url) as conn:
|
|
assert _TABLES.issubset(_table_names(conn))
|
|
|
|
|
|
def test_migrate_is_idempotent(fresh_db_url):
|
|
with psycopg.connect(fresh_db_url) as conn:
|
|
db.migrate(conn)
|
|
with psycopg.connect(fresh_db_url) as conn:
|
|
applied_again = db.migrate(conn)
|
|
assert applied_again == []
|
|
|
|
|
|
def test_membership_has_no_unique_account_constraint(fresh_db_url):
|
|
# INV-4: the schema must keep many-storefronts-per-account open — no UNIQUE on
|
|
# storefront_membership.account_id anywhere.
|
|
with psycopg.connect(fresh_db_url) as conn:
|
|
db.migrate(conn)
|
|
rows = conn.execute(
|
|
"""
|
|
SELECT indexdef FROM pg_indexes
|
|
WHERE schemaname = 'public' AND tablename = 'storefront_membership'
|
|
"""
|
|
).fetchall()
|
|
defs = " ".join(r[0] for r in rows).lower()
|
|
assert "unique" not in defs.replace("primary key", "") or "(account_id)" not in defs
|
|
|
|
|
|
def test_0002_products_tables_exist(fresh_db_url):
|
|
with psycopg.connect(fresh_db_url) as conn:
|
|
db.migrate(conn)
|
|
for table in ("product", "variant", "product_image", "import_draft", "import_run", "import_run_error"):
|
|
assert conn.execute("SELECT to_regclass(%s)", (f"public.{table}",)).fetchone()[0] == table
|
|
|
|
|
|
def test_0002_variant_option_combo_unique_treats_nulls_as_equal(fresh_db_url):
|
|
# INV-13: the no-option product's single variant has NULL option values; a second
|
|
# all-NULL combo must collide (NULLS NOT DISTINCT).
|
|
with psycopg.connect(fresh_db_url) as conn:
|
|
db.migrate(conn)
|
|
sf = conn.execute("INSERT INTO storefront (name) VALUES ('s') RETURNING id").fetchone()[0]
|
|
pid = conn.execute(
|
|
"INSERT INTO product (storefront_id, handle, title) VALUES (%s,'h','T') RETURNING id", (sf,)
|
|
).fetchone()[0]
|
|
conn.execute("INSERT INTO variant (product_id, position) VALUES (%s, 1)", (pid,))
|
|
with pytest.raises(psycopg.errors.UniqueViolation):
|
|
conn.execute("INSERT INTO variant (product_id, position) VALUES (%s, 2)", (pid,))
|