defmodule Mv.Membership.MemberFieldVisibilityTest do @moduledoc """ Tests for member field visibility configuration. Tests cover: - Member fields are visible by default (show_in_overview: true) - Member fields can be hidden (show_in_overview: false) - Checking if a specific field is visible - Configuration is stored in Settings resource """ use Mv.DataCase, async: true alias Mv.Membership.Member describe "show_in_overview?/1" do test "returns true for all member fields by default" do # When no settings exist or member_field_visibility is not configured # Test with fields from constants member_fields = Mv.Constants.member_fields() Enum.each(member_fields, fn field -> assert Member.show_in_overview?(field) == true, "Field #{field} should be visible by default" end) end test "returns false for fields with show_in_overview: false in settings" do # Get or create settings {:ok, settings} = Mv.Membership.get_settings() # Use a field that exists in member fields member_fields = Mv.Constants.member_fields() field_to_hide = List.first(member_fields) field_to_show = List.last(member_fields) # Update settings to hide a field (use string keys for JSONB) {:ok, _updated_settings} = Mv.Membership.update_settings(settings, %{ member_field_visibility: %{Atom.to_string(field_to_hide) => false} }) # JSONB may convert atom keys to string keys, so we check via show_in_overview? instead assert Member.show_in_overview?(field_to_hide) == false assert Member.show_in_overview?(field_to_show) == true end test "returns true for non-configured fields (default)" do # Get or create settings {:ok, settings} = Mv.Membership.get_settings() # Use fields that exist in member fields member_fields = Mv.Constants.member_fields() fields_to_hide = Enum.take(member_fields, 2) fields_to_show = Enum.take(member_fields, -2) # Update settings to hide some fields (use string keys for JSONB) visibility_config = Enum.reduce(fields_to_hide, %{}, fn field, acc -> Map.put(acc, Atom.to_string(field), false) end) {:ok, _updated_settings} = Mv.Membership.update_settings(settings, %{ member_field_visibility: visibility_config }) # Hidden fields should be false Enum.each(fields_to_hide, fn field -> assert Member.show_in_overview?(field) == false, "Field #{field} should be hidden" end) # Unconfigured fields should still be true (default) Enum.each(fields_to_show, fn field -> assert Member.show_in_overview?(field) == true, "Field #{field} should be visible by default" end) end end end