/ test / kls_web / controllers / player_session_controller_test.exs
player_session_controller_test.exs
  1  defmodule HithlinerWeb.PlayerSessionControllerTest do
  2    use HithlinerWeb.ConnCase, async: true
  3  
  4    import Hithliner.PlayersFixtures
  5  
  6    setup do
  7      %{player: player_fixture()}
  8    end
  9  
 10    describe "POST /players/log_in" do
 11      test "logs the player in", %{conn: conn, player: player} do
 12        conn =
 13          post(conn, ~p"/players/log_in", %{
 14            "player" => %{"email" => player.email, "password" => valid_player_password()}
 15          })
 16  
 17        assert get_session(conn, :player_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 =~ player.email
 24        assert response =~ ~p"/players/settings"
 25        assert response =~ ~p"/players/log_out"
 26      end
 27  
 28      test "logs the player in with remember me", %{conn: conn, player: player} do
 29        conn =
 30          post(conn, ~p"/players/log_in", %{
 31            "player" => %{
 32              "email" => player.email,
 33              "password" => valid_player_password(),
 34              "remember_me" => "true"
 35            }
 36          })
 37  
 38        assert conn.resp_cookies["_hithliner_web_player_remember_me"]
 39        assert redirected_to(conn) == ~p"/"
 40      end
 41  
 42      test "logs the player in with return to", %{conn: conn, player: player} do
 43        conn =
 44          conn
 45          |> init_test_session(player_return_to: "/foo/bar")
 46          |> post(~p"/players/log_in", %{
 47            "player" => %{
 48              "email" => player.email,
 49              "password" => valid_player_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, player: player} do
 58        conn =
 59          conn
 60          |> post(~p"/players/log_in", %{
 61            "_action" => "registered",
 62            "player" => %{
 63              "email" => player.email,
 64              "password" => valid_player_password()
 65            }
 66          })
 67  
 68        assert redirected_to(conn) == ~p"/"
 69        assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "Account created successfully"
 70      end
 71  
 72      test "login following password update", %{conn: conn, player: player} do
 73        conn =
 74          conn
 75          |> post(~p"/players/log_in", %{
 76            "_action" => "password_updated",
 77            "player" => %{
 78              "email" => player.email,
 79              "password" => valid_player_password()
 80            }
 81          })
 82  
 83        assert redirected_to(conn) == ~p"/players/settings"
 84        assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "Password updated successfully"
 85      end
 86  
 87      test "redirects to login page with invalid credentials", %{conn: conn} do
 88        conn =
 89          post(conn, ~p"/players/log_in", %{
 90            "player" => %{"email" => "invalid@email.com", "password" => "invalid_password"}
 91          })
 92  
 93        assert Phoenix.Flash.get(conn.assigns.flash, :error) == "Invalid email or password"
 94        assert redirected_to(conn) == ~p"/players/log_in"
 95      end
 96    end
 97  
 98    describe "DELETE /players/log_out" do
 99      test "logs the player out", %{conn: conn, player: player} do
100        conn = conn |> log_in_player(player) |> delete(~p"/players/log_out")
101        assert redirected_to(conn) == ~p"/"
102        refute get_session(conn, :player_token)
103        assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "Logged out successfully"
104      end
105  
106      test "succeeds even if the player is not logged in", %{conn: conn} do
107        conn = delete(conn, ~p"/players/log_out")
108        assert redirected_to(conn) == ~p"/"
109        refute get_session(conn, :player_token)
110        assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "Logged out successfully"
111      end
112    end
113  end