blonk is a radar for your web, where you follow vibes for cool blips on the radar
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