fix: tests and flash layout

This commit is contained in:
carla 2026-02-18 12:53:25 +01:00
parent a25263b721
commit 002d723d0e
6 changed files with 85 additions and 15 deletions

View file

@ -33,7 +33,44 @@
</script> </script>
</head> </head>
<body> <body>
<.flash_group flash={@flash} /> <div
id="flash-group-root"
aria-live="polite"
class="z-50 flex flex-col gap-2 toast toast-top toast-end"
>
<.flash id="flash-success-root" kind={:success} flash={@flash} />
<.flash id="flash-warning-root" kind={:warning} flash={@flash} />
<.flash id="flash-info-root" kind={:info} flash={@flash} />
<.flash id="flash-error-root" kind={:error} flash={@flash} />
<.flash
id="client-error-root"
kind={:error}
title={gettext("We can't find the internet")}
phx-disconnected={
show(".phx-client-error #client-error-root") |> JS.remove_attribute("hidden")
}
phx-connected={hide("#client-error-root") |> JS.set_attribute({"hidden", ""})}
hidden
>
{gettext("Attempting to reconnect")}
<.icon name="hero-arrow-path" class="ml-1 size-3 motion-safe:animate-spin" />
</.flash>
<.flash
id="server-error-root"
kind={:error}
title={gettext("Something went wrong!")}
phx-disconnected={
show(".phx-server-error #server-error-root") |> JS.remove_attribute("hidden")
}
phx-connected={hide("#server-error-root") |> JS.set_attribute({"hidden", ""})}
hidden
>
{gettext("Attempting to reconnect")}
<.icon name="hero-arrow-path" class="ml-1 size-3 motion-safe:animate-spin" />
</.flash>
</div>
{@inner_content} {@inner_content}
</body> </body>
</html> </html>

View file

@ -88,7 +88,10 @@ defmodule MvWeb.AuthController do
Logger.warning("OIDC authentication server unreachable", safe_assent_meta(err)) Logger.warning("OIDC authentication server unreachable", safe_assent_meta(err))
conn conn
|> put_flash(:error, gettext("The authentication server is currently unavailable. Please try again later.")) |> put_flash(
:error,
gettext("The authentication server is currently unavailable. Please try again later.")
)
|> redirect(to: ~p"/sign-in") |> redirect(to: ~p"/sign-in")
end end
@ -98,7 +101,10 @@ defmodule MvWeb.AuthController do
Logger.warning("OIDC authentication invalid response", safe_assent_meta(err)) Logger.warning("OIDC authentication invalid response", safe_assent_meta(err))
conn conn
|> put_flash(:error, gettext("Authentication configuration error. Please contact the administrator.")) |> put_flash(
:error,
gettext("Authentication configuration error. Please contact the administrator.")
)
|> redirect(to: ~p"/sign-in") |> redirect(to: ~p"/sign-in")
end end
@ -224,10 +230,11 @@ defmodule MvWeb.AuthController do
|> Enum.filter(fn {_key, value} -> not is_nil(value) end) |> Enum.filter(fn {_key, value} -> not is_nil(value) end)
end end
defp safe_assent_meta(%{response: %{status_code: status_code}} = err) do # Handle InvalidResponseError which has :response field (HTTPResponse struct)
defp safe_assent_meta(%{response: %{status: status} = response} = err) do
[ [
status_code: status_code, status: status,
http_adapter: Map.get(err, :http_adapter) http_adapter: Map.get(response, :http_adapter) || Map.get(err, :http_adapter)
] ]
|> Enum.filter(fn {_key, value} -> not is_nil(value) end) |> Enum.filter(fn {_key, value} -> not is_nil(value) end)
end end

View file

@ -27,6 +27,7 @@ msgid "Are you sure?"
msgstr "Bist du sicher?" msgstr "Bist du sicher?"
#: lib/mv_web/components/layouts.ex #: lib/mv_web/components/layouts.ex
#: lib/mv_web/components/layouts/root.html.heex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Attempting to reconnect" msgid "Attempting to reconnect"
msgstr "Verbindung wird wiederhergestellt" msgstr "Verbindung wird wiederhergestellt"
@ -115,11 +116,13 @@ msgid "Show"
msgstr "Anzeigen" msgstr "Anzeigen"
#: lib/mv_web/components/layouts.ex #: lib/mv_web/components/layouts.ex
#: lib/mv_web/components/layouts/root.html.heex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Something went wrong!" msgid "Something went wrong!"
msgstr "Etwas ist schiefgelaufen!" msgstr "Etwas ist schiefgelaufen!"
#: lib/mv_web/components/layouts.ex #: lib/mv_web/components/layouts.ex
#: lib/mv_web/components/layouts/root.html.heex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "We can't find the internet" msgid "We can't find the internet"
msgstr "Keine Internetverbindung gefunden" msgstr "Keine Internetverbindung gefunden"

View file

@ -28,6 +28,7 @@ msgid "Are you sure?"
msgstr "" msgstr ""
#: lib/mv_web/components/layouts.ex #: lib/mv_web/components/layouts.ex
#: lib/mv_web/components/layouts/root.html.heex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Attempting to reconnect" msgid "Attempting to reconnect"
msgstr "" msgstr ""
@ -116,11 +117,13 @@ msgid "Show"
msgstr "" msgstr ""
#: lib/mv_web/components/layouts.ex #: lib/mv_web/components/layouts.ex
#: lib/mv_web/components/layouts/root.html.heex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Something went wrong!" msgid "Something went wrong!"
msgstr "" msgstr ""
#: lib/mv_web/components/layouts.ex #: lib/mv_web/components/layouts.ex
#: lib/mv_web/components/layouts/root.html.heex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "We can't find the internet" msgid "We can't find the internet"
msgstr "" msgstr ""

View file

@ -28,6 +28,7 @@ msgid "Are you sure?"
msgstr "" msgstr ""
#: lib/mv_web/components/layouts.ex #: lib/mv_web/components/layouts.ex
#: lib/mv_web/components/layouts/root.html.heex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Attempting to reconnect" msgid "Attempting to reconnect"
msgstr "" msgstr ""
@ -116,11 +117,13 @@ msgid "Show"
msgstr "" msgstr ""
#: lib/mv_web/components/layouts.ex #: lib/mv_web/components/layouts.ex
#: lib/mv_web/components/layouts/root.html.heex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Something went wrong!" msgid "Something went wrong!"
msgstr "" msgstr ""
#: lib/mv_web/components/layouts.ex #: lib/mv_web/components/layouts.ex
#: lib/mv_web/components/layouts/root.html.heex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "We can't find the internet" msgid "We can't find the internet"
msgstr "" msgstr ""

View file

@ -6,7 +6,10 @@ defmodule MvWeb.AuthControllerTest do
# Helper to create an unauthenticated conn (preserves sandbox metadata) # Helper to create an unauthenticated conn (preserves sandbox metadata)
defp build_unauthenticated_conn(authenticated_conn) do defp build_unauthenticated_conn(authenticated_conn) do
# Create new conn but preserve sandbox metadata for database access # Create new conn but preserve sandbox metadata for database access
new_conn = build_conn() new_conn =
build_conn()
|> init_test_session(%{})
|> fetch_flash()
# Copy sandbox metadata from authenticated conn # Copy sandbox metadata from authenticated conn
if authenticated_conn.private[:ecto_sandbox] do if authenticated_conn.private[:ecto_sandbox] do
@ -255,29 +258,41 @@ defmodule MvWeb.AuthControllerTest do
conn: authenticated_conn conn: authenticated_conn
} do } do
conn = build_unauthenticated_conn(authenticated_conn) conn = build_unauthenticated_conn(authenticated_conn)
# Create a mock Assent.ServerUnreachableError struct # Create a mock Assent.ServerUnreachableError struct with required fields
error = %Assent.ServerUnreachableError{request_url: "https://auth.example.com/callback?token=secret123"} error = %Assent.ServerUnreachableError{
http_adapter: Assent.HTTPAdapter.Finch,
request_url: "https://auth.example.com/callback?token=secret123",
reason: %Mint.TransportError{reason: :econnrefused}
}
conn = MvWeb.AuthController.failure(conn, {:rauthy, :callback}, error) conn = MvWeb.AuthController.failure(conn, {:rauthy, :callback}, error)
assert redirected_to(conn) == ~p"/sign-in" assert redirected_to(conn) == ~p"/sign-in"
assert get_flash(conn, :error) == "The authentication server is currently unavailable. Please try again later."
assert get_flash(conn, :error) ==
"The authentication server is currently unavailable. Please try again later."
end end
test "Assent.InvalidResponseError redirects to sign-in with error flash", %{ test "Assent.InvalidResponseError redirects to sign-in with error flash", %{
conn: authenticated_conn conn: authenticated_conn
} do } do
conn = build_unauthenticated_conn(authenticated_conn) conn = build_unauthenticated_conn(authenticated_conn)
# Create a mock Assent.InvalidResponseError struct # Create a mock Assent.InvalidResponseError struct with required field
# InvalidResponseError only has :response field (HTTPResponse struct)
error = %Assent.InvalidResponseError{ error = %Assent.InvalidResponseError{
response: %{status_code: 400, body: "invalid_request"}, response: %Assent.HTTPAdapter.HTTPResponse{
request_url: "https://auth.example.com/callback" status: 400,
headers: [],
body: "invalid_request"
}
} }
conn = MvWeb.AuthController.failure(conn, {:rauthy, :callback}, error) conn = MvWeb.AuthController.failure(conn, {:rauthy, :callback}, error)
assert redirected_to(conn) == ~p"/sign-in" assert redirected_to(conn) == ~p"/sign-in"
assert get_flash(conn, :error) == "Authentication configuration error. Please contact the administrator."
assert get_flash(conn, :error) ==
"Authentication configuration error. Please contact the administrator."
end end
test "unknown reason triggers catch-all and redirects to sign-in with error flash", %{ test "unknown reason triggers catch-all and redirects to sign-in with error flash", %{
@ -289,7 +304,9 @@ defmodule MvWeb.AuthControllerTest do
conn = MvWeb.AuthController.failure(conn, {:rauthy, :callback}, unknown_reason) conn = MvWeb.AuthController.failure(conn, {:rauthy, :callback}, unknown_reason)
assert redirected_to(conn) == ~p"/sign-in" assert redirected_to(conn) == ~p"/sign-in"
assert get_flash(conn, :error) == "Unable to authenticate with OIDC. Please try again."
assert get_flash(conn, :error) ==
"Unable to authenticate with OIDC. Please try again."
end end
end end
end end