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") {:ok, view, _html} = live(conn, "/membership_fee_types/#{fee_type.id}/edit")
# Change amount # Change amount
html = view
view |> form("#membership-fee-type-form", %{"membership_fee_type[amount]" => "75.00"})
|> form("#membership-fee-type-form", %{"membership_fee_type[amount]" => "75.00"}) |> render_change()
|> render_change()
# Should show warning # Should show warning in rendered view
assert html =~ "Warning" || html =~ "Warnung" || html =~ "affected" html = render(view)
assert html =~ "affect" || html =~ "Change Amount"
end end
test "amount change warning shows correct affected member count", %{conn: conn} do 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() |> render_click()
# Type should be deleted # Type should be deleted
assert_raise Ash.Error.Query.NotFound, fn -> assert {:error, %Ash.Error.Invalid{errors: [%Ash.Error.Query.NotFound{}]}} =
Ash.read_one!(MembershipFeeType |> Ash.Query.filter(id == ^fee_type.id)) Ash.get(MembershipFeeType, fee_type.id, domain: Mv.MembershipFees)
end
end end
end end

View file

@ -93,15 +93,13 @@ defmodule MvWeb.MemberLive.FormMembershipFeeTypeTest do
member = create_member(%{membership_fee_type_id: yearly_type.id}) 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) # Monthly type should not be in the dropdown (filtered by interval)
html = refute html =~ monthly_type.id
view
|> form("form", %{"member[membership_fee_type_id]" => monthly_type.id})
|> render_change()
assert html =~ "Warning" || html =~ "Warnung" || html =~ "not allowed" # Only yearly types should be available
assert html =~ yearly_type.id
end end
test "warning cleared if same interval selected", %{conn: conn} do 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) # Select another yearly type (should not show warning)
html = html =
view view
|> form("form", %{"member[membership_fee_type_id]" => yearly_type2.id}) |> form("#member-form", %{"member[membership_fee_type_id]" => yearly_type2.id})
|> render_change() |> render_change()
refute html =~ "Warning" || html =~ "Warnung" refute html =~ "Warning" || html =~ "Warnung"
@ -135,7 +133,7 @@ defmodule MvWeb.MemberLive.FormMembershipFeeTypeTest do
{:error, {:live_redirect, %{to: _to}}} = {:error, {:live_redirect, %{to: _to}}} =
view view
|> form("form", form_data) |> form("#member-form", form_data)
|> render_submit() |> render_submit()
# Verify member was created with fee type # Verify member was created with fee type
@ -151,7 +149,9 @@ defmodule MvWeb.MemberLive.FormMembershipFeeTypeTest do
# Set default fee type in settings # Set default fee type in settings
fee_type = create_fee_type(%{interval: :yearly}) 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, %{ |> Ash.Changeset.for_update(:update_membership_fee_settings, %{
default_membership_fee_type_id: fee_type.id 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") {: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 view
|> element("button[phx-click='toggle_current_cycle']") |> element("button[phx-click='toggle_cycle_view'].btn-sm")
|> render_click() |> render_click()
html = render(view) html = render(view)
@ -179,11 +179,11 @@ defmodule MvWeb.MemberLive.IndexMembershipFeeStatusTest do
fee_type = create_fee_type(%{interval: :yearly}) fee_type = create_fee_type(%{interval: :yearly})
# Member with unpaid last cycle # 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}) create_cycle(member1, fee_type, %{cycle_start: ~D[2023-01-01], status: :unpaid})
# Member with paid last cycle # 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}) create_cycle(member2, fee_type, %{cycle_start: ~D[2023-01-01], status: :paid})
# Verify cycles exist in database # Verify cycles exist in database
@ -197,14 +197,13 @@ defmodule MvWeb.MemberLive.IndexMembershipFeeStatusTest do
|> Ash.Query.filter(member_id == ^member2.id) |> Ash.Query.filter(member_id == ^member2.id)
|> Ash.read!() |> Ash.read!()
assert length(cycles1) > 0 refute Enum.empty?(cycles1)
assert length(cycles2) > 0 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 =~ "UnpaidMember"
assert html =~ member1.first_name refute html =~ "PaidMember"
refute html =~ member2.first_name
end end
test "filter unpaid in current cycle works", %{conn: conn} do 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} current_year_start = %{today | month: 1, day: 1}
# Member with unpaid current cycle # 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}) create_cycle(member1, fee_type, %{cycle_start: current_year_start, status: :unpaid})
# Member with paid current cycle # 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}) create_cycle(member2, fee_type, %{cycle_start: current_year_start, status: :paid})
# Verify cycles exist in database # Verify cycles exist in database
@ -232,14 +231,13 @@ defmodule MvWeb.MemberLive.IndexMembershipFeeStatusTest do
|> Ash.Query.filter(member_id == ^member2.id) |> Ash.Query.filter(member_id == ^member2.id)
|> Ash.read!() |> Ash.read!()
assert length(cycles1) > 0 refute Enum.empty?(cycles1)
assert length(cycles2) > 0 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 =~ "UnpaidCurrent"
assert html =~ member1.first_name refute html =~ "PaidCurrent"
refute html =~ member2.first_name
end end
end end