- Add interval immutability and deletion prevention validations - Add settings validation for default_membership_fee_type_id - Create MembershipFeeSettingsLive for admin UI with form handling - Add comprehensive test coverage (unit, integration, settings)
99 lines
2.9 KiB
Elixir
99 lines
2.9 KiB
Elixir
defmodule Mv.Membership.MembershipFeeSettingsTest do
|
|
@moduledoc """
|
|
Tests for membership fee settings in the Settings resource.
|
|
"""
|
|
use Mv.DataCase, async: true
|
|
|
|
alias Mv.Membership.Setting
|
|
alias Mv.MembershipFees.MembershipFeeType
|
|
|
|
describe "membership fee settings" do
|
|
test "default values are correct" do
|
|
{:ok, settings} = Mv.Membership.get_settings()
|
|
assert settings.include_joining_cycle == true
|
|
end
|
|
|
|
test "settings can be read" do
|
|
{:ok, settings} = Mv.Membership.get_settings()
|
|
assert %Setting{} = settings
|
|
end
|
|
|
|
test "settings can be written via update_membership_fee_settings" do
|
|
{:ok, settings} = Mv.Membership.get_settings()
|
|
|
|
{:ok, updated} =
|
|
settings
|
|
|> Ash.Changeset.for_update(:update_membership_fee_settings, %{
|
|
include_joining_cycle: false
|
|
})
|
|
|> Ash.update()
|
|
|
|
assert updated.include_joining_cycle == false
|
|
end
|
|
|
|
test "default_membership_fee_type_id can be nil (optional)" do
|
|
{:ok, settings} = Mv.Membership.get_settings()
|
|
|
|
{:ok, updated} =
|
|
settings
|
|
|> Ash.Changeset.for_update(:update_membership_fee_settings, %{
|
|
default_membership_fee_type_id: nil
|
|
})
|
|
|> Ash.update()
|
|
|
|
assert updated.default_membership_fee_type_id == nil
|
|
end
|
|
|
|
test "default_membership_fee_type_id validation: must exist if set" do
|
|
{:ok, settings} = Mv.Membership.get_settings()
|
|
|
|
# Create a valid fee type
|
|
{:ok, fee_type} =
|
|
Ash.create(MembershipFeeType, %{
|
|
name: "Test Fee Type #{System.unique_integer([:positive])}",
|
|
amount: Decimal.new("100.00"),
|
|
interval: :yearly
|
|
})
|
|
|
|
# Setting a valid fee type should work
|
|
{:ok, updated} =
|
|
settings
|
|
|> Ash.Changeset.for_update(:update_membership_fee_settings, %{
|
|
default_membership_fee_type_id: fee_type.id
|
|
})
|
|
|> Ash.update()
|
|
|
|
assert updated.default_membership_fee_type_id == fee_type.id
|
|
end
|
|
|
|
test "default_membership_fee_type_id validation: fails if not found" do
|
|
{:ok, settings} = Mv.Membership.get_settings()
|
|
|
|
# Use a non-existent UUID
|
|
fake_uuid = Ecto.UUID.generate()
|
|
|
|
assert {:error, error} =
|
|
settings
|
|
|> Ash.Changeset.for_update(:update_membership_fee_settings, %{
|
|
default_membership_fee_type_id: fake_uuid
|
|
})
|
|
|> Ash.update()
|
|
|
|
assert error_on_field?(error, :default_membership_fee_type_id)
|
|
end
|
|
end
|
|
|
|
# Helper to check if an error occurred on a specific field
|
|
defp error_on_field?(%Ash.Error.Invalid{} = error, field) do
|
|
Enum.any?(error.errors, fn e ->
|
|
case e do
|
|
%{field: ^field} -> true
|
|
%{fields: fields} when is_list(fields) -> field in fields
|
|
_ -> false
|
|
end
|
|
end)
|
|
end
|
|
|
|
defp error_on_field?(_, _), do: false
|
|
end
|
|
|