defmodule MvWeb.GlobalSettingsLiveTest do use MvWeb.ConnCase, async: true import Phoenix.LiveViewTest alias Mv.Membership describe "Global Settings LiveView" do setup %{conn: conn} do user = create_test_user(%{email: "admin@example.com"}) conn = conn_with_oidc_user(conn, user) {:ok, conn: conn, user: user} end test "renders the global settings page", %{conn: conn} do {:ok, _view, html} = live(conn, ~p"/settings") assert html =~ "Club Settings" assert html =~ "Settings" end test "displays current club name", %{conn: conn} do # Set initial club name {:ok, settings} = Membership.get_settings() {:ok, _updated} = Membership.update_settings(settings, %{club_name: "Test Club"}) {:ok, _view, html} = live(conn, ~p"/settings") assert html =~ "Test Club" end test "can update club name via form", %{conn: conn} do {:ok, view, _html} = live(conn, ~p"/settings") # Submit form with new club name assert view |> form("#settings-form", %{setting: %{club_name: "Updated Club Name"}}) |> render_submit() # Check for success message assert render(view) =~ "Settings updated successfully" assert render(view) =~ "Updated Club Name" end test "shows error when club_name is empty", %{conn: conn} do {:ok, view, _html} = live(conn, ~p"/settings") # Submit form with empty club name html = view |> form("#settings-form", %{setting: %{club_name: ""}}) |> render_submit() assert html =~ "must be present" end test "shows error when club_name is missing", %{conn: conn} do {:ok, view, _html} = live(conn, ~p"/settings") # Submit form with club_name explicitly set to empty string # (Phoenix forms will keep existing value if field is omitted) html = view |> form("#settings-form", %{setting: %{club_name: ""}}) |> render_submit() assert html =~ "must be present" end test "displays Memberdata section", %{conn: conn} do {:ok, _view, html} = live(conn, ~p"/settings") assert html =~ "Memberdata" or html =~ "Member Data" end test "displays flash message after member field visibility update", %{conn: conn} do {:ok, view, _html} = live(conn, ~p"/settings") # Simulate member field visibility update send(view.pid, {:member_field_visibility_updated}) # Check for flash message assert render(view) =~ "updated" or render(view) =~ "success" end end describe "CSV Import Section" do test "admin user sees import section", %{conn: conn} do {:ok, _view, html} = live(conn, ~p"/settings") # Check for import section heading or identifier assert html =~ "Import" or html =~ "CSV" or html =~ "member_import" end test "admin user sees custom fields notice", %{conn: conn} do {:ok, _view, html} = live(conn, ~p"/settings") # Check for custom fields notice text assert html =~ "Custom fields" or html =~ "custom field" end test "admin user sees template download links", %{conn: conn} do {:ok, view, _html} = live(conn, ~p"/settings") html = render(view) # Check for English template link assert html =~ "member_import_en.csv" or html =~ "/templates/member_import_en.csv" # Check for German template link assert html =~ "member_import_de.csv" or html =~ "/templates/member_import_de.csv" end test "template links use static path helper", %{conn: conn} do {:ok, view, _html} = live(conn, ~p"/settings") html = render(view) # Check that links contain the static path pattern # Static paths typically start with /templates/ or contain the full path assert html =~ "/templates/member_import_en.csv" or html =~ ~r/href=["'][^"']*member_import_en\.csv["']/ assert html =~ "/templates/member_import_de.csv" or html =~ ~r/href=["'][^"']*member_import_de\.csv["']/ end test "admin user sees file upload input", %{conn: conn} do {:ok, view, _html} = live(conn, ~p"/settings") html = render(view) # Check for file input element assert html =~ ~r/type=["']file["']/i or html =~ "phx-hook" or html =~ "upload" end test "file upload has CSV-only restriction", %{conn: conn} do {:ok, view, _html} = live(conn, ~p"/settings") html = render(view) # Check for CSV file type restriction in help text or accept attribute assert html =~ ~r/\.csv/i or html =~ "CSV" or html =~ ~r/accept=["'][^"']*csv["']/i end test "non-admin user does not see import section", %{conn: conn} do # Create non-admin user (member role) member_user = Mv.Fixtures.user_with_role_fixture("own_data") conn = MvWeb.ConnCase.conn_with_password_user(conn, member_user) {:ok, _view, html} = live(conn, ~p"/settings") # Import section should not be visible refute html =~ "Import Members" or html =~ "CSV Import" or (html =~ "Import" and html =~ "CSV") end end end