user_session_controller_test.exs
1 defmodule AkashiWeb.UserSessionControllerTest do 2 use AkashiWeb.ConnCase, async: true 3 4 import Akashi.AccountsFixtures 5 6 setup do 7 %{user: user_fixture()} 8 end 9 10 describe "POST /users/log_in" do 11 test "logs the user in", %{conn: conn, user: user} do 12 conn = 13 post(conn, ~p"/users/log_in", %{ 14 "user" => %{"email" => user.email, "password" => valid_user_password()} 15 }) 16 17 assert get_session(conn, :user_token) 18 assert redirected_to(conn) == ~p"/" 19 20 # Now do a logged in request and assert on the menu 21 conn = get(conn, ~p"/") 22 response = html_response(conn, 200) 23 assert response =~ user.email 24 assert response =~ ~p"/users/settings" 25 assert response =~ ~p"/users/log_out" 26 end 27 28 test "logs the user in with remember me", %{conn: conn, user: user} do 29 conn = 30 post(conn, ~p"/users/log_in", %{ 31 "user" => %{ 32 "email" => user.email, 33 "password" => valid_user_password(), 34 "remember_me" => "true" 35 } 36 }) 37 38 assert conn.resp_cookies["_akashi_web_user_remember_me"] 39 assert redirected_to(conn) == ~p"/" 40 end 41 42 test "logs the user in with return to", %{conn: conn, user: user} do 43 conn = 44 conn 45 |> init_test_session(user_return_to: "/foo/bar") 46 |> post(~p"/users/log_in", %{ 47 "user" => %{ 48 "email" => user.email, 49 "password" => valid_user_password() 50 } 51 }) 52 53 assert redirected_to(conn) == "/foo/bar" 54 assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "Welcome back!" 55 end 56 57 test "login following registration", %{conn: conn, user: user} do 58 conn = 59 post(conn, ~p"/users/log_in", %{ 60 "_action" => "registered", 61 "user" => %{"email" => user.email, "password" => valid_user_password()} 62 }) 63 64 assert redirected_to(conn) == ~p"/" 65 assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "Account created successfully" 66 end 67 68 test "login following password update", %{conn: conn, user: user} do 69 conn = 70 post(conn, ~p"/users/log_in", %{ 71 "_action" => "password_updated", 72 "user" => %{"email" => user.email, "password" => valid_user_password()} 73 }) 74 75 assert redirected_to(conn) == ~p"/users/settings" 76 assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "Password updated successfully" 77 end 78 79 test "redirects to login page with invalid credentials", %{conn: conn} do 80 conn = 81 post(conn, ~p"/users/log_in", %{ 82 "user" => %{"email" => "invalid@email.com", "password" => "invalid_password"} 83 }) 84 85 assert Phoenix.Flash.get(conn.assigns.flash, :error) == "Invalid email or password" 86 assert redirected_to(conn) == ~p"/users/log_in" 87 end 88 end 89 90 describe "DELETE /users/log_out" do 91 test "logs the user out", %{conn: conn, user: user} do 92 conn = conn |> log_in_user(user) |> delete(~p"/users/log_out") 93 assert redirected_to(conn) == ~p"/" 94 refute get_session(conn, :user_token) 95 assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "Logged out successfully" 96 end 97 98 test "succeeds even if the user is not logged in", %{conn: conn} do 99 conn = delete(conn, ~p"/users/log_out") 100 assert redirected_to(conn) == ~p"/" 101 refute get_session(conn, :user_token) 102 assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "Logged out successfully" 103 end 104 end 105 end