/ services / app / test / akashi_web / controllers / user_session_controller_test.exs
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