mitgliederverwaltung/test/mv_web/live/profile_navigation_test.exs
Rafael Epplée ba5fc34d80
Some checks failed
continuous-integration/drone/push Build is failing
Move custom fields to global admin settings
2025-12-03 16:32:40 +01:00

178 lines
5.7 KiB
Elixir

defmodule MvWeb.ProfileNavigationTest do
use MvWeb.ConnCase, async: true
import Phoenix.LiveViewTest
describe "profile navigation" do
test "clicking profile button redirects to current user profile", %{conn: conn} do
# Setup: Create and login a user
user = create_test_user(%{email: "test@example.com"})
conn = conn_with_password_user(conn, user)
{:ok, view, _html} = live(conn, "/")
# Click the profile button
view |> element("a", "Profil") |> render_click()
# Verify we're on the profile page
assert_redirected(view, "/users/#{user.id}")
end
test "profile navigation shows correct user data", %{conn: conn} do
# Setup: Create and login a user
user = create_test_user(%{email: "test@example.com"})
conn = conn_with_password_user(conn, user)
# Navigate to profile
{:ok, view, _html} = live(conn, "/")
view |> element("a", "Profil") |> render_click()
# Verify profile data
{:ok, _profile_view, html} = live(conn, "/users/#{user.id}")
assert html =~ to_string(user.email)
assert html =~ "Password Authentication"
assert html =~ "Enabled"
end
end
describe "navbar" do
test "renders profile button with correct attributes", %{conn: conn} do
# Setup: Create and login a user
user = create_test_user(%{email: "test@example.com"})
conn = conn_with_password_user(conn, user)
{:ok, _view, html} = live(conn, "/")
assert html =~ ~s(role="button")
assert html =~ "dropdown-content"
assert html =~ "avatar"
assert html =~ "Profil"
end
@tag :skip
# TODO: Implement user initials in navbar avatar - see issue #170
test "shows user initials in avatar", %{conn: conn} do
# Setup: Create and login a user
user = create_test_user(%{email: "test.user@example.com"})
conn = conn_with_password_user(conn, user)
{:ok, _view, html} = live(conn, "/")
# Initials from test.user@example.com
assert html =~ "<span>TU</span>"
end
end
describe "profile navigation with OIDC user" do
test "shows correct profile data for OIDC user", %{conn: conn} do
# Setup: Create OIDC user with sub claim
user_info = %{
"sub" => "oidc_123",
"preferred_username" => "oidc.user@example.com"
}
oauth_tokens = %{
"access_token" => "test_token",
"id_token" => "test_id_token"
}
user =
Mv.Accounts.User
|> Ash.Changeset.for_create(:register_with_rauthy, %{
user_info: user_info,
oauth_tokens: oauth_tokens
})
|> Ash.create!(domain: Mv.Accounts)
# Login user via OIDC
conn = sign_in_user_via_oidc(conn, user)
# Navigate to home and click profile
{:ok, view, _html} = live(conn, "/")
view |> element("a", "Profil") |> render_click()
# Verify we're on the correct profile page with OIDC specific information
{:ok, _profile_view, html} = live(conn, "/users/#{user.id}")
assert html =~ to_string(user.email)
# Password auth should be disabled for OIDC users
assert html =~ "Not enabled"
end
test "profile navigation works across different authentication methods", %{conn: conn} do
# Create password user
password_user =
create_test_user(%{
email: "password2@example.com",
password: "test_password123"
})
# Create OIDC user
user_info = %{
"sub" => "oidc_789",
"preferred_username" => "oidc@example.com"
}
oauth_tokens = %{
"access_token" => "test_token",
"id_token" => "test_id_token"
}
oidc_user =
Mv.Accounts.User
|> Ash.Changeset.for_create(:register_with_rauthy, %{
user_info: user_info,
oauth_tokens: oauth_tokens
})
|> Ash.create!(domain: Mv.Accounts)
# Test with password user
conn_password = conn_with_password_user(conn, password_user)
{:ok, view_password, _html} = live(conn_password, "/")
view_password |> element("a", "Profil") |> render_click()
assert_redirected(view_password, "/users/#{password_user.id}")
# Test with OIDC user
conn_oidc = sign_in_user_via_oidc(conn, oidc_user)
{:ok, view_oidc, _html} = live(conn_oidc, "/")
view_oidc |> element("a", "Profil") |> render_click()
assert_redirected(view_oidc, "/users/#{oidc_user.id}")
end
end
describe "authenticated views" do
setup %{conn: conn} do
user = create_test_user(%{email: "test@example.com"})
conn = conn_with_password_user(conn, user)
{:ok, conn: conn, user: user}
end
@authenticated_paths [
"/",
"/members",
"/members/new",
"/custom_field_values",
"/custom_field_values/new",
"/users",
"/users/new"
]
for path <- @authenticated_paths do
@path path
test "layout shows user data on #{path}", %{conn: conn, user: user} do
{:ok, _view, html} = live(conn, @path)
# The navbar (which requires current_user) should be visible
assert html =~ "navbar"
# Profile button should be visible
assert html =~ "Profil"
# User ID should be in profile link
assert html =~ ~p"/users/#{user.id}"
end
end
test "layout shows user data on user profile page", %{conn: conn, user: user} do
{:ok, _view, html} = live(conn, ~p"/users/#{user.id}")
# The navbar (which requires current_user) should be visible
assert html =~ "navbar"
# Profile button should be visible
assert html =~ "Profil"
# User ID should be in profile link
assert html =~ ~p"/users/#{user.id}"
end
end
end