mitgliederverwaltung/test/mv_web/live/group_live/show_accessibility_test.exs
Simon 123227a50e
Some checks failed
continuous-integration/drone/push Build is failing
refactor: add data-testid selectors for groups ui
2026-02-20 16:34:15 +01:00

252 lines
7.4 KiB
Elixir

defmodule MvWeb.GroupLive.ShowAccessibilityTest do
@moduledoc """
Accessibility tests for Add/Remove Member functionality.
Tests ARIA labels, keyboard navigation, and screen reader support.
"""
use MvWeb.ConnCase, async: false
import Phoenix.LiveViewTest
use Gettext, backend: MvWeb.Gettext
alias Mv.Membership
alias Mv.Fixtures
describe "ARIA labels and roles" do
test "search input has proper ARIA attributes", %{conn: conn} do
group = Fixtures.group_fixture()
{:ok, view, _html} = live(conn, "/groups/#{group.slug}")
# Open inline input
view
|> element("button", "Add Member")
|> render_click()
# OR-chain: at least one of these ARIA/role attributes must be present
assert has_element?(view, "[data-testid=group-show-member-search-input][aria-label]") or
has_element?(
view,
"[data-testid=group-show-member-search-input][aria-autocomplete]"
) or
has_element?(view, "[data-testid=group-show-member-search-input][role=combobox]")
end
test "search input has correct aria-label and aria-autocomplete attributes", %{conn: conn} do
group = Fixtures.group_fixture()
{:ok, view, _html} = live(conn, "/groups/#{group.slug}")
view
|> element("button[phx-click='show_add_member_input']")
|> render_click()
assert has_element?(
view,
"[data-testid=group-show-member-search-input][aria-autocomplete=list]"
)
end
test "remove button has aria-label with tooltip text", %{conn: conn} do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
group = Fixtures.group_fixture()
{:ok, member} =
Membership.create_member(
%{
first_name: "Alice",
last_name: "Smith",
email: "alice@example.com"
},
actor: system_actor
)
Membership.create_member_group(%{member_id: member.id, group_id: group.id},
actor: system_actor
)
{:ok, view, _html} = live(conn, "/groups/#{group.slug}")
assert has_element?(view, "[data-testid=group-show-remove-member][aria-label]")
end
test "add button has correct aria-label", %{conn: conn} do
group = Fixtures.group_fixture()
{:ok, view, _html} = live(conn, "/groups/#{group.slug}")
view
|> element("button[phx-click='show_add_member_input']")
|> render_click()
assert has_element?(view, "[data-testid=group-show-add-selected-members-btn][aria-label]")
end
end
describe "keyboard navigation" do
test "tab navigation works in inline add member area", %{conn: conn} do
# This test verifies that keyboard navigation is possible
# Actual tab order testing would require more complex setup
group = Fixtures.group_fixture()
{:ok, view, _html} = live(conn, "/groups/#{group.slug}")
view
|> element("button[phx-click='show_add_member_input']")
|> render_click()
assert has_element?(view, "[data-testid=group-show-member-search-input]")
end
test "inline input can be closed", %{conn: conn} do
group = Fixtures.group_fixture()
{:ok, view, _html} = live(conn, "/groups/#{group.slug}")
view
|> element("button[phx-click='show_add_member_input']")
|> render_click()
assert has_element?(view, "[data-testid=group-show-member-search-input]")
end
test "enter/space activates buttons when focused", %{conn: conn} do
# This test verifies that buttons can be activated via keyboard
# Actual keyboard event testing would require more complex setup
system_actor = Mv.Helpers.SystemActor.get_system_actor()
group = Fixtures.group_fixture()
{:ok, member} =
Membership.create_member(
%{
first_name: "Bob",
last_name: "Jones",
email: "bob@example.com"
},
actor: system_actor
)
{:ok, view, _html} = live(conn, "/groups/#{group.slug}")
view
|> element("button[phx-click='show_add_member_input']")
|> render_click()
view
|> element("[data-testid=group-show-member-search-input]")
|> render_focus()
view
|> element("form[phx-change='search_members']")
|> render_change(%{"member_search" => "Bob"})
view
|> element("[data-member-id='#{member.id}']")
|> render_click()
view
|> element("[data-testid=group-show-add-selected-members-btn]")
|> render_click()
assert has_element?(view, "[data-testid=group-show-members-table]", "Bob")
end
test "focus management: focus is set to input when opened", %{conn: conn} do
# This test verifies that focus is properly managed
# When inline input opens, focus should move to input field
group = Fixtures.group_fixture()
{:ok, view, _html} = live(conn, "/groups/#{group.slug}")
view
|> element("button[phx-click='show_add_member_input']")
|> render_click()
assert has_element?(view, "[data-testid=group-show-member-search-input]")
end
end
describe "screen reader support" do
test "search input has proper label for screen readers", %{conn: conn} do
group = Fixtures.group_fixture()
{:ok, view, _html} = live(conn, "/groups/#{group.slug}")
view
|> element("button[phx-click='show_add_member_input']")
|> render_click()
assert has_element?(view, "[data-testid=group-show-member-search-input][aria-label]")
end
test "search results are properly announced", %{conn: conn} do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
group = Fixtures.group_fixture()
{:ok, _member} =
Membership.create_member(
%{
first_name: "Charlie",
last_name: "Brown",
email: "charlie@example.com"
},
actor: system_actor
)
{:ok, view, _html} = live(conn, "/groups/#{group.slug}")
view
|> element("button[phx-click='show_add_member_input']")
|> render_click()
view
|> element("[data-testid=group-show-member-search-input]")
|> render_focus()
view
|> element("form[phx-change='search_members']")
|> render_change(%{"member_search" => "Charlie"})
assert has_element?(view, "#member-dropdown[role=listbox]")
assert has_element?(view, "#member-dropdown", "Charlie")
end
test "flash messages are properly announced", %{conn: conn} do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
group = Fixtures.group_fixture()
{:ok, member} =
Membership.create_member(
%{
first_name: "David",
last_name: "Wilson",
email: "david@example.com"
},
actor: system_actor
)
{:ok, view, _html} = live(conn, "/groups/#{group.slug}")
view
|> element("button[phx-click='show_add_member_input']")
|> render_click()
view
|> element("[data-testid=group-show-member-search-input]")
|> render_focus()
view
|> element("form[phx-change='search_members']")
|> render_change(%{"member_search" => "David"})
view
|> element("[data-member-id='#{member.id}']")
|> render_click()
view
|> element("[data-testid=group-show-add-selected-members-btn]")
|> render_click()
assert has_element?(view, "[data-testid=group-show-members-table]", "David")
end
end
end