defmodule MvWeb.JoinLiveEmailFailureTest do @moduledoc """ When join confirmation email delivery fails, the user sees an error message and no success copy. Uses FailingMailAdapter; async: false to avoid config races. Ensures SMTP is not configured (ENV cleared, Settings smtp_host nil) so that Mailer.smtp_config/0 returns [] and the Application-configured FailingMailAdapter is used. """ use MvWeb.ConnCase, async: false import Phoenix.LiveViewTest alias Mv.Membership @tag role: :unauthenticated test "when confirmation email fails, user sees error flash and no success message", %{ conn: conn } do # Clear SMTP config so Mailer.smtp_config() returns [] and FailingMailAdapter is used. saved_env = clear_smtp_env_and_save() enable_join_form_for_test() saved_mailer = Application.get_env(:mv, Mv.Mailer) Application.put_env( :mv, Mv.Mailer, Keyword.put(saved_mailer || [], :adapter, Mv.TestSupport.FailingMailAdapter) ) on_exit(fn -> Application.put_env(:mv, Mv.Mailer, saved_mailer) restore_smtp_env(saved_env) end) {:ok, view, _html} = live(conn, "/join") # Use the HTML returned by render_submit (updated DOM including flash) html = view |> form("#join-form", %{ "email" => "fail#{System.unique_integer([:positive])}@example.com", "first_name" => "Jane", "last_name" => "Doe", "website" => "" }) |> render_submit() # Error message is translated; accept English or German wording assert html =~ "could not send" or html =~ "confirmation email" or html =~ "konnte nicht" or html =~ "Bestätigungs-E-Mail" refute view |> element("[data-testid='join-success-message']") |> has_element?() end defp clear_smtp_env_and_save do keys = [ "SMTP_HOST", "SMTP_PORT", "SMTP_USERNAME", "SMTP_PASSWORD", "SMTP_PASSWORD_FILE", "SMTP_SSL" ] saved = for k <- keys, into: %{}, do: {k, System.get_env(k)} for k <- keys, do: System.delete_env(k) saved end defp restore_smtp_env(saved) do for {k, v} <- saved do if v != nil, do: System.put_env(k, v), else: System.delete_env(k) end end defp enable_join_form_for_test do {:ok, settings} = Membership.get_settings() Membership.update_settings(settings, %{ join_form_enabled: true, join_form_field_ids: ["email", "first_name", "last_name"], join_form_field_required: %{"email" => true, "first_name" => false, "last_name" => false}, # Clear SMTP host so Mv.Config.smtp_configured?() is false and Mailer.smtp_config() returns []. smtp_host: nil }) end end