confirmation_test.exs (3556B)
1 defmodule DailyTrackerWeb.UserLive.ConfirmationTest do 2 use DailyTrackerWeb.ConnCase, async: true 3 4 import Phoenix.LiveViewTest 5 import DailyTracker.AccountsFixtures 6 7 alias DailyTracker.Accounts 8 9 setup do 10 %{unconfirmed_user: unconfirmed_user_fixture(), confirmed_user: user_fixture()} 11 end 12 13 describe "Confirm user" do 14 test "renders confirmation page for unconfirmed user", %{conn: conn, unconfirmed_user: user} do 15 token = 16 extract_user_token(fn url -> 17 Accounts.deliver_login_instructions(user, url) 18 end) 19 20 {:ok, _lv, html} = live(conn, ~p"/users/log-in/#{token}") 21 assert html =~ "Confirm and stay logged in" 22 end 23 24 test "renders login page for confirmed user", %{conn: conn, confirmed_user: user} do 25 token = 26 extract_user_token(fn url -> 27 Accounts.deliver_login_instructions(user, url) 28 end) 29 30 {:ok, _lv, html} = live(conn, ~p"/users/log-in/#{token}") 31 refute html =~ "Confirm my account" 32 assert html =~ "Keep me logged in on this device" 33 end 34 35 test "renders login page for already logged in user", %{conn: conn, confirmed_user: user} do 36 conn = log_in_user(conn, user) 37 38 token = 39 extract_user_token(fn url -> 40 Accounts.deliver_login_instructions(user, url) 41 end) 42 43 {:ok, _lv, html} = live(conn, ~p"/users/log-in/#{token}") 44 refute html =~ "Confirm my account" 45 assert html =~ "Log in" 46 end 47 48 test "confirms the given token once", %{conn: conn, unconfirmed_user: user} do 49 token = 50 extract_user_token(fn url -> 51 Accounts.deliver_login_instructions(user, url) 52 end) 53 54 {:ok, lv, _html} = live(conn, ~p"/users/log-in/#{token}") 55 56 form = form(lv, "#confirmation_form", %{"user" => %{"token" => token}}) 57 render_submit(form) 58 59 conn = follow_trigger_action(form, conn) 60 61 assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ 62 "User confirmed successfully" 63 64 assert Accounts.get_user!(user.id).confirmed_at 65 # we are logged in now 66 assert get_session(conn, :user_token) 67 assert redirected_to(conn) == ~p"/" 68 69 # log out, new conn 70 conn = build_conn() 71 72 {:ok, _lv, html} = 73 live(conn, ~p"/users/log-in/#{token}") 74 |> follow_redirect(conn, ~p"/users/log-in") 75 76 assert html =~ "Magic link is invalid or it has expired" 77 end 78 79 test "logs confirmed user in without changing confirmed_at", %{ 80 conn: conn, 81 confirmed_user: user 82 } do 83 token = 84 extract_user_token(fn url -> 85 Accounts.deliver_login_instructions(user, url) 86 end) 87 88 {:ok, lv, _html} = live(conn, ~p"/users/log-in/#{token}") 89 90 form = form(lv, "#login_form", %{"user" => %{"token" => token}}) 91 render_submit(form) 92 93 conn = follow_trigger_action(form, conn) 94 95 assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ 96 "Welcome back!" 97 98 assert Accounts.get_user!(user.id).confirmed_at == user.confirmed_at 99 100 # log out, new conn 101 conn = build_conn() 102 103 {:ok, _lv, html} = 104 live(conn, ~p"/users/log-in/#{token}") 105 |> follow_redirect(conn, ~p"/users/log-in") 106 107 assert html =~ "Magic link is invalid or it has expired" 108 end 109 110 test "raises error for invalid token", %{conn: conn} do 111 {:ok, _lv, html} = 112 live(conn, ~p"/users/log-in/invalid-token") 113 |> follow_redirect(conn, ~p"/users/log-in") 114 115 assert html =~ "Magic link is invalid or it has expired" 116 end 117 end 118 end