diff --git a/lib/mv_web/live/group_live/show.ex b/lib/mv_web/live/group_live/show.ex
index dc0a922..0c7e93e 100644
--- a/lib/mv_web/live/group_live/show.ex
+++ b/lib/mv_web/live/group_live/show.ex
@@ -98,12 +98,20 @@ defmodule MvWeb.GroupLive.Show do
<%= if can?(@current_user, :update, @group) do %>
- <.button variant="primary" navigate={~p"/groups/#{@group.slug}/edit"}>
+ <.button
+ variant="primary"
+ navigate={~p"/groups/#{@group.slug}/edit"}
+ data-testid="group-show-edit-btn"
+ >
{gettext("Edit")}
<% end %>
<%= if can?(@current_user, :destroy, @group) do %>
- <.button class="btn-error" phx-click="open_delete_modal">
+ <.button
+ class="btn-error"
+ phx-click="open_delete_modal"
+ data-testid="group-show-delete-btn"
+ >
{gettext("Delete")}
<% end %>
@@ -126,7 +134,7 @@ defmodule MvWeb.GroupLive.Show do
{gettext("Members")}
-
+
{ngettext(
"Total: %{count} member",
"Total: %{count} members",
@@ -163,6 +171,7 @@ defmodule MvWeb.GroupLive.Show do
@@ -258,9 +268,11 @@ defmodule MvWeb.GroupLive.Show do
<% end %>
<%= if Enum.empty?(@group.members || []) do %>
-
{gettext("No members in this group")}
+
+ {gettext("No members in this group")}
+
<% else %>
-
+
@@ -301,6 +313,7 @@ defmodule MvWeb.GroupLive.Show do
class="btn btn-ghost btn-sm text-error"
phx-click="remove_member"
phx-value-member_id={member.id}
+ data-testid="group-show-remove-member"
aria-label={gettext("Remove member from group")}
data-tooltip={gettext("Remove")}
>
diff --git a/test/mv_web/live/group_live/form_test.exs b/test/mv_web/live/group_live/form_test.exs
index 9169dfe..8934e85 100644
--- a/test/mv_web/live/group_live/form_test.exs
+++ b/test/mv_web/live/group_live/form_test.exs
@@ -19,6 +19,7 @@ defmodule MvWeb.GroupLive.FormTest do
test "form renders with empty fields", %{conn: conn} do
{:ok, view, html} = live(conn, "/groups/new")
+ # OR-chain for i18n (Create Group / Gruppe erstellen)
assert html =~ gettext("Create Group") or html =~ "create" or html =~ "Gruppe erstellen"
assert has_element?(view, "form")
end
@@ -65,6 +66,7 @@ defmodule MvWeb.GroupLive.FormTest do
|> form("#group-form", group: form_data)
|> render_submit()
+ # OR-chain for i18n (required/erforderlich) and validation message wording
assert html =~ gettext("required") or html =~ "name" or html =~ "error" or
html =~ "erforderlich"
end
@@ -80,6 +82,7 @@ defmodule MvWeb.GroupLive.FormTest do
|> form("#group-form", group: form_data)
|> render_submit()
+ # OR-chain for i18n (length/Länge) and validation message
assert html =~ "100" or html =~ "length" or html =~ "error" or html =~ "Länge"
end
@@ -98,6 +101,7 @@ defmodule MvWeb.GroupLive.FormTest do
|> form("#group-form", group: form_data)
|> render_submit()
+ # OR-chain for i18n (length/Länge) and validation message
assert html =~ "500" or html =~ "length" or html =~ "error" or html =~ "Länge"
end
@@ -116,6 +120,7 @@ defmodule MvWeb.GroupLive.FormTest do
|> render_submit()
# Check for a validation error on the name field in a robust way
+ # OR-chain for i18n and validation message (already taken)
assert html =~ "name" or html =~ gettext("has already been taken")
end
@@ -131,6 +136,7 @@ defmodule MvWeb.GroupLive.FormTest do
|> form("#group-form", group: form_data)
|> render_submit()
+ # OR-chain for i18n (error/Fehler, invalid/ungültig)
assert html =~ "error" or html =~ "invalid" or html =~ "Fehler" or html =~ "ungültig"
end
end
@@ -196,6 +202,7 @@ defmodule MvWeb.GroupLive.FormTest do
|> form("#group-form", group: form_data)
|> render_submit()
+ # OR-chain for i18n (already taken / bereits vergeben) and validation wording
assert html =~ "already" or html =~ "taken" or html =~ "exists" or html =~ "error" or
html =~ "bereits" or html =~ "vergeben"
end
@@ -205,7 +212,7 @@ defmodule MvWeb.GroupLive.FormTest do
{:ok, _view, html} = live(conn, "/groups/#{group.slug}/edit")
- # Slug should not be in form (it's immutable)
+ # Slug should not be in form (it's immutable); regex for input element
refute html =~ ~r/slug.*input/i or html =~ ~r/input.*slug/i
end
end
diff --git a/test/mv_web/live/group_live/index_test.exs b/test/mv_web/live/group_live/index_test.exs
index b972095..751b5c6 100644
--- a/test/mv_web/live/group_live/index_test.exs
+++ b/test/mv_web/live/group_live/index_test.exs
@@ -40,13 +40,14 @@ defmodule MvWeb.GroupLive.IndexTest do
assert html =~ "Test Group"
assert html =~ "Test description"
- # Member count should be displayed (0 for empty group)
+ # OR-chain for i18n (Members/Mitglieder) and alternate copy for count
assert html =~ "0" or html =~ gettext("Members") or html =~ "Mitglieder"
end
test "displays 'Create Group' button for admin users", %{conn: conn} do
{:ok, _view, html} = live(conn, "/groups")
+ # OR-chain for i18n (Create Group / Gruppe erstellen) and alternate wording
assert html =~ gettext("Create Group") or html =~ "create" or html =~ "new" or
html =~ "Gruppe erstellen"
end
@@ -54,7 +55,7 @@ defmodule MvWeb.GroupLive.IndexTest do
test "displays empty state when no groups exist", %{conn: conn} do
{:ok, _view, html} = live(conn, "/groups")
- # Should show empty state or empty list message
+ # OR-chain for i18n (No groups / Keine Gruppen) and alternate empty state copy
assert html =~ gettext("No groups") or html =~ "0" or html =~ "empty" or
html =~ "Keine Gruppen"
end
@@ -76,6 +77,7 @@ defmodule MvWeb.GroupLive.IndexTest do
{:ok, _view, html} = live(conn, "/groups")
+ # Long description may be truncated in UI
assert html =~ long_description or html =~ String.slice(long_description, 0, 100)
end
end
@@ -109,7 +111,7 @@ defmodule MvWeb.GroupLive.IndexTest do
# Should be able to see groups
assert html =~ gettext("Groups")
- # Should NOT see create button
+ # Read-only must not see create button (OR for i18n)
refute html =~ gettext("Create Group") or html =~ "create"
end
end
@@ -177,7 +179,7 @@ defmodule MvWeb.GroupLive.IndexTest do
final_count = Agent.get(query_count_agent, & &1)
:telemetry.detach(handler_id)
- # Member count should be displayed (should be 2)
+ # OR-chain for i18n (Members/Mitglieder) and count display
assert html =~ "2" or html =~ gettext("Members") or html =~ "Mitglieder"
# Verify query count is reasonable (member count should be calculated efficiently)
diff --git a/test/mv_web/live/group_live/integration_test.exs b/test/mv_web/live/group_live/integration_test.exs
index a98de85..96e9031 100644
--- a/test/mv_web/live/group_live/integration_test.exs
+++ b/test/mv_web/live/group_live/integration_test.exs
@@ -62,7 +62,7 @@ defmodule MvWeb.GroupLive.IntegrationTest do
assert html =~ "Updated Workflow Test Group"
assert html =~ "Updated description"
- # Slug should remain unchanged
+ # OR-chain: slug may appear as UUID or normalized slug in copy
assert html =~ original_slug or html =~ "workflow-test-group"
end
@@ -101,7 +101,7 @@ defmodule MvWeb.GroupLive.IntegrationTest do
# View group via slug
{:ok, _view, html} = live(conn, "/groups/#{group.slug}")
- # Member count should be 2
+ # OR-chain for i18n (Members/Mitglieder); member names may be first or last
assert html =~ "2" or html =~ gettext("Members") or html =~ "Mitglieder"
assert html =~ member1.first_name or html =~ member1.last_name
assert html =~ member2.first_name or html =~ member2.last_name
diff --git a/test/mv_web/live/group_live/show_accessibility_test.exs b/test/mv_web/live/group_live/show_accessibility_test.exs
index 97ce469..fc63551 100644
--- a/test/mv_web/live/group_live/show_accessibility_test.exs
+++ b/test/mv_web/live/group_live/show_accessibility_test.exs
@@ -22,12 +22,13 @@ defmodule MvWeb.GroupLive.ShowAccessibilityTest do
|> element("button", "Add Member")
|> render_click()
- html = render(view)
-
- # Search input should have proper ARIA attributes
- assert html =~ ~r/aria-label/ ||
- html =~ ~r/aria-autocomplete/ ||
- html =~ ~r/role=["']combobox["']/
+ # 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
@@ -35,16 +36,14 @@ defmodule MvWeb.GroupLive.ShowAccessibilityTest do
{:ok, view, _html} = live(conn, "/groups/#{group.slug}")
- # Open inline input
view
- |> element("button", "Add Member")
+ |> element("button[phx-click='show_add_member_input']")
|> render_click()
- html = render(view)
-
- # Search input should have ARIA attributes
- assert html =~ ~r/aria-label.*[Ss]earch.*member/ ||
- html =~ ~r/aria-autocomplete=["']list["']/
+ 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
@@ -67,11 +66,7 @@ defmodule MvWeb.GroupLive.ShowAccessibilityTest do
{:ok, view, _html} = live(conn, "/groups/#{group.slug}")
- html = render(view)
-
- # Remove button should have aria-label
- assert html =~ ~r/aria-label.*[Rr]emove/ ||
- html =~ ~r/aria-label.*member/i
+ assert has_element?(view, "[data-testid=group-show-remove-member][aria-label]")
end
test "add button has correct aria-label", %{conn: conn} do
@@ -79,16 +74,11 @@ defmodule MvWeb.GroupLive.ShowAccessibilityTest do
{:ok, view, _html} = live(conn, "/groups/#{group.slug}")
- # Open inline input
view
- |> element("button", "Add Member")
+ |> element("button[phx-click='show_add_member_input']")
|> render_click()
- html = render(view)
-
- # Add button should have aria-label
- assert html =~ ~r/aria-label.*[Aa]dd/ ||
- html =~ ~r/button.*[Aa]dd/
+ assert has_element?(view, "[data-testid=group-show-add-selected-members-btn][aria-label]")
end
end
@@ -100,16 +90,11 @@ defmodule MvWeb.GroupLive.ShowAccessibilityTest do
{:ok, view, _html} = live(conn, "/groups/#{group.slug}")
- # Open inline input
view
- |> element("button", "Add Member")
+ |> element("button[phx-click='show_add_member_input']")
|> render_click()
- html = render(view)
-
- # Inline add member area should have focusable elements
- assert html =~ ~r/input|button/ ||
- html =~ "#member-search-input"
+ assert has_element?(view, "[data-testid=group-show-member-search-input]")
end
test "inline input can be closed", %{conn: conn} do
@@ -117,17 +102,11 @@ defmodule MvWeb.GroupLive.ShowAccessibilityTest do
{:ok, view, _html} = live(conn, "/groups/#{group.slug}")
- # Open inline input
view
- |> element("button", "Add Member")
+ |> element("button[phx-click='show_add_member_input']")
|> render_click()
- assert has_element?(view, "#member-search-input")
-
- # Click Add Member button again to close (or add a member to close it)
- # For now, we verify the input is visible when opened
- html = render(view)
- assert html =~ "#member-search-input" || has_element?(view, "#member-search-input")
+ assert has_element?(view, "[data-testid=group-show-member-search-input]")
end
test "enter/space activates buttons when focused", %{conn: conn} do
@@ -148,17 +127,14 @@ defmodule MvWeb.GroupLive.ShowAccessibilityTest do
{:ok, view, _html} = live(conn, "/groups/#{group.slug}")
- # Open inline input
view
- |> element("button", "Add Member")
+ |> element("button[phx-click='show_add_member_input']")
|> render_click()
- # Select member
view
- |> element("#member-search-input")
+ |> element("[data-testid=group-show-member-search-input]")
|> render_focus()
- # phx-change is on the form, so we need to trigger it via the form
view
|> element("form[phx-change='search_members']")
|> render_change(%{"member_search" => "Bob"})
@@ -167,14 +143,11 @@ defmodule MvWeb.GroupLive.ShowAccessibilityTest do
|> element("[data-member-id='#{member.id}']")
|> render_click()
- # Add button should be enabled and clickable
view
- |> element("button[phx-click='add_selected_members']")
+ |> element("[data-testid=group-show-add-selected-members-btn]")
|> render_click()
- # Should succeed (member should appear in list)
- html = render(view)
- assert html =~ "Bob"
+ 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
@@ -184,16 +157,11 @@ defmodule MvWeb.GroupLive.ShowAccessibilityTest do
{:ok, view, _html} = live(conn, "/groups/#{group.slug}")
- # Open inline input
view
- |> element("button", "Add Member")
+ |> element("button[phx-click='show_add_member_input']")
|> render_click()
- html = render(view)
-
- # Input should be visible and focusable
- assert html =~ "#member-search-input" ||
- html =~ ~r/autofocus|tabindex/
+ assert has_element?(view, "[data-testid=group-show-member-search-input]")
end
end
@@ -203,16 +171,11 @@ defmodule MvWeb.GroupLive.ShowAccessibilityTest do
{:ok, view, _html} = live(conn, "/groups/#{group.slug}")
- # Open inline input
view
- |> element("button", "Add Member")
+ |> element("button[phx-click='show_add_member_input']")
|> render_click()
- html = render(view)
-
- # Input should have aria-label
- assert html =~ ~r/aria-label.*[Ss]earch.*member/ ||
- html =~ ~r/aria-label/
+ assert has_element?(view, "[data-testid=group-show-member-search-input][aria-label]")
end
test "search results are properly announced", %{conn: conn} do
@@ -231,27 +194,20 @@ defmodule MvWeb.GroupLive.ShowAccessibilityTest do
{:ok, view, _html} = live(conn, "/groups/#{group.slug}")
- # Open inline input
view
- |> element("button", "Add Member")
+ |> element("button[phx-click='show_add_member_input']")
|> render_click()
- # Search
view
- |> element("#member-search-input")
+ |> element("[data-testid=group-show-member-search-input]")
|> render_focus()
- # phx-change is on the form, so we need to trigger it via the form
view
|> element("form[phx-change='search_members']")
|> render_change(%{"member_search" => "Charlie"})
- html = render(view)
-
- # Search results should have proper ARIA attributes
- assert html =~ ~r/role=["']listbox["']/ ||
- html =~ ~r/role=["']option["']/ ||
- html =~ "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
@@ -270,16 +226,14 @@ defmodule MvWeb.GroupLive.ShowAccessibilityTest do
{:ok, view, _html} = live(conn, "/groups/#{group.slug}")
- # Add member
view
- |> element("button", "Add Member")
+ |> element("button[phx-click='show_add_member_input']")
|> render_click()
view
- |> element("#member-search-input")
+ |> element("[data-testid=group-show-member-search-input]")
|> render_focus()
- # phx-change is on the form, so we need to trigger it via the form
view
|> element("form[phx-change='search_members']")
|> render_change(%{"member_search" => "David"})
@@ -289,13 +243,10 @@ defmodule MvWeb.GroupLive.ShowAccessibilityTest do
|> render_click()
view
- |> element("button[phx-click='add_selected_members']")
+ |> element("[data-testid=group-show-add-selected-members-btn]")
|> render_click()
- html = render(view)
-
- # Member should appear in list (no flash message)
- assert html =~ "David"
+ assert has_element?(view, "[data-testid=group-show-members-table]", "David")
end
end
end
diff --git a/test/mv_web/live/group_live/show_add_member_test.exs b/test/mv_web/live/group_live/show_add_member_test.exs
index 783db9d..0e1af32 100644
--- a/test/mv_web/live/group_live/show_add_member_test.exs
+++ b/test/mv_web/live/group_live/show_add_member_test.exs
@@ -34,9 +34,8 @@ defmodule MvWeb.GroupLive.ShowAddMemberTest do
select_member(view, member)
add_selected(view)
- html = render(view)
- assert html =~ "Alice"
- assert html =~ "Johnson"
+ assert has_element?(view, "[data-testid=group-show-members-table]", "Alice")
+ assert has_element?(view, "[data-testid=group-show-members-table]", "Johnson")
end
test "member is successfully added to group (verified in list)", %{conn: conn} do
@@ -55,16 +54,14 @@ defmodule MvWeb.GroupLive.ShowAddMemberTest do
{:ok, view, _html} = live(conn, "/groups/#{group.slug}")
- # Open inline input and add member
view
- |> element("button", "Add Member")
+ |> element("button[phx-click='show_add_member_input']")
|> render_click()
view
- |> element("#member-search-input")
+ |> element("[data-testid=group-show-member-search-input]")
|> render_focus()
- # phx-change is on the form, so we need to trigger it via the form
view
|> element("form[phx-change='search_members']")
|> render_change(%{"member_search" => "Bob"})
@@ -74,14 +71,11 @@ defmodule MvWeb.GroupLive.ShowAddMemberTest do
|> render_click()
view
- |> element("button[phx-click='add_selected_members']")
+ |> element("[data-testid=group-show-add-selected-members-btn]")
|> render_click()
- html = render(view)
-
- # Verify member appears in group list (no success flash message)
- assert html =~ "Bob"
- assert html =~ "Smith"
+ assert has_element?(view, "[data-testid=group-show-members-table]", "Bob")
+ assert has_element?(view, "[data-testid=group-show-members-table]", "Smith")
end
test "group member list updates automatically after add", %{conn: conn} do
@@ -98,21 +92,18 @@ defmodule MvWeb.GroupLive.ShowAddMemberTest do
actor: system_actor
)
- {:ok, view, html} = live(conn, "/groups/#{group.slug}")
+ {:ok, view, _html} = live(conn, "/groups/#{group.slug}")
- # Initially member should NOT be in list
- refute html =~ "Charlie"
+ refute has_element?(view, "[data-testid=group-show-members-table]", "Charlie")
- # Add member
view
- |> element("button", "Add Member")
+ |> element("button[phx-click='show_add_member_input']")
|> render_click()
view
- |> element("#member-search-input")
+ |> element("[data-testid=group-show-member-search-input]")
|> render_focus()
- # phx-change is on the form, so we need to trigger it via the form
view
|> element("form[phx-change='search_members']")
|> render_change(%{"member_search" => "Charlie"})
@@ -122,13 +113,11 @@ defmodule MvWeb.GroupLive.ShowAddMemberTest do
|> render_click()
view
- |> element("button[phx-click='add_selected_members']")
+ |> element("[data-testid=group-show-add-selected-members-btn]")
|> render_click()
- # Member should now appear in list
- html = render(view)
- assert html =~ "Charlie"
- assert html =~ "Brown"
+ assert has_element?(view, "[data-testid=group-show-members-table]", "Charlie")
+ assert has_element?(view, "[data-testid=group-show-members-table]", "Brown")
end
test "member count updates automatically after add", %{conn: conn} do
@@ -152,11 +141,11 @@ defmodule MvWeb.GroupLive.ShowAddMemberTest do
# Add member
view
- |> element("button", "Add Member")
+ |> element("button[phx-click='show_add_member_input']")
|> render_click()
view
- |> element("#member-search-input")
+ |> element("[data-testid=group-show-member-search-input]")
|> render_focus()
# phx-change is on the form, so we need to trigger it via the form
@@ -169,7 +158,7 @@ defmodule MvWeb.GroupLive.ShowAddMemberTest do
|> render_click()
view
- |> element("button[phx-click='add_selected_members']")
+ |> element("[data-testid=group-show-add-selected-members-btn]")
|> render_click()
# Count should have increased
@@ -196,14 +185,14 @@ defmodule MvWeb.GroupLive.ShowAddMemberTest do
# Open inline input
view
- |> element("button", "Add Member")
+ |> element("button[phx-click='show_add_member_input']")
|> render_click()
- assert has_element?(view, "#member-search-input")
+ assert has_element?(view, "[data-testid=group-show-member-search-input]")
# Add member
view
- |> element("#member-search-input")
+ |> element("[data-testid=group-show-member-search-input]")
|> render_focus()
# phx-change is on the form, so we need to trigger it via the form
@@ -216,11 +205,10 @@ defmodule MvWeb.GroupLive.ShowAddMemberTest do
|> render_click()
view
- |> element("button[phx-click='add_selected_members']")
+ |> element("[data-testid=group-show-add-selected-members-btn]")
|> render_click()
- # Inline input should be closed (Add Member button should be visible again)
- refute has_element?(view, "#member-search-input")
+ refute has_element?(view, "[data-testid=group-show-member-search-input]")
end
test "Cancel button closes inline add member area without adding", %{conn: conn} do
@@ -229,7 +217,7 @@ defmodule MvWeb.GroupLive.ShowAddMemberTest do
{:ok, view, _html} = live(conn, "/groups/#{group.slug}")
open_add_member(view)
- assert has_element?(view, "#member-search-input")
+ assert has_element?(view, "[data-testid=group-show-member-search-input]")
assert has_element?(view, "button[phx-click='hide_add_member_input']")
cancel_add_member(view)
@@ -263,7 +251,7 @@ defmodule MvWeb.GroupLive.ShowAddMemberTest do
# Try to add same member again
view
- |> element("button", "Add Member")
+ |> element("button[phx-click='show_add_member_input']")
|> render_click()
# Member should not appear in search (filtered out)
@@ -281,12 +269,12 @@ defmodule MvWeb.GroupLive.ShowAddMemberTest do
|> render_click()
view
- |> element("button", "Add")
+ |> element("[data-testid=group-show-add-selected-members-btn]")
|> render_click()
- # Should show error
+ # OR-chain for i18n and alternate error wording (already in group / duplicate)
html = render(view)
- assert html =~ gettext("already in group") || html =~ ~r/already.*group|duplicate/i
+ assert html =~ gettext("already in group") or html =~ ~r/already.*group|duplicate/i
end
end
@@ -300,7 +288,7 @@ defmodule MvWeb.GroupLive.ShowAddMemberTest do
# Open inline input
view
- |> element("button", "Add Member")
+ |> element("button[phx-click='show_add_member_input']")
|> render_click()
# Try to add with invalid member ID (if possible)
@@ -331,11 +319,10 @@ defmodule MvWeb.GroupLive.ShowAddMemberTest do
# Open inline input
view
- |> element("button", "Add Member")
+ |> element("button[phx-click='show_add_member_input']")
|> render_click()
- # Inline input should be open
- assert has_element?(view, "#member-search-input")
+ assert has_element?(view, "[data-testid=group-show-member-search-input]")
# If error occurs, inline input should remain open
# (Implementation will handle this)
@@ -348,11 +335,10 @@ defmodule MvWeb.GroupLive.ShowAddMemberTest do
# Open inline input
view
- |> element("button", "Add Member")
+ |> element("button[phx-click='show_add_member_input']")
|> render_click()
- # Add button should be disabled
- assert has_element?(view, "button[phx-click='add_selected_members'][disabled]")
+ assert has_element?(view, "[data-testid=group-show-add-selected-members-btn][disabled]")
end
end
@@ -375,11 +361,11 @@ defmodule MvWeb.GroupLive.ShowAddMemberTest do
# Add member to empty group
view
- |> element("button", "Add Member")
+ |> element("button[phx-click='show_add_member_input']")
|> render_click()
view
- |> element("#member-search-input")
+ |> element("[data-testid=group-show-member-search-input]")
|> render_focus()
# phx-change is on the form, so we need to trigger it via the form
@@ -392,12 +378,10 @@ defmodule MvWeb.GroupLive.ShowAddMemberTest do
|> render_click()
view
- |> element("button[phx-click='add_selected_members']")
+ |> element("[data-testid=group-show-add-selected-members-btn]")
|> render_click()
- # Member should be added
- html = render(view)
- assert html =~ "Henry"
+ assert has_element?(view, "[data-testid=group-show-members-table]", "Henry")
end
test "add works when member is already in other groups", %{conn: conn} do
@@ -424,11 +408,11 @@ defmodule MvWeb.GroupLive.ShowAddMemberTest do
# Add same member to group2 (should work)
view
- |> element("button", "Add Member")
+ |> element("button[phx-click='show_add_member_input']")
|> render_click()
view
- |> element("#member-search-input")
+ |> element("[data-testid=group-show-member-search-input]")
|> render_focus()
# phx-change is on the form, so we need to trigger it via the form
@@ -441,12 +425,10 @@ defmodule MvWeb.GroupLive.ShowAddMemberTest do
|> render_click()
view
- |> element("button[phx-click='add_selected_members']")
+ |> element("[data-testid=group-show-add-selected-members-btn]")
|> render_click()
- # Member should be added to group2
- html = render(view)
- assert html =~ "Isabel"
+ assert has_element?(view, "[data-testid=group-show-members-table]", "Isabel")
end
end
diff --git a/test/mv_web/live/group_live/show_add_remove_members_test.exs b/test/mv_web/live/group_live/show_add_remove_members_test.exs
index c014372..047205d 100644
--- a/test/mv_web/live/group_live/show_add_remove_members_test.exs
+++ b/test/mv_web/live/group_live/show_add_remove_members_test.exs
@@ -22,18 +22,18 @@ defmodule MvWeb.GroupLive.ShowAddRemoveMembersTest do
test "Add Member button is visible for users with :update permission", %{conn: conn} do
group = Fixtures.group_fixture()
- {:ok, _view, html} = live(conn, "/groups/#{group.slug}")
+ {:ok, view, _html} = live(conn, "/groups/#{group.slug}")
- assert html =~ gettext("Add Member") or html =~ "Add Member"
+ assert has_element?(view, "button[phx-click='show_add_member_input']")
end
@tag role: :read_only
test "Add Member button is NOT visible for users without :update permission", %{conn: conn} do
group = Fixtures.group_fixture()
- {:ok, _view, html} = live(conn, "/groups/#{group.slug}")
+ {:ok, view, _html} = live(conn, "/groups/#{group.slug}")
- refute html =~ gettext("Add Member")
+ refute has_element?(view, "button[phx-click='show_add_member_input']")
end
test "Add Member button is positioned above member table", %{conn: conn} do
@@ -61,11 +61,7 @@ defmodule MvWeb.GroupLive.ShowAddRemoveMembersTest do
{:ok, view, _html} = live(conn, "/groups/#{group.slug}")
- # Remove button should exist (can be icon button with trash icon)
- html = render(view)
-
- assert html =~ "Remove" or html =~ "remove" or html =~ "trash" or
- html =~ ~r/hero-trash|hero-x-mark/
+ assert has_element?(view, "[data-testid=group-show-remove-member]")
end
@tag role: :read_only
@@ -78,10 +74,9 @@ defmodule MvWeb.GroupLive.ShowAddRemoveMembersTest do
actor: system_actor
)
- {:ok, _view, html} = live(conn, "/groups/#{group.slug}")
+ {:ok, view, _html} = live(conn, "/groups/#{group.slug}")
- # Remove button should NOT exist (check for trash icon or remove button specifically)
- refute html =~ "hero-trash" or html =~ ~r/