108 lines
3.5 KiB
Elixir
108 lines
3.5 KiB
Elixir
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
|