diff --git a/lib/who_need_help_web/controllers/health_controller.ex b/lib/who_need_help_web/controllers/health_controller.ex index 8b29219..0ecd8f1 100644 --- a/lib/who_need_help_web/controllers/health_controller.ex +++ b/lib/who_need_help_web/controllers/health_controller.ex @@ -7,10 +7,24 @@ defmodule WhoNeedHelpWeb.HealthController do if WhoNeedHelpWeb.DrainState.draining?() do conn |> put_status(:service_unavailable) |> json(%{status: "draining"}) else - case Ecto.Adapters.SQL.query(WhoNeedHelp.Repo, "SELECT 1", []) do - {:ok, _} -> json(conn, %{status: "ready"}) - {:error, _} -> conn |> put_status(:service_unavailable) |> json(%{status: "not_ready"}) + database_ready? = + match?({:ok, _}, Ecto.Adapters.SQL.query(WhoNeedHelp.Repo, "SELECT 1", [])) + + if ready?( + Application.fetch_env!(:who_need_help, :app_role), + database_ready?, + Oban.whereis(Oban) + ) do + json(conn, %{status: "ready"}) + else + conn |> put_status(:service_unavailable) |> json(%{status: "not_ready"}) end end end + + @doc false + def ready?(:combined, database_ready?, oban_pid), + do: database_ready? and is_pid(oban_pid) + + def ready?(_role, database_ready?, _oban_pid), do: database_ready? end diff --git a/test/who_need_help_web/controllers/page_controller_test.exs b/test/who_need_help_web/controllers/page_controller_test.exs index 0aeb391..d18042c 100644 --- a/test/who_need_help_web/controllers/page_controller_test.exs +++ b/test/who_need_help_web/controllers/page_controller_test.exs @@ -165,6 +165,15 @@ defmodule WhoNeedHelpWeb.PageControllerTest do |> json_response(200) end + test "combined readiness also requires its in-process Oban worker" do + assert WhoNeedHelpWeb.HealthController.ready?(:combined, true, self()) + refute WhoNeedHelpWeb.HealthController.ready?(:combined, true, nil) + refute WhoNeedHelpWeb.HealthController.ready?(:combined, false, self()) + + assert WhoNeedHelpWeb.HealthController.ready?(:web, true, nil) + refute WhoNeedHelpWeb.HealthController.ready?(:web, false, self()) + end + test "GET /safety selects Ukrainian locale and keeps it in the session", %{conn: conn} do conn = get(conn, ~p"/safety?locale=uk") assert html_response(conn, 200) =~ "Правила безпеки"