From 824a8f7476592a2dcd60cc8bab7aee546ba71460 Mon Sep 17 00:00:00 2001 From: Moritz Date: Tue, 5 Aug 2025 17:38:47 +0200 Subject: [PATCH] fix: member.email calculation --- lib/membership/member_email_calculation.ex | 14 +++- test/membership/member_email_test.exs | 74 ++++++++++++++++++---- 2 files changed, 71 insertions(+), 17 deletions(-) diff --git a/lib/membership/member_email_calculation.ex b/lib/membership/member_email_calculation.ex index 1554a6d..0f577d2 100644 --- a/lib/membership/member_email_calculation.ex +++ b/lib/membership/member_email_calculation.ex @@ -11,9 +11,17 @@ defmodule Mv.Membership.MemberEmailCalculation do def calculate(records, _opts, _context) do Enum.map(records, fn record -> case record.user do - %{email: user_email} when is_binary(user_email) -> user_email - _ -> record.member_email + %{email: user_email} -> + # Convert Ash.CiString to string if needed + if is_struct(user_email, Ash.CiString) do + to_string(user_email) + else + user_email + end + + _ -> + record.member_email end end) end -end \ No newline at end of file +end diff --git a/test/membership/member_email_test.exs b/test/membership/member_email_test.exs index bb8c1f8..3a37eff 100644 --- a/test/membership/member_email_test.exs +++ b/test/membership/member_email_test.exs @@ -6,14 +6,12 @@ defmodule Mv.Membership.MemberEmailTest do test "email shows member_email when no user is assigned" do {:ok, member} = Membership.create_member(%{ - first_name: "Test", - last_name: "Member", member_email: "memberonly@example.com" }) # Load the email calculation member = Ash.load!(member, :email, domain: Membership) - + assert member.member_email == "memberonly@example.com" assert member.email == "memberonly@example.com" end @@ -21,8 +19,6 @@ defmodule Mv.Membership.MemberEmailTest do test "updating member_email updates the computed email when no user is assigned" do {:ok, member} = Membership.create_member(%{ - first_name: "Update", - last_name: "Test", member_email: "old@example.com" }) @@ -31,23 +27,73 @@ defmodule Mv.Membership.MemberEmailTest do # Load the email calculation member = Ash.load!(member, :email, domain: Membership) - + assert member.member_email == "new@example.com" assert member.email == "new@example.com" end test "member can be created without member_email" do {:ok, member} = - Membership.create_member(%{ - first_name: "No", - last_name: "Email" - }) + Membership.create_member(%{}) + + # Load the email calculation with user relationship + member = Ash.load!(member, [:email, user: [:email]], domain: Membership) - # Load the email calculation - member = Ash.load!(member, :email, domain: Membership) - assert member.member_email == nil assert member.email == nil end + + test "email shows user.email when user is assigned" do + # Create a member first + {:ok, member} = + Membership.create_member(%{ + member_email: "member@example.com" + }) + + # Create a user and assign it to the member + {:ok, _user} = + Mv.Accounts.create_user(%{ + email: "user@example.com", + member_id: member.id + }) + + # Load the email calculation with user relationship + member = Ash.load!(member, [:email, user: [:email]], domain: Membership) + + assert member.member_email == "member@example.com" + # Should show user email + assert member.email == "user@example.com" + end + + test "email updates when user email changes" do + # Create a member + {:ok, member} = + Membership.create_member(%{ + member_email: "member@example.com" + }) + + # Create a user + {:ok, user} = + Mv.Accounts.create_user(%{ + email: "old@example.com", + member_id: member.id + }) + + # Load the email calculation initially + member = Ash.load!(member, [:email, user: [:email]], domain: Membership) + assert member.email == "old@example.com" + + # Update user email + {:ok, _updated_user} = + Mv.Accounts.update_user(user, %{ + email: "new@example.com" + }) + + # Reload member and check email calculation + member = Ash.reload!(member, domain: Membership) + member = Ash.load!(member, [:email, user: [:email]], domain: Membership) + + assert member.email == "new@example.com" + end end -end +end