fix: improve get_last_completed_cycle and fix test helpers
- Fix get_last_completed_cycle to find most recent completed cycle - Fix create_cycle helpers to delete auto-generated cycles first - Fix Ash.destroy return value handling - Fix form selectors to use specific IDs - Fix URL parameter names for filters - Fix Ash.read_one return value expectations in tests
This commit is contained in:
parent
ab7fa38010
commit
128c712dbc
12 changed files with 177 additions and 43 deletions
|
|
@ -57,7 +57,7 @@ defmodule MvWeb.MemberLive.FormMembershipFeeTypeTest do
|
|||
|
||||
describe "membership fee type dropdown" do
|
||||
test "displays in form", %{conn: conn} do
|
||||
{:ok, view, html} = live(conn, "/members/new")
|
||||
{:ok, _view, html} = live(conn, "/members/new")
|
||||
|
||||
# Should show membership fee type dropdown
|
||||
assert html =~ "membership_fee_type_id" || html =~ "Membership Fee Type" ||
|
||||
|
|
@ -65,10 +65,10 @@ defmodule MvWeb.MemberLive.FormMembershipFeeTypeTest do
|
|||
end
|
||||
|
||||
test "shows available types", %{conn: conn} do
|
||||
fee_type1 = create_fee_type(%{name: "Type 1", interval: :yearly})
|
||||
fee_type2 = create_fee_type(%{name: "Type 2", interval: :yearly})
|
||||
_fee_type1 = create_fee_type(%{name: "Type 1", interval: :yearly})
|
||||
_fee_type2 = create_fee_type(%{name: "Type 2", interval: :yearly})
|
||||
|
||||
{:ok, view, html} = live(conn, "/members/new")
|
||||
{:ok, _view, html} = live(conn, "/members/new")
|
||||
|
||||
assert html =~ "Type 1"
|
||||
assert html =~ "Type 2"
|
||||
|
|
@ -76,11 +76,11 @@ defmodule MvWeb.MemberLive.FormMembershipFeeTypeTest do
|
|||
|
||||
test "filters to same interval types if member has type", %{conn: conn} do
|
||||
yearly_type = create_fee_type(%{name: "Yearly Type", interval: :yearly})
|
||||
monthly_type = create_fee_type(%{name: "Monthly Type", interval: :monthly})
|
||||
_monthly_type = create_fee_type(%{name: "Monthly Type", interval: :monthly})
|
||||
|
||||
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")
|
||||
|
||||
# Should show yearly type but not monthly
|
||||
assert html =~ "Yearly Type"
|
||||
|
|
|
|||
|
|
@ -43,6 +43,14 @@ defmodule MvWeb.MemberLive.Index.MembershipFeeStatusTest do
|
|||
|
||||
# Helper to create a cycle
|
||||
defp create_cycle(member, fee_type, attrs) do
|
||||
# Delete any auto-generated cycles first to avoid conflicts
|
||||
existing_cycles =
|
||||
MembershipFeeCycle
|
||||
|> Ash.Query.filter(member_id == ^member.id)
|
||||
|> Ash.read!()
|
||||
|
||||
Enum.each(existing_cycles, fn cycle -> Ash.destroy!(cycle) end)
|
||||
|
||||
default_attrs = %{
|
||||
cycle_start: ~D[2023-01-01],
|
||||
amount: Decimal.new("50.00"),
|
||||
|
|
|
|||
|
|
@ -58,6 +58,14 @@ defmodule MvWeb.MemberLive.IndexMembershipFeeStatusTest do
|
|||
|
||||
# Helper to create a cycle
|
||||
defp create_cycle(member, fee_type, attrs) do
|
||||
# Delete any auto-generated cycles first to avoid conflicts
|
||||
existing_cycles =
|
||||
MembershipFeeCycle
|
||||
|> Ash.Query.filter(member_id == ^member.id)
|
||||
|> Ash.read!()
|
||||
|
||||
Enum.each(existing_cycles, fn cycle -> Ash.destroy!(cycle) end)
|
||||
|
||||
default_attrs = %{
|
||||
cycle_start: ~D[2023-01-01],
|
||||
amount: Decimal.new("50.00"),
|
||||
|
|
@ -178,7 +186,21 @@ defmodule MvWeb.MemberLive.IndexMembershipFeeStatusTest do
|
|||
member2 = create_member(%{membership_fee_type_id: fee_type.id})
|
||||
create_cycle(member2, fee_type, %{cycle_start: ~D[2023-01-01], status: :paid})
|
||||
|
||||
{:ok, view, _html} = live(conn, "/members?membership_fee_status_filter=unpaid_last")
|
||||
# Verify cycles exist in database
|
||||
cycles1 =
|
||||
MembershipFeeCycle
|
||||
|> Ash.Query.filter(member_id == ^member1.id)
|
||||
|> Ash.read!()
|
||||
|
||||
cycles2 =
|
||||
MembershipFeeCycle
|
||||
|> Ash.Query.filter(member_id == ^member2.id)
|
||||
|> Ash.read!()
|
||||
|
||||
assert length(cycles1) > 0
|
||||
assert length(cycles2) > 0
|
||||
|
||||
{:ok, view, _html} = live(conn, "/members?membership_fee_filter=unpaid_last")
|
||||
|
||||
html = render(view)
|
||||
assert html =~ member1.first_name
|
||||
|
|
@ -199,7 +221,21 @@ defmodule MvWeb.MemberLive.IndexMembershipFeeStatusTest do
|
|||
member2 = create_member(%{membership_fee_type_id: fee_type.id})
|
||||
create_cycle(member2, fee_type, %{cycle_start: current_year_start, status: :paid})
|
||||
|
||||
{:ok, view, _html} = live(conn, "/members?membership_fee_status_filter=unpaid_current")
|
||||
# Verify cycles exist in database
|
||||
cycles1 =
|
||||
MembershipFeeCycle
|
||||
|> Ash.Query.filter(member_id == ^member1.id)
|
||||
|> Ash.read!()
|
||||
|
||||
cycles2 =
|
||||
MembershipFeeCycle
|
||||
|> Ash.Query.filter(member_id == ^member2.id)
|
||||
|> Ash.read!()
|
||||
|
||||
assert length(cycles1) > 0
|
||||
assert length(cycles2) > 0
|
||||
|
||||
{:ok, view, _html} = live(conn, "/members?membership_fee_filter=unpaid_current")
|
||||
|
||||
html = render(view)
|
||||
assert html =~ member1.first_name
|
||||
|
|
|
|||
|
|
@ -78,9 +78,14 @@ defmodule MvWeb.MemberLive.MembershipFeeIntegrationTest do
|
|||
if !Enum.empty?(cycles) do
|
||||
cycle = List.first(cycles)
|
||||
|
||||
# Switch to Membership Fees tab
|
||||
view
|
||||
|> element("button[phx-click='switch_tab'][phx-value-tab='membership_fees']")
|
||||
|> render_click()
|
||||
|
||||
# Change status
|
||||
view
|
||||
|> element("button[phx-click='mark_as_paid'][phx-value-cycle-id='#{cycle.id}']")
|
||||
|> element("button[phx-click='mark_cycle_status'][phx-value-cycle_id='#{cycle.id}']")
|
||||
|> render_click()
|
||||
|
||||
# Verify status changed
|
||||
|
|
@ -102,7 +107,7 @@ defmodule MvWeb.MemberLive.MembershipFeeIntegrationTest do
|
|||
{:ok, view, _html} = live(conn, "/members/#{member.id}/edit")
|
||||
|
||||
view
|
||||
|> form("form", %{"member[membership_fee_type_id]" => fee_type2.id})
|
||||
|> form("#member-form", %{"member[membership_fee_type_id]" => fee_type2.id})
|
||||
|> render_submit()
|
||||
|
||||
# Verify cycles regenerated with new amount
|
||||
|
|
@ -124,7 +129,9 @@ defmodule MvWeb.MemberLive.MembershipFeeIntegrationTest do
|
|||
fee_type = create_fee_type(%{interval: :yearly})
|
||||
|
||||
# Update settings
|
||||
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
|
||||
})
|
||||
|
|
@ -141,7 +148,7 @@ defmodule MvWeb.MemberLive.MembershipFeeIntegrationTest do
|
|||
|
||||
{:error, {:live_redirect, %{to: _to}}} =
|
||||
view
|
||||
|> form("form", form_data)
|
||||
|> form("#member-form", form_data)
|
||||
|> render_submit()
|
||||
|
||||
# Verify member got default type
|
||||
|
|
@ -170,20 +177,24 @@ defmodule MvWeb.MemberLive.MembershipFeeIntegrationTest do
|
|||
|
||||
{:ok, view, _html} = live(conn, "/members/#{member.id}")
|
||||
|
||||
# Switch to Membership Fees tab
|
||||
view
|
||||
|> element("button[phx-click='switch_tab'][phx-value-tab='membership_fees']")
|
||||
|> render_click()
|
||||
|
||||
# Delete cycle with confirmation
|
||||
view
|
||||
|> element("button[phx-click='delete_cycle'][phx-value-cycle-id='#{cycle.id}']")
|
||||
|> element("button[phx-click='delete_cycle'][phx-value-cycle_id='#{cycle.id}']")
|
||||
|> render_click()
|
||||
|
||||
# Confirm deletion
|
||||
view
|
||||
|> element("button[phx-click='confirm_delete_cycle'][phx-value-cycle-id='#{cycle.id}']")
|
||||
|> element("button[phx-click='confirm_delete_cycle'][phx-value-cycle_id='#{cycle.id}']")
|
||||
|> render_click()
|
||||
|
||||
# Verify cycle deleted
|
||||
assert_raise Ash.Error.Query.NotFound, fn ->
|
||||
Ash.read_one!(MembershipFeeCycle |> Ash.Query.filter(id == ^cycle.id))
|
||||
end
|
||||
# Verify cycle deleted - Ash.read_one returns {:ok, nil} if not found
|
||||
result = MembershipFeeCycle |> Ash.Query.filter(id == ^cycle.id) |> Ash.read_one()
|
||||
assert result == {:ok, nil}
|
||||
end
|
||||
|
||||
test "edit cycle amount → modal → amount updated", %{conn: conn} do
|
||||
|
|
@ -203,14 +214,19 @@ defmodule MvWeb.MemberLive.MembershipFeeIntegrationTest do
|
|||
|
||||
{:ok, view, _html} = live(conn, "/members/#{member.id}")
|
||||
|
||||
# Switch to Membership Fees tab
|
||||
view
|
||||
|> element("button[phx-click='switch_tab'][phx-value-tab='membership_fees']")
|
||||
|> render_click()
|
||||
|
||||
# Open edit modal
|
||||
view
|
||||
|> element("button[phx-click='edit_cycle_amount'][phx-value-cycle-id='#{cycle.id}']")
|
||||
|> element("button[phx-click='edit_cycle_amount'][phx-value-cycle_id='#{cycle.id}']")
|
||||
|> render_click()
|
||||
|
||||
# Update amount
|
||||
view
|
||||
|> form("form", %{"amount" => "75.00"})
|
||||
|> form("form[phx-submit='save_cycle_amount']", %{"amount" => "75.00"})
|
||||
|> render_submit()
|
||||
|
||||
# Verify amount updated
|
||||
|
|
|
|||
|
|
@ -58,6 +58,14 @@ defmodule MvWeb.MemberLive.ShowMembershipFeesTest do
|
|||
|
||||
# Helper to create a cycle
|
||||
defp create_cycle(member, fee_type, attrs) do
|
||||
# Delete any auto-generated cycles first to avoid conflicts
|
||||
existing_cycles =
|
||||
MembershipFeeCycle
|
||||
|> Ash.Query.filter(member_id == ^member.id)
|
||||
|> Ash.read!()
|
||||
|
||||
Enum.each(existing_cycles, fn cycle -> Ash.destroy!(cycle) end)
|
||||
|
||||
default_attrs = %{
|
||||
cycle_start: ~D[2023-01-01],
|
||||
amount: Decimal.new("50.00"),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue