user_session_controller_test.exs (4742B)
1 defmodule DailyTrackerWeb.UserSessionControllerTest do 2 use DailyTrackerWeb.ConnCase, async: true 3 4 import DailyTracker.AccountsFixtures 5 alias DailyTracker.Accounts 6 7 setup do 8 %{unconfirmed_user: unconfirmed_user_fixture(), user: user_fixture()} 9 end 10 11 describe "POST /users/log-in - email and password" do 12 test "logs the user in", %{conn: conn, user: user} do 13 user = set_password(user) 14 15 conn = 16 post(conn, ~p"/users/log-in", %{ 17 "user" => %{"email" => user.email, "password" => valid_user_password()} 18 }) 19 20 assert get_session(conn, :user_token) 21 assert redirected_to(conn) == ~p"/" 22 23 # Now do a logged in request and assert on the menu 24 conn = get(conn, ~p"/") 25 response = html_response(conn, 200) 26 assert response =~ user.email 27 assert response =~ ~p"/users/settings" 28 assert response =~ ~p"/users/log-out" 29 end 30 31 test "logs the user in with remember me", %{conn: conn, user: user} do 32 user = set_password(user) 33 34 conn = 35 post(conn, ~p"/users/log-in", %{ 36 "user" => %{ 37 "email" => user.email, 38 "password" => valid_user_password(), 39 "remember_me" => "true" 40 } 41 }) 42 43 assert conn.resp_cookies["_daily_tracker_web_user_remember_me"] 44 assert redirected_to(conn) == ~p"/" 45 end 46 47 test "logs the user in with return to", %{conn: conn, user: user} do 48 user = set_password(user) 49 50 conn = 51 conn 52 |> init_test_session(user_return_to: "/foo/bar") 53 |> post(~p"/users/log-in", %{ 54 "user" => %{ 55 "email" => user.email, 56 "password" => valid_user_password() 57 } 58 }) 59 60 assert redirected_to(conn) == "/foo/bar" 61 assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "Welcome back!" 62 end 63 64 test "redirects to login page with invalid credentials", %{conn: conn, user: user} do 65 conn = 66 post(conn, ~p"/users/log-in?mode=password", %{ 67 "user" => %{"email" => user.email, "password" => "invalid_password"} 68 }) 69 70 assert Phoenix.Flash.get(conn.assigns.flash, :error) == "Invalid email or password" 71 assert redirected_to(conn) == ~p"/users/log-in" 72 end 73 end 74 75 describe "POST /users/log-in - magic link" do 76 test "logs the user in", %{conn: conn, user: user} do 77 {token, _hashed_token} = generate_user_magic_link_token(user) 78 79 conn = 80 post(conn, ~p"/users/log-in", %{ 81 "user" => %{"token" => token} 82 }) 83 84 assert get_session(conn, :user_token) 85 assert redirected_to(conn) == ~p"/" 86 87 # Now do a logged in request and assert on the menu 88 conn = get(conn, ~p"/") 89 response = html_response(conn, 200) 90 assert response =~ user.email 91 assert response =~ ~p"/users/settings" 92 assert response =~ ~p"/users/log-out" 93 end 94 95 test "confirms unconfirmed user", %{conn: conn, unconfirmed_user: user} do 96 {token, _hashed_token} = generate_user_magic_link_token(user) 97 refute user.confirmed_at 98 99 conn = 100 post(conn, ~p"/users/log-in", %{ 101 "user" => %{"token" => token}, 102 "_action" => "confirmed" 103 }) 104 105 assert get_session(conn, :user_token) 106 assert redirected_to(conn) == ~p"/" 107 assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "User confirmed successfully." 108 109 assert Accounts.get_user!(user.id).confirmed_at 110 111 # Now do a logged in request and assert on the menu 112 conn = get(conn, ~p"/") 113 response = html_response(conn, 200) 114 assert response =~ user.email 115 assert response =~ ~p"/users/settings" 116 assert response =~ ~p"/users/log-out" 117 end 118 119 test "redirects to login page when magic link is invalid", %{conn: conn} do 120 conn = 121 post(conn, ~p"/users/log-in", %{ 122 "user" => %{"token" => "invalid"} 123 }) 124 125 assert Phoenix.Flash.get(conn.assigns.flash, :error) == 126 "The link is invalid or it has expired." 127 128 assert redirected_to(conn) == ~p"/users/log-in" 129 end 130 end 131 132 describe "DELETE /users/log-out" do 133 test "logs the user out", %{conn: conn, user: user} do 134 conn = conn |> log_in_user(user) |> delete(~p"/users/log-out") 135 assert redirected_to(conn) == ~p"/" 136 refute get_session(conn, :user_token) 137 assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "Logged out successfully" 138 end 139 140 test "succeeds even if the user is not logged in", %{conn: conn} do 141 conn = delete(conn, ~p"/users/log-out") 142 assert redirected_to(conn) == ~p"/" 143 refute get_session(conn, :user_token) 144 assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "Logged out successfully" 145 end 146 end 147 end