mitgliederverwaltung/test/mv_web/live/user_live/show_test.exs
Simon 91f8bb03bc
All checks were successful
continuous-integration/drone/push Build is passing
refactor: remove tests against basic framework functionalities
2026-01-28 13:46:18 +01:00

119 lines
3.7 KiB
Elixir

defmodule MvWeb.UserLive.ShowTest do
@moduledoc """
Tests for the user show page.
Tests cover:
- Displaying user information
- Authentication status display
- Linked member display
- Navigation
- Error handling
"""
use MvWeb.ConnCase, async: true
import Phoenix.LiveViewTest
require Ash.Query
use Gettext, backend: MvWeb.Gettext
alias Mv.Membership.Member
setup do
# Create test user
user = create_test_user(%{email: "test@example.com", oidc_id: "test123"})
%{user: user}
end
describe "mount and display" do
test "mounts successfully with valid user ID", %{conn: conn, user: user} do
conn = conn_with_oidc_user(conn)
{:ok, _view, html} = live(conn, ~p"/users/#{user.id}")
assert html =~ to_string(user.email)
end
test "displays password authentication status when enabled", %{conn: conn} do
user = create_test_user(%{email: "password-user@example.com", password: "test123"})
conn = conn_with_oidc_user(conn)
{:ok, _view, html} = live(conn, ~p"/users/#{user.id}")
assert html =~ gettext("Password Authentication")
assert html =~ gettext("Enabled")
end
test "displays password authentication status when not enabled", %{conn: conn} do
# User without password (only OIDC) - create user with OIDC only
user =
create_test_user(%{
email: "oidc-only#{System.unique_integer([:positive])}@example.com",
oidc_id: "oidc#{System.unique_integer([:positive])}",
hashed_password: nil
})
conn = conn_with_oidc_user(conn)
{:ok, _view, html} = live(conn, ~p"/users/#{user.id}")
assert html =~ gettext("Password Authentication")
assert html =~ gettext("Not enabled")
end
test "displays linked member when present", %{conn: conn} do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
# Create member
{:ok, member} =
Member
|> Ash.Changeset.for_create(:create_member, %{
first_name: "Alice",
last_name: "Smith",
email: "alice@example.com"
})
|> Ash.create(actor: system_actor)
# Create user and link to member
user = create_test_user(%{email: "user@example.com"})
{:ok, _updated_user} =
user
|> Ash.Changeset.for_update(:update, %{})
|> Ash.Changeset.manage_relationship(:member, member, type: :append_and_remove)
|> Ash.update(actor: system_actor)
conn = conn_with_oidc_user(conn)
{:ok, _view, html} = live(conn, ~p"/users/#{user.id}")
assert html =~ gettext("Linked Member")
assert html =~ "Alice Smith"
assert html =~ ~r/href="[^"]*\/members\/#{member.id}"/
end
test "displays 'No member linked' when no member is linked", %{conn: conn, user: user} do
conn = conn_with_oidc_user(conn)
{:ok, _view, html} = live(conn, ~p"/users/#{user.id}")
assert html =~ gettext("Linked Member")
assert html =~ gettext("No member linked")
end
end
describe "error handling" do
test "raises exception for invalid user ID", %{conn: conn} do
invalid_id = Ecto.UUID.generate()
conn = conn_with_oidc_user(conn)
# The mount function uses Ash.get! which will raise an exception
# This is expected behavior - the LiveView doesn't handle this case
assert_raise Ash.Error.Invalid, fn ->
live(conn, ~p"/users/#{invalid_id}")
end
end
end
describe "system actor user" do
test "redirects to user list when viewing system actor user", %{conn: conn} do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
conn = conn_with_oidc_user(conn)
assert {:error, {:live_redirect, %{to: "/users"}}} =
live(conn, ~p"/users/#{system_actor.id}")
end
end
end