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