mitgliederverwaltung/test/membership/membership_fee_settings_test.exs
Moritz da1fd3da73 feat: implement full CRUD for membership fee types with settings UI
- 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)
2025-12-12 17:52:52 +01:00

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