fix existing flakiness + cut runtime closes #533 #544
1 changed files with 37 additions and 0 deletions
37
test/mv/repo/deferrable_fk_test.exs
Normal file
37
test/mv/repo/deferrable_fk_test.exs
Normal 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
|
||||||
Loading…
Add table
Add a link
Reference in a new issue