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