diff --git a/test/membership/member_field_visibility_test.exs b/test/membership/member_field_visibility_test.exs index 6bc04f6..47ab5bd 100644 --- a/test/membership/member_field_visibility_test.exs +++ b/test/membership/member_field_visibility_test.exs @@ -80,4 +80,72 @@ defmodule Mv.Membership.MemberFieldVisibilityTest do end) end end + + describe "update_single_member_field_visibility/3" do + test "atomically updates a single field in member_field_visibility" do + {:ok, settings} = Mv.Membership.get_settings() + field_string = "street" + + # Update single field + {:ok, updated_settings} = + Mv.Membership.update_single_member_field_visibility( + settings, + field: field_string, + show_in_overview: false + ) + + # Verify the field was updated + assert updated_settings.member_field_visibility[field_string] == false + + # Verify other fields are not affected + other_fields = + Mv.Constants.member_fields() + |> Enum.reject(&(&1 == String.to_existing_atom(field_string))) + + Enum.each(other_fields, fn field -> + field_string = Atom.to_string(field) + # Fields not explicitly set should default to true (except exit_date) + expected = if field == :exit_date, do: false, else: true + + assert Map.get(updated_settings.member_field_visibility, field_string, expected) == + expected + end) + end + + test "returns error for invalid field name" do + {:ok, settings} = Mv.Membership.get_settings() + + assert {:error, %Ash.Error.Invalid{errors: [%{field: :member_field_visibility}]}} = + Mv.Membership.update_single_member_field_visibility( + settings, + field: "invalid_field", + show_in_overview: false + ) + end + + test "handles concurrent updates atomically" do + {:ok, settings} = Mv.Membership.get_settings() + field1 = "street" + field2 = "house_number" + + # Simulate concurrent updates by updating different fields + {:ok, updated1} = + Mv.Membership.update_single_member_field_visibility( + settings, + field: field1, + show_in_overview: false + ) + + {:ok, updated2} = + Mv.Membership.update_single_member_field_visibility( + updated1, + field: field2, + show_in_overview: true + ) + + # Both fields should be correctly updated + assert updated2.member_field_visibility[field1] == false + assert updated2.member_field_visibility[field2] == true + end + end end