157 lines
5.1 KiB
Elixir
157 lines
5.1 KiB
Elixir
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
|