defmodule MvWeb.MemberLive.IndexRequiredDisplayTest do @moduledoc """ Tests for displaying "required" badge in member overview. Tests cover: - "required" badge for required member fields (first_name, last_name, email) - "required" badge for required custom fields - No "required" badge for optional member fields - No "required" badge for optional custom fields - Badge is positioned in column header """ # async: false to prevent PostgreSQL deadlocks when creating members and custom fields use MvWeb.ConnCase, async: false import Phoenix.LiveViewTest require Ash.Query alias Mv.Membership.{CustomField, CustomFieldValue, Member} setup do # Create test member {:ok, member} = Member |> Ash.Changeset.for_create(:create_member, %{ first_name: "Alice", last_name: "Anderson", email: "alice@example.com" }) |> Ash.create() # Create required custom field {:ok, required_field} = CustomField |> Ash.Changeset.for_create(:create, %{ name: "emergency_contact", value_type: :string, required: true, show_in_overview: true }) |> Ash.create() # Create optional custom field {:ok, optional_field} = CustomField |> Ash.Changeset.for_create(:create, %{ name: "hobby", value_type: :string, required: false, show_in_overview: true }) |> Ash.create() # Create custom field values {:ok, _cfv1} = CustomFieldValue |> Ash.Changeset.for_create(:create, %{ member_id: member.id, custom_field_id: required_field.id, value: %{"_union_type" => "string", "_union_value" => "John Doe"} }) |> Ash.create() {:ok, _cfv2} = CustomFieldValue |> Ash.Changeset.for_create(:create, %{ member_id: member.id, custom_field_id: optional_field.id, value: %{"_union_type" => "string", "_union_value" => "Reading"} }) |> Ash.create() %{ member: member, required_field: required_field, optional_field: optional_field } end describe "required badge for member fields" do test "displays required badge for first_name column", %{conn: conn} do conn = conn_with_oidc_user(conn) {:ok, _view, html} = live(conn, "/members") # Check that first_name column header has required badge assert html =~ "first_name" or html =~ "First name" or html =~ "First Name" # Should have required indicator in header assert html =~ "required" or html =~ "Required" end test "displays required badge for last_name column", %{conn: conn} do conn = conn_with_oidc_user(conn) {:ok, _view, html} = live(conn, "/members") # Check that last_name column header has required badge assert html =~ "last_name" or html =~ "Last name" or html =~ "Last Name" # Should have required indicator in header assert html =~ "required" or html =~ "Required" end test "displays required badge for email column", %{conn: conn} do conn = conn_with_oidc_user(conn) {:ok, _view, html} = live(conn, "/members") # Check that email column header has required badge assert html =~ "email" or html =~ "Email" # Should have required indicator in header assert html =~ "required" or html =~ "Required" end test "does not display required badge for optional member fields", %{conn: conn} do conn = conn_with_oidc_user(conn) {:ok, _view, html} = live(conn, "/members") # Optional fields: street, city, phone_number, etc. # These should not have required badge # We check that street is present but doesn't have required indicator nearby assert html =~ "street" or html =~ "Street" end end describe "required badge for custom fields" do test "displays required badge for required custom field column", %{ conn: conn, required_field: field } do conn = conn_with_oidc_user(conn) {:ok, _view, html} = live(conn, "/members") # Check that required custom field column header has required badge assert html =~ field.name # Should have required indicator in header assert html =~ "required" or html =~ "Required" end test "does not display required badge for optional custom field column", %{ conn: conn, optional_field: field } do conn = conn_with_oidc_user(conn) {:ok, _view, html} = live(conn, "/members") # Check that optional custom field column header does not have required badge assert html =~ field.name # Should not have required indicator (or it should be clear it's optional) end end describe "badge positioning" do test "required badge is in column header, not in cell content", %{conn: conn} do conn = conn_with_oidc_user(conn) {:ok, _view, html} = live(conn, "/members") # Required badge should be in thead (header), not in tbody (data rows) # This is verified by checking that required appears near column headers assert html =~ "thead" or html =~ "th" end end end