diff --git a/test/mv/repo/deferrable_fk_test.exs b/test/mv/repo/deferrable_fk_test.exs new file mode 100644 index 0000000..4127082 --- /dev/null +++ b/test/mv/repo/deferrable_fk_test.exs @@ -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