blonk is a radar for your web, where you follow vibes for cool blips on the radar
at main 122 lines 3.7 kB view raw
1defmodule ElixirBlonkWeb.UserConfirmationControllerTest do 2 use ElixirBlonkWeb.ConnCase, async: true 3 4 alias ElixirBlonk.Accounts 5 alias ElixirBlonk.Repo 6 import ElixirBlonk.AccountsFixtures 7 8 setup do 9 %{user: user_fixture()} 10 end 11 12 describe "GET /users/confirm" do 13 test "renders the resend confirmation page", %{conn: conn} do 14 conn = get(conn, ~p"/users/confirm") 15 response = html_response(conn, 200) 16 assert response =~ "Resend confirmation instructions" 17 end 18 end 19 20 describe "POST /users/confirm" do 21 @tag :capture_log 22 test "sends a new confirmation token", %{conn: conn, user: user} do 23 conn = 24 post(conn, ~p"/users/confirm", %{ 25 "user" => %{"email" => user.email} 26 }) 27 28 assert redirected_to(conn) == ~p"/" 29 30 assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ 31 "If your email is in our system" 32 33 assert Repo.get_by!(Accounts.UserToken, user_id: user.id).context == "confirm" 34 end 35 36 test "does not send confirmation token if User is confirmed", %{conn: conn, user: user} do 37 Repo.update!(Accounts.User.confirm_changeset(user)) 38 39 conn = 40 post(conn, ~p"/users/confirm", %{ 41 "user" => %{"email" => user.email} 42 }) 43 44 assert redirected_to(conn) == ~p"/" 45 46 assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ 47 "If your email is in our system" 48 49 refute Repo.get_by(Accounts.UserToken, user_id: user.id) 50 end 51 52 test "does not send confirmation token if email is invalid", %{conn: conn} do 53 conn = 54 post(conn, ~p"/users/confirm", %{ 55 "user" => %{"email" => "unknown@example.com"} 56 }) 57 58 assert redirected_to(conn) == ~p"/" 59 60 assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ 61 "If your email is in our system" 62 63 assert Repo.all(Accounts.UserToken) == [] 64 end 65 end 66 67 describe "GET /users/confirm/:token" do 68 test "renders the confirmation page", %{conn: conn} do 69 token_path = ~p"/users/confirm/some-token" 70 conn = get(conn, token_path) 71 response = html_response(conn, 200) 72 assert response =~ "Confirm account" 73 74 assert response =~ "action=\"#{token_path}\"" 75 end 76 end 77 78 describe "POST /users/confirm/:token" do 79 test "confirms the given token once", %{conn: conn, user: user} do 80 token = 81 extract_user_token(fn url -> 82 Accounts.deliver_user_confirmation_instructions(user, url) 83 end) 84 85 conn = post(conn, ~p"/users/confirm/#{token}") 86 assert redirected_to(conn) == ~p"/" 87 88 assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ 89 "User confirmed successfully" 90 91 assert Accounts.get_user!(user.id).confirmed_at 92 refute get_session(conn, :user_token) 93 assert Repo.all(Accounts.UserToken) == [] 94 95 # When not logged in 96 conn = post(conn, ~p"/users/confirm/#{token}") 97 assert redirected_to(conn) == ~p"/" 98 99 assert Phoenix.Flash.get(conn.assigns.flash, :error) =~ 100 "User confirmation link is invalid or it has expired" 101 102 # When logged in 103 conn = 104 build_conn() 105 |> log_in_user(user) 106 |> post(~p"/users/confirm/#{token}") 107 108 assert redirected_to(conn) == ~p"/" 109 refute Phoenix.Flash.get(conn.assigns.flash, :error) 110 end 111 112 test "does not confirm email with invalid token", %{conn: conn, user: user} do 113 conn = post(conn, ~p"/users/confirm/oops") 114 assert redirected_to(conn) == ~p"/" 115 116 assert Phoenix.Flash.get(conn.assigns.flash, :error) =~ 117 "User confirmation link is invalid or it has expired" 118 119 refute Accounts.get_user!(user.id).confirmed_at 120 end 121 end 122end