daily-tracker

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

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