From 4ee3a6fd2d10dd1192d56fae426dd74baf759e46 Mon Sep 17 00:00:00 2001 From: Chris McCord Date: Mon, 5 May 2025 11:00:46 -0400 Subject: [PATCH 1/3] Add conn to exceptions --- lib/phoenix_ecto/check_repo_status.ex | 9 +++++---- lib/phoenix_ecto/exceptions.ex | 6 +++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/phoenix_ecto/check_repo_status.ex b/lib/phoenix_ecto/check_repo_status.ex index 8b84fb7..398326e 100644 --- a/lib/phoenix_ecto/check_repo_status.ex +++ b/lib/phoenix_ecto/check_repo_status.ex @@ -30,13 +30,13 @@ defmodule Phoenix.Ecto.CheckRepoStatus do repos = Application.get_env(opts[:otp_app], :ecto_repos, []) for repo <- repos, Process.whereis(repo) do - check_pending_migrations!(repo, opts) || check_storage_up!(repo) + check_pending_migrations!(conn, repo, opts) || check_storage_up!(conn, repo) end conn end - defp check_storage_up!(repo) do + defp check_storage_up!(conn, repo) do try do adapter = repo.__adapter__() @@ -46,12 +46,12 @@ defmodule Phoenix.Ecto.CheckRepoStatus do rescue _ -> true else - :down -> raise Phoenix.Ecto.StorageNotCreatedError, repo: repo + :down -> raise Phoenix.Ecto.StorageNotCreatedError, repo: repo, conn: conn _ -> true end end - defp check_pending_migrations!(repo, opts) do + defp check_pending_migrations!(conn, repo, opts) do dirs = migration_directories(repo, opts) migrations_fun = @@ -73,6 +73,7 @@ defmodule Phoenix.Ecto.CheckRepoStatus do else true -> raise Phoenix.Ecto.PendingMigrationError, + conn: conn, repo: repo, directories: dirs, migration_opts: migration_opts diff --git a/lib/phoenix_ecto/exceptions.ex b/lib/phoenix_ecto/exceptions.ex index 1284c6f..701edab 100644 --- a/lib/phoenix_ecto/exceptions.ex +++ b/lib/phoenix_ecto/exceptions.ex @@ -1,5 +1,5 @@ defmodule Phoenix.Ecto.StorageNotCreatedError do - defexception [:repo] + defexception [:repo, :conn] def message(%__MODULE__{repo: repo}) do "the storage is not created for repo: #{inspect(repo)}. " <> @@ -8,8 +8,8 @@ defmodule Phoenix.Ecto.StorageNotCreatedError do end defmodule Phoenix.Ecto.PendingMigrationError do - @enforce_keys [:repo, :directories, :migration_opts] - defexception [:repo, :directories, :migration_opts] + @enforce_keys [:repo, :conn, :directories, :migration_opts] + defexception [:repo, :conn, :directories, :migration_opts] def message(%__MODULE__{repo: repo}) do "there are pending migrations for repo: #{inspect(repo)}. " <> From 056f97bbe734b4657f7d9e36987a05a3197f1faa Mon Sep 17 00:00:00 2001 From: Chris McCord Date: Mon, 5 May 2025 11:13:45 -0400 Subject: [PATCH 2/3] wrapper --- lib/phoenix_ecto/check_repo_status.ex | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/lib/phoenix_ecto/check_repo_status.ex b/lib/phoenix_ecto/check_repo_status.ex index 398326e..b3bf797 100644 --- a/lib/phoenix_ecto/check_repo_status.ex +++ b/lib/phoenix_ecto/check_repo_status.ex @@ -27,13 +27,18 @@ defmodule Phoenix.Ecto.CheckRepoStatus do end def call(%Conn{} = conn, opts) do - repos = Application.get_env(opts[:otp_app], :ecto_repos, []) + try do + repos = Application.get_env(opts[:otp_app], :ecto_repos, []) - for repo <- repos, Process.whereis(repo) do - check_pending_migrations!(conn, repo, opts) || check_storage_up!(conn, repo) - end + for repo <- repos, Process.whereis(repo) do + check_pending_migrations!(conn, repo, opts) || check_storage_up!(conn, repo) + end - conn + conn + rescue + err in [Phoenix.Ecto.StorageNotCreatedError, Phoenix.Ecto.PendingMigrationError] -> + Plug.Conn.WrapperError.reraise(conn, :error, err, __STACKTRACE__) + end end defp check_storage_up!(conn, repo) do From 774a48cb74f482620fd63104a30d36f1a773069c Mon Sep 17 00:00:00 2001 From: Chris McCord Date: Mon, 5 May 2025 11:24:31 -0400 Subject: [PATCH 3/3] Fixup --- lib/phoenix_ecto/check_repo_status.ex | 9 ++++---- lib/phoenix_ecto/exceptions.ex | 6 ++--- test/phoenix_ecto/check_repo_status_test.exs | 24 +++++++++++++------- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/lib/phoenix_ecto/check_repo_status.ex b/lib/phoenix_ecto/check_repo_status.ex index b3bf797..66e00f5 100644 --- a/lib/phoenix_ecto/check_repo_status.ex +++ b/lib/phoenix_ecto/check_repo_status.ex @@ -31,7 +31,7 @@ defmodule Phoenix.Ecto.CheckRepoStatus do repos = Application.get_env(opts[:otp_app], :ecto_repos, []) for repo <- repos, Process.whereis(repo) do - check_pending_migrations!(conn, repo, opts) || check_storage_up!(conn, repo) + check_pending_migrations!(repo, opts) || check_storage_up!(repo) end conn @@ -41,7 +41,7 @@ defmodule Phoenix.Ecto.CheckRepoStatus do end end - defp check_storage_up!(conn, repo) do + defp check_storage_up!(repo) do try do adapter = repo.__adapter__() @@ -51,12 +51,12 @@ defmodule Phoenix.Ecto.CheckRepoStatus do rescue _ -> true else - :down -> raise Phoenix.Ecto.StorageNotCreatedError, repo: repo, conn: conn + :down -> raise Phoenix.Ecto.StorageNotCreatedError, repo: repo _ -> true end end - defp check_pending_migrations!(conn, repo, opts) do + defp check_pending_migrations!(repo, opts) do dirs = migration_directories(repo, opts) migrations_fun = @@ -78,7 +78,6 @@ defmodule Phoenix.Ecto.CheckRepoStatus do else true -> raise Phoenix.Ecto.PendingMigrationError, - conn: conn, repo: repo, directories: dirs, migration_opts: migration_opts diff --git a/lib/phoenix_ecto/exceptions.ex b/lib/phoenix_ecto/exceptions.ex index 701edab..1284c6f 100644 --- a/lib/phoenix_ecto/exceptions.ex +++ b/lib/phoenix_ecto/exceptions.ex @@ -1,5 +1,5 @@ defmodule Phoenix.Ecto.StorageNotCreatedError do - defexception [:repo, :conn] + defexception [:repo] def message(%__MODULE__{repo: repo}) do "the storage is not created for repo: #{inspect(repo)}. " <> @@ -8,8 +8,8 @@ defmodule Phoenix.Ecto.StorageNotCreatedError do end defmodule Phoenix.Ecto.PendingMigrationError do - @enforce_keys [:repo, :conn, :directories, :migration_opts] - defexception [:repo, :conn, :directories, :migration_opts] + @enforce_keys [:repo, :directories, :migration_opts] + defexception [:repo, :directories, :migration_opts] def message(%__MODULE__{repo: repo}) do "there are pending migrations for repo: #{inspect(repo)}. " <> diff --git a/test/phoenix_ecto/check_repo_status_test.exs b/test/phoenix_ecto/check_repo_status_test.exs index e6bd2dc..9030de2 100644 --- a/test/phoenix_ecto/check_repo_status_test.exs +++ b/test/phoenix_ecto/check_repo_status_test.exs @@ -4,6 +4,14 @@ defmodule Phoenix.Ecto.CheckRepoStatusTest do alias Phoenix.Ecto.CheckRepoStatus + defmacro assert_wrapped(kind, func) do + quote do + wrapper_error = assert_raise(Plug.Conn.WrapperError, unquote(func)) + assert %unquote(kind){} = wrapper_error.reason + wrapper_error.reason + end + end + defmodule LongLivedProcess do def run do Process.sleep(1_000) @@ -62,7 +70,7 @@ defmodule Phoenix.Ecto.CheckRepoStatusTest do conn = conn(:get, "/") - assert_raise(Phoenix.Ecto.StorageNotCreatedError, fn -> + assert_wrapped(Phoenix.Ecto.StorageNotCreatedError, fn -> CheckRepoStatus.call( conn, otp_app: :check_repo_ready, @@ -82,7 +90,7 @@ defmodule Phoenix.Ecto.CheckRepoStatusTest do conn = conn(:get, "/") exception = - assert_raise(Phoenix.Ecto.PendingMigrationError, fn -> + assert_wrapped(Phoenix.Ecto.PendingMigrationError, fn -> CheckRepoStatus.call( conn, otp_app: :check_repo_ready, @@ -104,7 +112,7 @@ defmodule Phoenix.Ecto.CheckRepoStatusTest do conn = conn(:get, "/") exception = - assert_raise(Phoenix.Ecto.PendingMigrationError, fn -> + assert_wrapped(Phoenix.Ecto.PendingMigrationError, fn -> CheckRepoStatus.call( conn, otp_app: :check_repo_ready, @@ -134,7 +142,7 @@ defmodule Phoenix.Ecto.CheckRepoStatusTest do conn = conn(:get, "/") exception = - assert_raise(Phoenix.Ecto.PendingMigrationError, fn -> + assert_wrapped(Phoenix.Ecto.PendingMigrationError, fn -> CheckRepoStatus.call( conn, otp_app: :check_repo_ready, @@ -159,7 +167,7 @@ defmodule Phoenix.Ecto.CheckRepoStatusTest do mock_migrations_fn = fn _repo, ["foo"], _opts -> [{:down, 1, "migration"}] end exception = - assert_raise(Phoenix.Ecto.PendingMigrationError, fn -> + assert_wrapped(Phoenix.Ecto.PendingMigrationError, fn -> CheckRepoStatus.call( conn, otp_app: :check_repo_ready, @@ -174,7 +182,7 @@ defmodule Phoenix.Ecto.CheckRepoStatusTest do mock_migrations_fn = fn _repo, ["foo", "bar"], _opts -> [{:down, 1, "migration"}] end exception = - assert_raise(Phoenix.Ecto.PendingMigrationError, fn -> + assert_wrapped(Phoenix.Ecto.PendingMigrationError, fn -> CheckRepoStatus.call( conn, otp_app: :check_repo_ready, @@ -261,7 +269,7 @@ defmodule Phoenix.Ecto.CheckRepoStatusTest do conn = conn(:get, "/") - assert_raise(Phoenix.Ecto.StorageNotCreatedError, fn -> + assert_wrapped(Phoenix.Ecto.StorageNotCreatedError, fn -> CheckRepoStatus.call( conn, otp_app: :check_repo_ready, @@ -287,7 +295,7 @@ defmodule Phoenix.Ecto.CheckRepoStatusTest do conn = conn(:get, "/") exception = - assert_raise(Phoenix.Ecto.PendingMigrationError, fn -> + assert_wrapped(Phoenix.Ecto.PendingMigrationError, fn -> CheckRepoStatus.call( conn, otp_app: :check_repo_ready,