test: make tests more structural, less dependend on specific values

This commit is contained in:
Simon 2026-01-16 12:48:35 +01:00
parent 3381fd88db
commit d6173571b5
Signed by: simon
GPG key ID: 40E7A58C4AA1EDB2

View file

@ -122,35 +122,33 @@ defmodule MvWeb.Layouts.SidebarTest do
test "T2.2: does not render menu items when current_user is nil" do test "T2.2: does not render menu items when current_user is nil" do
html = render_sidebar(guest_assigns()) html = render_sidebar(guest_assigns())
# Navigation links should not be rendered # Navigation menu should not be rendered
refute html =~ ~s(href="/members") refute html =~ ~s(role="menubar")
refute html =~ ~s(href="/users") refute html =~ ~s(role="menuitem")
refute html =~ ~s(href="/settings")
refute html =~ ~s(href="/contribution_types")
# Footer section should not be rendered # Footer section should not be rendered
refute html =~ "locale-select"
refute html =~ "theme-controller" refute html =~ "theme-controller"
refute html =~ "locale-select"
end end
test "T2.3: renders menu items when current_user is present" do test "T2.3: renders menu items when current_user is present" do
html = render_sidebar(authenticated_assigns()) html = render_sidebar(authenticated_assigns())
# Check for Members link # Check that menu structure exists
assert html =~ ~s(href="/members") assert html =~ ~s(role="menubar")
assert html =~ ~s(role="menuitem")
# Check for Users link # Check that top-level menu items exist (at least one)
assert html =~ ~s(href="/users") # Count menu items with tooltips (top-level items have tooltips)
menu_item_count = html |> String.split("data-tip=") |> length() |> Kernel.-(1)
assert menu_item_count > 0, "Should have at least one top-level menu item"
# Check for Custom Fields link # Check that nested menu groups exist
assert html =~ ~s(href="/custom_field_values") assert html =~ "<details"
assert has_class?(html, "expanded-menu-group")
# Check for Contributions section # Check that nested menu items exist
assert html =~ ~s(href="/contribution_types") assert html =~ ~s(role="menu")
assert html =~ ~s(href="/membership_fee_settings")
# Check for Settings link (placeholder)
assert html =~ ~s(href="/settings")
end end
test "T2.4: renders sidebar with main-sidebar ID" do test "T2.4: renders sidebar with main-sidebar ID" do
@ -174,51 +172,58 @@ defmodule MvWeb.Layouts.SidebarTest do
test "T3.1: renders flat menu items with icons and labels" do test "T3.1: renders flat menu items with icons and labels" do
html = render_sidebar(authenticated_assigns()) html = render_sidebar(authenticated_assigns())
# Check for Members link with icon # Check that top-level menu items have structure
assert html =~ ~s(href="/members") # Top-level items have tooltips
assert html =~ "hero-users"
# Check for Users link with icon
assert html =~ ~s(href="/users")
assert html =~ "hero-user-circle"
# Check for Custom Fields link with icon
assert html =~ ~s(href="/custom_field_values")
assert html =~ "hero-rectangle-group"
# Check for Settings link with icon
assert html =~ ~s(href="/settings")
assert html =~ "hero-cog-6-tooth"
# Check for tooltips (data-tip attribute)
assert html =~ "data-tip=" assert html =~ "data-tip="
assert has_class?(html, "tooltip")
assert has_class?(html, "tooltip-right")
# Check that menu items have icons (hero-* classes)
assert html =~ ~r/hero-\w+/
# Check that menu items have labels
assert has_class?(html, "menu-label")
# Check that menu items have links
assert html =~ ~s(role="menuitem")
end end
test "T3.2: renders nested menu with details element for expanded state" do test "T3.2: renders nested menu with details element for expanded state" do
html = render_sidebar(authenticated_assigns()) html = render_sidebar(authenticated_assigns())
# Check for Contributions section structure with details # Check for nested menu structure
assert html =~ "<details" assert html =~ "<details"
assert html =~ "<summary"
assert has_class?(html, "expanded-menu-group") assert has_class?(html, "expanded-menu-group")
# Check for contribution links # Check that nested menu has subitems
assert html =~ ~s(href="/contribution_types") assert html =~ ~s(role="menu")
assert html =~ ~s(href="/membership_fee_settings")
# Check that subitems exist (at least one link in nested menu)
# Submenu items have role="menuitem" but no data-tip attribute
# (Top-level items have data-tip, nested items don't)
# Count menuitems vs data-tips - nested items don't have data-tip
menuitem_count = html |> String.split(~s(role="menuitem")) |> length() |> Kernel.-(1)
data_tip_count = html |> String.split("data-tip=") |> length() |> Kernel.-(1)
# There should be more menuitems than data-tips (nested items don't have data-tip)
assert menuitem_count > data_tip_count,
"Should have nested menu items (menuitems without data-tip)"
end end
test "T3.3: renders nested menu with dropdown for collapsed state" do test "T3.3: renders nested menu with dropdown for collapsed state" do
html = render_sidebar(authenticated_assigns()) html = render_sidebar(authenticated_assigns())
# Check for collapsed dropdown container # Check for collapsed dropdown structure
assert has_class?(html, "collapsed-menu-group") assert has_class?(html, "collapsed-menu-group")
assert has_class?(html, "dropdown") assert has_class?(html, "dropdown")
assert has_class?(html, "dropdown-right") assert has_class?(html, "dropdown-right")
# Check for dropdown-content
assert has_class?(html, "dropdown-content") assert has_class?(html, "dropdown-content")
# Check for icon button # Check that dropdown button has icon (any hero icon)
assert html =~ "hero-currency-dollar" assert html =~ ~r/hero-\w+/
# Check ARIA attributes
assert html =~ ~s(aria-haspopup="menu") assert html =~ ~s(aria-haspopup="menu")
end end
end end
@ -414,17 +419,17 @@ defmodule MvWeb.Layouts.SidebarTest do
test "T7.1: renders hero icons for menu items" do test "T7.1: renders hero icons for menu items" do
html = render_sidebar(authenticated_assigns()) html = render_sidebar(authenticated_assigns())
# Check for hero icons # Check that hero icons are present (pattern matching)
assert html =~ "hero-users" assert html =~ ~r/hero-\w+/
assert html =~ "hero-user-circle"
assert html =~ "hero-rectangle-group" # Check that icons have aria-hidden
assert html =~ "hero-currency-dollar" assert html =~ ~s(aria-hidden="true")
assert html =~ "hero-cog-6-tooth"
# Check for specific structural icons (toggle, theme) that should always exist
assert html =~ "hero-chevron-left" assert html =~ "hero-chevron-left"
assert html =~ "hero-chevron-right" assert html =~ "hero-chevron-right"
assert html =~ "hero-sun"
# Icons should have aria-hidden assert html =~ "hero-moon"
assert html =~ ~s(aria-hidden="true")
end end
test "T7.2: renders icons for theme toggle" do test "T7.2: renders icons for theme toggle" do
@ -503,26 +508,24 @@ defmodule MvWeb.Layouts.SidebarTest do
# Header section # Header section
assert html =~ "Mila Logo" assert html =~ "Mila Logo"
assert html =~ ~s(src="/images/mila.svg")
# Navigation section # Navigation section
assert html =~ ~s(role="menubar") assert html =~ ~s(role="menubar")
assert html =~ ~s(id="main-sidebar")
# Check that menu has items (at least one top-level item)
assert html =~ ~s(role="menuitem")
# Check that nested menus exist
assert html =~ "<details"
# Footer section # Footer section
assert html =~ "theme-controller" assert html =~ "theme-controller"
assert html =~ ~s(action="/set_locale")
# All expected links # Check that critical navigation exists (at least /members)
expected_links = [ assert html =~ ~s(href="/members"), "Critical /members route should exist"
"/members",
"/users",
"/custom_field_values",
"/contribution_types",
"/membership_fee_settings",
"/sign-out"
]
for link <- expected_links do
assert html =~ ~s(href="#{link}"), "Missing link: #{link}"
end
end end
end end
@ -639,9 +642,21 @@ defmodule MvWeb.Layouts.SidebarTest do
test "renders submenu items" do test "renders submenu items" do
html = render_sidebar(authenticated_assigns()) html = render_sidebar(authenticated_assigns())
# Inner_block items rendered # Check that nested menu structure exists
assert html =~ ~s(href="/contribution_types") assert html =~ ~s(role="menu")
assert html =~ ~s(href="/membership_fee_settings")
# Check that subitems are rendered (links within nested menu)
# Submenu items have role="menuitem" but no data-tip attribute
# (Top-level items have data-tip, nested items don't)
# Count menuitems vs data-tips - nested items don't have data-tip
menuitem_count = html |> String.split(~s(role="menuitem")) |> length() |> Kernel.-(1)
data_tip_count = html |> String.split("data-tip=") |> length() |> Kernel.-(1)
# There should be more menuitems than data-tips (nested items don't have data-tip)
assert menuitem_count > data_tip_count,
"Should have nested menu items (menuitems without data-tip)"
# Verify nested menu structure exists
assert html =~ ~s(role="menu") assert html =~ ~s(role="menu")
end end
end end