defmodule Mv.ConfigSmtpTest do @moduledoc """ Unit tests for Mv.Config SMTP-related helpers. ENV overrides Settings (same pattern as OIDC/Vereinfacht). Uses real ENV and Settings; no mocking so we test the actual precedence. async: false because we mutate ENV. """ use Mv.DataCase, async: false describe "smtp_host/0" do test "returns ENV value when SMTP_HOST is set" do set_smtp_env("SMTP_HOST", "smtp.example.com") assert Mv.Config.smtp_host() == "smtp.example.com" after clear_smtp_env() end test "returns nil when SMTP_HOST is not set and Settings have no smtp_host" do clear_smtp_env() assert Mv.Config.smtp_host() == nil end end describe "smtp_port/0" do test "returns parsed integer when SMTP_PORT ENV is set" do set_smtp_env("SMTP_PORT", "587") assert Mv.Config.smtp_port() == 587 after clear_smtp_env() end test "returns nil or default when SMTP_PORT is not set" do clear_smtp_env() port = Mv.Config.smtp_port() assert port == nil or (is_integer(port) and port in [25, 465, 587]) end end describe "smtp_configured?/0" do test "returns true when smtp_host is present (from ENV or Settings)" do set_smtp_env("SMTP_HOST", "smtp.example.com") assert Mv.Config.smtp_configured?() == true after clear_smtp_env() end test "returns false when no SMTP host is set" do clear_smtp_env() refute Mv.Config.smtp_configured?() end end describe "smtp_env_configured?/0" do test "returns true when any SMTP ENV variable is set" do set_smtp_env("SMTP_HOST", "smtp.example.com") assert Mv.Config.smtp_env_configured?() == true after clear_smtp_env() end test "returns false when no SMTP ENV variables are set" do clear_smtp_env() refute Mv.Config.smtp_env_configured?() end end describe "smtp_password/0 and SMTP_PASSWORD_FILE" do test "returns value from SMTP_PASSWORD when set" do set_smtp_env("SMTP_PASSWORD", "env-secret") assert Mv.Config.smtp_password() == "env-secret" after clear_smtp_env() end test "returns content of file when SMTP_PASSWORD_FILE is set and SMTP_PASSWORD is not" do clear_smtp_env() path = Path.join(System.tmp_dir!(), "mv_smtp_test_#{System.unique_integer([:positive])}") File.write!(path, "file-secret\n") Process.put(:smtp_password_file_path, path) set_smtp_env("SMTP_PASSWORD_FILE", path) assert Mv.Config.smtp_password() == "file-secret" after clear_smtp_env() if path = Process.get(:smtp_password_file_path), do: File.rm(path) end test "SMTP_PASSWORD overrides SMTP_PASSWORD_FILE when both are set" do path = Path.join(System.tmp_dir!(), "mv_smtp_test_#{System.unique_integer([:positive])}") File.write!(path, "file-secret") Process.put(:smtp_password_file_path, path) set_smtp_env("SMTP_PASSWORD_FILE", path) set_smtp_env("SMTP_PASSWORD", "env-wins") assert Mv.Config.smtp_password() == "env-wins" after clear_smtp_env() if path = Process.get(:smtp_password_file_path), do: File.rm(path) end end describe "smtp_*_env_set?/0" do test "smtp_host_env_set? returns true when SMTP_HOST is set" do set_smtp_env("SMTP_HOST", "x") assert Mv.Config.smtp_host_env_set?() == true after clear_smtp_env() end test "smtp_password_env_set? returns true when SMTP_PASSWORD or SMTP_PASSWORD_FILE is set" do set_smtp_env("SMTP_PASSWORD", "x") assert Mv.Config.smtp_password_env_set?() == true after clear_smtp_env() end end defp set_smtp_env(key, value) do System.put_env(key, value) end defp clear_smtp_env do System.delete_env("SMTP_HOST") System.delete_env("SMTP_PORT") System.delete_env("SMTP_USERNAME") System.delete_env("SMTP_PASSWORD") System.delete_env("SMTP_PASSWORD_FILE") System.delete_env("SMTP_SSL") end end