All checks were successful
continuous-integration/drone/push Build is passing
Complete refactoring of resources, database tables, code references, tests, and documentation for improved naming consistency.
182 lines
5.8 KiB
Elixir
182 lines
5.8 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)
|
|
# OIDC ID should be visible
|
|
assert html =~ "oidc_123"
|
|
# 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",
|
|
"/custom_fields",
|
|
"/custom_fields/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
|