defmodule ToweropsWeb.UserSettingsControllerTest do @moduledoc """ Tests for UserSettingsController. Most user settings functionality is now in UserSettingsLive. This controller only handles email confirmation via token. """ use ToweropsWeb.ConnCase, async: true import Towerops.AccountsFixtures alias Towerops.Accounts setup :register_and_log_in_user describe "GET /users/settings/confirm-email/:token" do setup %{user: user} do email = unique_user_email() token = extract_user_token(fn url -> Accounts.deliver_user_update_email_instructions(%{user | email: email}, user.email, url) end) %{token: token, email: email} end test "updates the user email once", %{conn: conn, user: user, token: token, email: email} do conn = get(conn, ~p"/users/settings/confirm-email/#{token}") assert redirected_to(conn) == ~p"/users/settings" assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "Email changed successfully" refute Accounts.get_user_by_email(user.email) assert Accounts.get_user_by_email(email) conn = get(conn, ~p"/users/settings/confirm-email/#{token}") assert redirected_to(conn) == ~p"/users/settings" assert Phoenix.Flash.get(conn.assigns.flash, :error) =~ "Email change link is invalid or it has expired" end test "does not update email with invalid token", %{conn: conn, user: user} do conn = get(conn, ~p"/users/settings/confirm-email/oops") assert redirected_to(conn) == ~p"/users/settings" assert Phoenix.Flash.get(conn.assigns.flash, :error) =~ "Email change link is invalid or it has expired" assert Accounts.get_user_by_email(user.email) end test "redirects if user is not logged in", %{token: token} do conn = build_conn() conn = get(conn, ~p"/users/settings/confirm-email/#{token}") assert redirected_to(conn) == ~p"/users/log-in" end end end