test(repo): assert member/user foreign keys are deferrable

This commit is contained in:
Moritz 2026-06-16 17:53:25 +02:00
parent ef94d2ef10
commit 5e84c342b7

View file

@ -0,0 +1,37 @@
defmodule Mv.DeferrableFkTest do
@moduledoc """
Regression guard for the deferrable-FK migration.
Asserts the schema property directly (`condeferred = true`) for the three
members/users foreign keys. A multi-connection deadlock reproduction cannot
be made deterministic under the Ecto sandbox (ownership serializes
connections), so the structural assertion is the guard here; see the
migration moduledoc for the full FOR-KEY-SHARE/MultiXact deadlock rationale.
"""
use Mv.DataCase, async: true
@deferrable_fks ~w(
users_member_id_fkey
users_role_id_fkey
members_membership_fee_type_id_fkey
)
test "member/user foreign keys are DEFERRABLE INITIALLY DEFERRED" do
query = """
SELECT conname, condeferrable, condeferred
FROM pg_constraint
WHERE conname = ANY($1)
"""
{:ok, %{rows: rows}} = Mv.Repo.query(query, [@deferrable_fks])
found = Map.new(rows, fn [name, deferrable, deferred] -> {name, {deferrable, deferred}} end)
for fk <- @deferrable_fks do
assert Map.has_key?(found, fk), "expected foreign key #{fk} to exist"
assert found[fk] == {true, true},
"expected #{fk} to be DEFERRABLE INITIALLY DEFERRED, got #{inspect(found[fk])}"
end
end
end