feat(member): deactivate and reactivate members via an exit-date dialog

This commit is contained in:
Moritz 2026-06-08 12:17:02 +02:00
parent bcab2e21c4
commit 3dc3a2b8ef
6 changed files with 1735 additions and 1326 deletions

View file

@ -0,0 +1,108 @@
defmodule MvWeb.MemberLive.DeactivateTest do
@moduledoc """
Tests for the member deactivate/reactivate sub-flow on the member show page,
driven through the parent LiveView (the DeactivateComponent is stateful).
"""
use MvWeb.ConnCase, async: true
import Phoenix.LiveViewTest
use Gettext, backend: MvWeb.Gettext
alias Mv.Fixtures
defp reload_member(member) do
Ash.get!(Mv.Membership.Member, member.id, actor: Mv.Helpers.SystemActor.get_system_actor())
end
describe "deactivate/reactivate control visibility (§1.6, §1.8)" do
@tag role: :admin
test "shows Deactivate and hides Reactivate when member has no exit_date", %{conn: conn} do
member = Fixtures.member_fixture()
{:ok, view, _html} = live(conn, ~p"/members/#{member.id}")
assert has_element?(view, "[data-testid=member-deactivate]")
refute has_element?(view, "[data-testid=member-reactivate]")
end
@tag role: :admin
test "shows Reactivate and hides Deactivate when member has an exit_date", %{conn: conn} do
member = Fixtures.member_fixture(%{exit_date: Date.utc_today()})
{:ok, view, _html} = live(conn, ~p"/members/#{member.id}")
assert has_element?(view, "[data-testid=member-reactivate]")
refute has_element?(view, "[data-testid=member-deactivate]")
end
@tag role: :read_only
test "hides the deactivate/reactivate control for a user without :update permission", %{
conn: conn
} do
member = Fixtures.member_fixture()
{:ok, view, _html} = live(conn, ~p"/members/#{member.id}")
refute has_element?(view, "[data-testid=member-deactivate]")
refute has_element?(view, "[data-testid=member-reactivate]")
end
end
describe "deactivate modal (§1.3)" do
@tag role: :admin
test "opening the deactivate modal prefills the date input with today", %{conn: conn} do
member = Fixtures.member_fixture()
{:ok, view, _html} = live(conn, ~p"/members/#{member.id}")
view
|> element("[data-testid=member-deactivate]")
|> render_click()
assert has_element?(
view,
~s(#deactivate-exit-date[value="#{Date.to_iso8601(Date.utc_today())}"])
)
end
end
describe "submitting the deactivate modal (§1.2)" do
@tag role: :admin
test "submitting the deactivate modal with a future date sets exit_date", %{conn: conn} do
member = Fixtures.member_fixture(%{join_date: Date.utc_today()})
future_date = Date.add(Date.utc_today(), 30)
{:ok, view, _html} = live(conn, ~p"/members/#{member.id}")
view
|> element("[data-testid=member-deactivate]")
|> render_click()
view
|> element("#deactivate-member-modal form")
|> render_submit(%{"exit_date" => Date.to_iso8601(future_date)})
assert reload_member(member).exit_date == future_date
# UI flips to offering Reactivate
assert has_element?(view, "[data-testid=member-reactivate]")
end
end
describe "reactivate (§1.7)" do
@tag role: :admin
test "reactivating a member clears exit_date", %{conn: conn} do
member = Fixtures.member_fixture(%{exit_date: Date.utc_today()})
{:ok, view, _html} = live(conn, ~p"/members/#{member.id}")
view
|> element("[data-testid=member-reactivate]")
|> render_click()
assert reload_member(member).exit_date == nil
# UI flips back to offering Deactivate
assert has_element?(view, "[data-testid=member-deactivate]")
end
end
end