Reset session when hitting /login

This commit is contained in:
Claudio Ortolina
2024-10-21 09:59:29 +01:00
parent 432090dec4
commit be314e3916
3 changed files with 71 additions and 3 deletions
@@ -4,7 +4,9 @@ defmodule MusicLibraryWeb.SessionController do
@empty_form %{"password" => ""}
def new(conn, _params) do
conn |> render(:new, form: @empty_form, layout: {MusicLibraryWeb.Layouts, "unauthenticated"})
conn
|> delete_session(:logged_in)
|> render(:new, form: @empty_form, layout: {MusicLibraryWeb.Layouts, "unauthenticated"})
end
def create(conn, %{"password" => request_password}) do
@@ -0,0 +1,60 @@
defmodule MusicLibraryWeb.SessionControllerTest do
use MusicLibraryWeb.ConnCase
describe "GET /login" do
@tag :logged_out
test "it shows the login form", %{conn: conn} do
conn = get(conn, "/login")
response = html_response(conn, 200)
assert response =~ "Welcome to your Music Library"
assert response =~ "Password"
assert response =~ "Sign in"
end
test "it resets the session", %{conn: conn} do
conn = get(conn, "/login")
session = get_session(conn)
refute session["logged_in"]
end
end
describe "POST /sessions/create" do
@tag :logged_out
test "it refuses an invalid password", %{conn: conn} do
conn = post(conn, ~p"/sessions/create", %{"password" => "wrong password"})
{"location", location} =
conn.resp_headers
|> List.keyfind("location", 0)
session = get_session(conn)
assert conn.status == 302
assert location == "/login"
assert conn.assigns.flash == %{"error" => "Invalid password"}
refute session["logged_in"]
end
test "it accepts a valid password", %{conn: conn} do
valid_password =
Application.get_env(:music_library, MusicLibraryWeb)
|> Keyword.fetch!(:auth_password)
conn = post(conn, ~p"/sessions/create", %{"password" => valid_password})
session = get_session(conn)
{"location", location} =
conn.resp_headers
|> List.keyfind("location", 0)
assert conn.status == 302
assert location == "/"
assert conn.assigns.flash == %{}
assert session["logged_in"]
end
end
end
+8 -2
View File
@@ -34,9 +34,15 @@ defmodule MusicLibraryWeb.ConnCase do
setup tags do
MusicLibrary.DataCase.setup_sandbox(tags)
# The majority of functionality assumes a logged in user,
# so we default to that.
conn =
Phoenix.ConnTest.build_conn()
|> Phoenix.ConnTest.init_test_session(%{logged_in: true})
if tags[:logged_out] do
Phoenix.ConnTest.build_conn()
else
Phoenix.ConnTest.build_conn()
|> Phoenix.ConnTest.init_test_session(%{logged_in: true})
end
{:ok, conn: conn}
end