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,))