test: add comprehensive tests for membership fee UI components
Add tests for all membership fee UI components following TDD principles:
This commit is contained in:
parent
bc989422e2
commit
5789079ab0
9 changed files with 1695 additions and 0 deletions
197
test/mv_web/helpers/membership_fee_helpers_test.exs
Normal file
197
test/mv_web/helpers/membership_fee_helpers_test.exs
Normal file
|
|
@ -0,0 +1,197 @@
|
|||
defmodule MvWeb.Helpers.MembershipFeeHelpersTest do
|
||||
@moduledoc """
|
||||
Tests for MembershipFeeHelpers module.
|
||||
"""
|
||||
use ExUnit.Case, async: true
|
||||
|
||||
alias MvWeb.Helpers.MembershipFeeHelpers
|
||||
alias Mv.MembershipFees.CalendarCycles
|
||||
|
||||
describe "format_currency/1" do
|
||||
test "formats decimal amount correctly" do
|
||||
assert MembershipFeeHelpers.format_currency(Decimal.new("60.00")) == "60,00 €"
|
||||
assert MembershipFeeHelpers.format_currency(Decimal.new("5.5")) == "5,50 €"
|
||||
assert MembershipFeeHelpers.format_currency(Decimal.new("100")) == "100,00 €"
|
||||
assert MembershipFeeHelpers.format_currency(Decimal.new("0.99")) == "0,99 €"
|
||||
end
|
||||
end
|
||||
|
||||
describe "format_interval/1" do
|
||||
test "formats all interval types correctly" do
|
||||
assert MembershipFeeHelpers.format_interval(:monthly) == "Monthly"
|
||||
assert MembershipFeeHelpers.format_interval(:quarterly) == "Quarterly"
|
||||
assert MembershipFeeHelpers.format_interval(:half_yearly) == "Half-yearly"
|
||||
assert MembershipFeeHelpers.format_interval(:yearly) == "Yearly"
|
||||
end
|
||||
end
|
||||
|
||||
describe "format_cycle_range/2" do
|
||||
test "formats yearly cycle range correctly" do
|
||||
cycle_start = ~D[2024-01-01]
|
||||
interval = :yearly
|
||||
cycle_end = CalendarCycles.calculate_cycle_end(cycle_start, interval)
|
||||
|
||||
result = MembershipFeeHelpers.format_cycle_range(cycle_start, interval)
|
||||
assert result =~ "2024"
|
||||
assert result =~ "01.01"
|
||||
assert result =~ "31.12"
|
||||
end
|
||||
|
||||
test "formats quarterly cycle range correctly" do
|
||||
cycle_start = ~D[2024-01-01]
|
||||
interval = :quarterly
|
||||
cycle_end = CalendarCycles.calculate_cycle_end(cycle_start, interval)
|
||||
|
||||
result = MembershipFeeHelpers.format_cycle_range(cycle_start, interval)
|
||||
assert result =~ "2024"
|
||||
assert result =~ "01.01"
|
||||
assert result =~ "31.03"
|
||||
end
|
||||
|
||||
test "formats monthly cycle range correctly" do
|
||||
cycle_start = ~D[2024-03-01]
|
||||
interval = :monthly
|
||||
cycle_end = CalendarCycles.calculate_cycle_end(cycle_start, interval)
|
||||
|
||||
result = MembershipFeeHelpers.format_cycle_range(cycle_start, interval)
|
||||
assert result =~ "2024"
|
||||
assert result =~ "01.03"
|
||||
assert result =~ "31.03"
|
||||
end
|
||||
end
|
||||
|
||||
describe "get_last_completed_cycle/2" do
|
||||
test "returns last completed cycle for member" do
|
||||
# Create test data
|
||||
fee_type =
|
||||
Mv.MembershipFees.MembershipFeeType
|
||||
|> Ash.Changeset.for_create(:create, %{
|
||||
name: "Test Type",
|
||||
amount: Decimal.new("50.00"),
|
||||
interval: :yearly
|
||||
})
|
||||
|> Ash.create!()
|
||||
|
||||
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 =
|
||||
Mv.MembershipFees.MembershipFeeCycle
|
||||
|> Ash.Changeset.for_create(:create, %{
|
||||
cycle_start: ~D[2022-01-01],
|
||||
amount: Decimal.new("50.00"),
|
||||
member_id: member.id,
|
||||
membership_fee_type_id: fee_type.id,
|
||||
status: :paid
|
||||
})
|
||||
|> Ash.create!()
|
||||
|
||||
cycle_2023 =
|
||||
Mv.MembershipFees.MembershipFeeCycle
|
||||
|> Ash.Changeset.for_create(:create, %{
|
||||
cycle_start: ~D[2023-01-01],
|
||||
amount: Decimal.new("50.00"),
|
||||
member_id: member.id,
|
||||
membership_fee_type_id: fee_type.id,
|
||||
status: :paid
|
||||
})
|
||||
|> Ash.create!()
|
||||
|
||||
# Assuming we're in 2024, last completed should be 2023
|
||||
last_cycle = MembershipFeeHelpers.get_last_completed_cycle(member, Date.utc_today())
|
||||
|
||||
assert last_cycle.id == cycle_2023.id
|
||||
end
|
||||
|
||||
test "returns nil if no cycles exist" do
|
||||
fee_type =
|
||||
Mv.MembershipFees.MembershipFeeType
|
||||
|> Ash.Changeset.for_create(:create, %{
|
||||
name: "Test Type",
|
||||
amount: Decimal.new("50.00"),
|
||||
interval: :yearly
|
||||
})
|
||||
|> Ash.create!()
|
||||
|
||||
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
|
||||
})
|
||||
|> Ash.create!()
|
||||
|
||||
last_cycle = MembershipFeeHelpers.get_last_completed_cycle(member, Date.utc_today())
|
||||
assert last_cycle == nil
|
||||
end
|
||||
end
|
||||
|
||||
describe "get_current_cycle/2" do
|
||||
test "returns current cycle for member" do
|
||||
fee_type =
|
||||
Mv.MembershipFees.MembershipFeeType
|
||||
|> Ash.Changeset.for_create(:create, %{
|
||||
name: "Test Type",
|
||||
amount: Decimal.new("50.00"),
|
||||
interval: :yearly
|
||||
})
|
||||
|> Ash.create!()
|
||||
|
||||
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!()
|
||||
|
||||
today = Date.utc_today()
|
||||
current_year_start = %{today | month: 1, day: 1}
|
||||
|
||||
current_cycle =
|
||||
Mv.MembershipFees.MembershipFeeCycle
|
||||
|> Ash.Changeset.for_create(:create, %{
|
||||
cycle_start: current_year_start,
|
||||
amount: Decimal.new("50.00"),
|
||||
member_id: member.id,
|
||||
membership_fee_type_id: fee_type.id,
|
||||
status: :unpaid
|
||||
})
|
||||
|> Ash.create!()
|
||||
|
||||
result = MembershipFeeHelpers.get_current_cycle(member, today)
|
||||
|
||||
assert result.id == current_cycle.id
|
||||
end
|
||||
end
|
||||
|
||||
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"
|
||||
end
|
||||
end
|
||||
|
||||
describe "status_icon/1" do
|
||||
test "returns correct icon names for statuses" do
|
||||
assert MembershipFeeHelpers.status_icon(:paid) == "hero-check-circle"
|
||||
assert MembershipFeeHelpers.status_icon(:unpaid) == "hero-x-circle"
|
||||
assert MembershipFeeHelpers.status_icon(:suspended) == "hero-pause-circle"
|
||||
end
|
||||
end
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue