From d6173571b5f0be4e42b718df6df45383af3a2069 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 16 Jan 2026 12:48:35 +0100 Subject: [PATCH] test: make tests more structural, less dependend on specific values --- .../components/layouts/sidebar_test.exs | 153 ++++++++++-------- 1 file changed, 84 insertions(+), 69 deletions(-) diff --git a/test/mv_web/components/layouts/sidebar_test.exs b/test/mv_web/components/layouts/sidebar_test.exs index 41bbbd7..460d85a 100644 --- a/test/mv_web/components/layouts/sidebar_test.exs +++ b/test/mv_web/components/layouts/sidebar_test.exs @@ -122,35 +122,33 @@ defmodule MvWeb.Layouts.SidebarTest do test "T2.2: does not render menu items when current_user is nil" do html = render_sidebar(guest_assigns()) - # Navigation links should not be rendered - refute html =~ ~s(href="/members") - refute html =~ ~s(href="/users") - refute html =~ ~s(href="/settings") - refute html =~ ~s(href="/contribution_types") + # Navigation menu should not be rendered + refute html =~ ~s(role="menubar") + refute html =~ ~s(role="menuitem") # Footer section should not be rendered - refute html =~ "locale-select" refute html =~ "theme-controller" + refute html =~ "locale-select" end test "T2.3: renders menu items when current_user is present" do html = render_sidebar(authenticated_assigns()) - # Check for Members link - assert html =~ ~s(href="/members") + # Check that menu structure exists + assert html =~ ~s(role="menubar") + assert html =~ ~s(role="menuitem") - # Check for Users link - assert html =~ ~s(href="/users") + # Check that top-level menu items exist (at least one) + # 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 - assert html =~ ~s(href="/custom_field_values") + # Check that nested menu groups exist + assert 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 test "T3.3: renders nested menu with dropdown for collapsed state" do 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, "dropdown") assert has_class?(html, "dropdown-right") - - # Check for dropdown-content assert has_class?(html, "dropdown-content") - # Check for icon button - assert html =~ "hero-currency-dollar" + # Check that dropdown button has icon (any hero icon) + assert html =~ ~r/hero-\w+/ + + # Check ARIA attributes assert html =~ ~s(aria-haspopup="menu") end end @@ -414,17 +419,17 @@ defmodule MvWeb.Layouts.SidebarTest do test "T7.1: renders hero icons for menu items" do html = render_sidebar(authenticated_assigns()) - # Check for hero icons - assert html =~ "hero-users" - assert html =~ "hero-user-circle" - assert html =~ "hero-rectangle-group" - assert html =~ "hero-currency-dollar" - assert html =~ "hero-cog-6-tooth" + # Check that hero icons are present (pattern matching) + assert html =~ ~r/hero-\w+/ + + # Check that icons have aria-hidden + assert html =~ ~s(aria-hidden="true") + + # Check for specific structural icons (toggle, theme) that should always exist assert html =~ "hero-chevron-left" assert html =~ "hero-chevron-right" - - # Icons should have aria-hidden - assert html =~ ~s(aria-hidden="true") + assert html =~ "hero-sun" + assert html =~ "hero-moon" end test "T7.2: renders icons for theme toggle" do @@ -503,26 +508,24 @@ defmodule MvWeb.Layouts.SidebarTest do # Header section assert html =~ "Mila Logo" + assert html =~ ~s(src="/images/mila.svg") # Navigation section 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 =~ " 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") end end