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 =~ "TU" 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