fix: normalize checkbox value and improve UI layout

- Normalize checkbox 'on' value to boolean true in settings
- Change Payment Data layout to flex-nowrap for horizontal display
- Replace membership fee type dropdown with display-only view
- Fix tests to use correct button selectors and switch to membership fees tab
This commit is contained in:
Moritz 2025-12-16 12:32:04 +01:00
parent 3f723a3c3a
commit 803d9a0a94
Signed by: moritz
GPG key ID: 1020A035E5DD0824
10 changed files with 262 additions and 91 deletions

View file

@ -2,7 +2,9 @@ defmodule MvWeb.Helpers.MembershipFeeHelpersTest do
@moduledoc """
Tests for MembershipFeeHelpers module.
"""
use ExUnit.Case, async: true
use Mv.DataCase, async: true
require Ash.Query
alias MvWeb.Helpers.MembershipFeeHelpers
alias Mv.MembershipFees.CalendarCycles
@ -72,19 +74,33 @@ defmodule MvWeb.Helpers.MembershipFeeHelpersTest do
})
|> Ash.create!()
# Create member without fee type first to avoid auto-generation
member =
Mv.Membership.Member
|> Ash.Changeset.for_create(:create_member, %{
first_name: "Test",
last_name: "Member",
email: "test#{System.unique_integer([:positive])}@example.com",
membership_fee_type_id: fee_type.id,
join_date: ~D[2022-01-01]
})
|> Ash.create!()
# Create cycles
cycle_2022 =
# Assign fee type after member creation (this may generate cycles, but we'll create our own)
member =
member
|> Ash.Changeset.for_update(:update_member, %{membership_fee_type_id: fee_type.id})
|> Ash.update!()
# Delete any auto-generated cycles first
cycles =
Mv.MembershipFees.MembershipFeeCycle
|> Ash.Query.filter(member_id == ^member.id)
|> Ash.read!()
Enum.each(cycles, fn cycle -> Ash.destroy!(cycle) end)
# Create cycles manually
_cycle_2022 =
Mv.MembershipFees.MembershipFeeCycle
|> Ash.Changeset.for_create(:create, %{
cycle_start: ~D[2022-01-01],
@ -106,8 +122,15 @@ defmodule MvWeb.Helpers.MembershipFeeHelpersTest do
})
|> Ash.create!()
# Assuming we're in 2024, last completed should be 2023
last_cycle = MembershipFeeHelpers.get_last_completed_cycle(member, Date.utc_today())
# Load cycles with membership_fee_type relationship
member =
member
|> Ash.load!(membership_fee_cycles: [:membership_fee_type])
|> Ash.load!(:membership_fee_type)
# Use a fixed date in 2024 to ensure 2023 is last completed
today = ~D[2024-06-15]
last_cycle = MembershipFeeHelpers.get_last_completed_cycle(member, today)
assert last_cycle.id == cycle_2023.id
end
@ -122,16 +145,36 @@ defmodule MvWeb.Helpers.MembershipFeeHelpersTest do
})
|> Ash.create!()
# Create member without fee type first
member =
Mv.Membership.Member
|> Ash.Changeset.for_create(:create_member, %{
first_name: "Test",
last_name: "Member",
email: "test#{System.unique_integer([:positive])}@example.com",
membership_fee_type_id: fee_type.id
email: "test#{System.unique_integer([:positive])}@example.com"
})
|> Ash.create!()
# Assign fee type
member =
member
|> Ash.Changeset.for_update(:update_member, %{membership_fee_type_id: fee_type.id})
|> Ash.update!()
# Delete any auto-generated cycles
cycles =
Mv.MembershipFees.MembershipFeeCycle
|> Ash.Query.filter(member_id == ^member.id)
|> Ash.read!()
Enum.each(cycles, fn cycle -> Ash.destroy!(cycle) end)
# Load cycles and fee type (will be empty)
member =
member
|> Ash.load!(membership_fee_cycles: [:membership_fee_type])
|> Ash.load!(:membership_fee_type)
last_cycle = MembershipFeeHelpers.get_last_completed_cycle(member, Date.utc_today())
assert last_cycle == nil
end
@ -148,17 +191,31 @@ defmodule MvWeb.Helpers.MembershipFeeHelpersTest do
})
|> Ash.create!()
# Create member without fee type first
member =
Mv.Membership.Member
|> Ash.Changeset.for_create(:create_member, %{
first_name: "Test",
last_name: "Member",
email: "test#{System.unique_integer([:positive])}@example.com",
membership_fee_type_id: fee_type.id,
join_date: ~D[2023-01-01]
})
|> Ash.create!()
# Assign fee type
member =
member
|> Ash.Changeset.for_update(:update_member, %{membership_fee_type_id: fee_type.id})
|> Ash.update!()
# Delete any auto-generated cycles
cycles =
Mv.MembershipFees.MembershipFeeCycle
|> Ash.Query.filter(member_id == ^member.id)
|> Ash.read!()
Enum.each(cycles, fn cycle -> Ash.destroy!(cycle) end)
today = Date.utc_today()
current_year_start = %{today | month: 1, day: 1}
@ -173,6 +230,12 @@ defmodule MvWeb.Helpers.MembershipFeeHelpersTest do
})
|> Ash.create!()
# Load cycles with membership_fee_type relationship
member =
member
|> Ash.load!(membership_fee_cycles: [:membership_fee_type])
|> Ash.load!(:membership_fee_type)
result = MembershipFeeHelpers.get_current_cycle(member, today)
assert result.id == current_cycle.id
@ -181,9 +244,9 @@ defmodule MvWeb.Helpers.MembershipFeeHelpersTest do
describe "status_color/1" do
test "returns correct color classes for statuses" do
assert MembershipFeeHelpers.status_color(:paid) == "text-success"
assert MembershipFeeHelpers.status_color(:unpaid) == "text-error"
assert MembershipFeeHelpers.status_color(:suspended) == "text-base-content/60"
assert MembershipFeeHelpers.status_color(:paid) == "badge-success"
assert MembershipFeeHelpers.status_color(:unpaid) == "badge-error"
assert MembershipFeeHelpers.status_color(:suspended) == "badge-ghost"
end
end