Membership Fee 6 - UI Components & LiveViews closes #280 #304

Open
moritz wants to merge 65 commits from feature/280_membership_fee_ui into main
4 changed files with 34 additions and 37 deletions
Showing only changes of commit 42fd8663aa - Show all commits

View file

@ -117,13 +117,13 @@ defmodule MvWeb.MembershipFeeTypeLive.FormTest do
{:ok, view, _html} = live(conn, "/membership_fee_types/#{fee_type.id}/edit")
# Change amount
html =
view
|> form("#membership-fee-type-form", %{"membership_fee_type[amount]" => "75.00"})
|> render_change()
view
|> form("#membership-fee-type-form", %{"membership_fee_type[amount]" => "75.00"})
|> render_change()
# Should show warning
assert html =~ "Warning" || html =~ "Warnung" || html =~ "affected"
# Should show warning in rendered view
html = render(view)
assert html =~ "affect" || html =~ "Change Amount"
end
test "amount change warning shows correct affected member count", %{conn: conn} do

View file

@ -133,9 +133,8 @@ defmodule MvWeb.MembershipFeeTypeLive.IndexTest do
|> render_click()
# Type should be deleted
assert_raise Ash.Error.Query.NotFound, fn ->
Ash.read_one!(MembershipFeeType |> Ash.Query.filter(id == ^fee_type.id))
end
assert {:error, %Ash.Error.Invalid{errors: [%Ash.Error.Query.NotFound{}]}} =
Ash.get(MembershipFeeType, fee_type.id, domain: Mv.MembershipFees)
end
end

View file

@ -93,15 +93,13 @@ defmodule MvWeb.MemberLive.FormMembershipFeeTypeTest do
member = create_member(%{membership_fee_type_id: yearly_type.id})
{:ok, view, _html} = live(conn, "/members/#{member.id}/edit")
{:ok, _view, html} = live(conn, "/members/#{member.id}/edit")
# Try to select monthly type (should show warning)
html =
view
|> form("form", %{"member[membership_fee_type_id]" => monthly_type.id})
|> render_change()
# Monthly type should not be in the dropdown (filtered by interval)
refute html =~ monthly_type.id
assert html =~ "Warning" || html =~ "Warnung" || html =~ "not allowed"
# Only yearly types should be available
assert html =~ yearly_type.id
end
test "warning cleared if same interval selected", %{conn: conn} do
@ -115,7 +113,7 @@ defmodule MvWeb.MemberLive.FormMembershipFeeTypeTest do
# Select another yearly type (should not show warning)
html =
view
|> form("form", %{"member[membership_fee_type_id]" => yearly_type2.id})
|> form("#member-form", %{"member[membership_fee_type_id]" => yearly_type2.id})
|> render_change()
refute html =~ "Warning" || html =~ "Warnung"
@ -135,7 +133,7 @@ defmodule MvWeb.MemberLive.FormMembershipFeeTypeTest do
{:error, {:live_redirect, %{to: _to}}} =
view
|> form("form", form_data)
|> form("#member-form", form_data)
|> render_submit()
# Verify member was created with fee type
@ -151,7 +149,9 @@ defmodule MvWeb.MemberLive.FormMembershipFeeTypeTest do
# Set default fee type in settings
fee_type = create_fee_type(%{interval: :yearly})
Mv.Membership.Setting
{:ok, settings} = Mv.Membership.get_settings()
settings
|> Ash.Changeset.for_update(:update_membership_fee_settings, %{
default_membership_fee_type_id: fee_type.id
})

View file

@ -118,9 +118,9 @@ defmodule MvWeb.MemberLive.IndexMembershipFeeStatusTest do
{:ok, view, _html} = live(conn, "/members")
# Toggle to current cycle
# Toggle to current cycle (use the button in the header, not the one in the column)
view
|> element("button[phx-click='toggle_current_cycle']")
|> element("button[phx-click='toggle_cycle_view'].btn-sm")
|> render_click()
html = render(view)
@ -179,11 +179,11 @@ defmodule MvWeb.MemberLive.IndexMembershipFeeStatusTest do
fee_type = create_fee_type(%{interval: :yearly})
# Member with unpaid last cycle
member1 = create_member(%{membership_fee_type_id: fee_type.id})
member1 = create_member(%{first_name: "UnpaidMember", membership_fee_type_id: fee_type.id})
create_cycle(member1, fee_type, %{cycle_start: ~D[2023-01-01], status: :unpaid})
# Member with paid last cycle
member2 = create_member(%{membership_fee_type_id: fee_type.id})
member2 = create_member(%{first_name: "PaidMember", membership_fee_type_id: fee_type.id})
create_cycle(member2, fee_type, %{cycle_start: ~D[2023-01-01], status: :paid})
# Verify cycles exist in database
@ -197,14 +197,13 @@ defmodule MvWeb.MemberLive.IndexMembershipFeeStatusTest do
|> Ash.Query.filter(member_id == ^member2.id)
|> Ash.read!()
assert length(cycles1) > 0
assert length(cycles2) > 0
refute Enum.empty?(cycles1)
refute Enum.empty?(cycles2)
{:ok, view, _html} = live(conn, "/members?membership_fee_filter=unpaid_last")
{:ok, _view, html} = live(conn, "/members?membership_fee_filter=unpaid_last")
html = render(view)
assert html =~ member1.first_name
refute html =~ member2.first_name
assert html =~ "UnpaidMember"
refute html =~ "PaidMember"
end
test "filter unpaid in current cycle works", %{conn: conn} do
@ -214,11 +213,11 @@ defmodule MvWeb.MemberLive.IndexMembershipFeeStatusTest do
current_year_start = %{today | month: 1, day: 1}
# Member with unpaid current cycle
member1 = create_member(%{membership_fee_type_id: fee_type.id})
member1 = create_member(%{first_name: "UnpaidCurrent", membership_fee_type_id: fee_type.id})
create_cycle(member1, fee_type, %{cycle_start: current_year_start, status: :unpaid})
# Member with paid current cycle
member2 = create_member(%{membership_fee_type_id: fee_type.id})
member2 = create_member(%{first_name: "PaidCurrent", membership_fee_type_id: fee_type.id})
create_cycle(member2, fee_type, %{cycle_start: current_year_start, status: :paid})
# Verify cycles exist in database
@ -232,14 +231,13 @@ defmodule MvWeb.MemberLive.IndexMembershipFeeStatusTest do
|> Ash.Query.filter(member_id == ^member2.id)
|> Ash.read!()
assert length(cycles1) > 0
assert length(cycles2) > 0
refute Enum.empty?(cycles1)
refute Enum.empty?(cycles2)
{:ok, view, _html} = live(conn, "/members?membership_fee_filter=unpaid_current")
{:ok, _view, html} = live(conn, "/members?membership_fee_filter=unpaid_current")
html = render(view)
assert html =~ member1.first_name
refute html =~ member2.first_name
assert html =~ "UnpaidCurrent"
refute html =~ "PaidCurrent"
end
end