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 button is visible on all main pages", %{conn: conn} do # Setup: Create and login a user user = create_test_user(%{email: "test@example.com"}) conn = conn_with_password_user(conn, user) # Test main routes for path <- ["/", "/members", "/properties", "/users"] do {:ok, _view, html} = live(conn, path) assert html =~ "Profil" end 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, "/") assert html =~ "TU" # Initials from test.user@example.com 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) assert html =~ "oidc_123" # OIDC ID should be visible assert html =~ "Not enabled" # Password auth should be disabled for OIDC users 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 end