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