This commit is contained in:
parent
2f140e8f10
commit
824a8f7476
2 changed files with 71 additions and 17 deletions
|
|
@ -11,9 +11,17 @@ defmodule Mv.Membership.MemberEmailCalculation do
|
||||||
def calculate(records, _opts, _context) do
|
def calculate(records, _opts, _context) do
|
||||||
Enum.map(records, fn record ->
|
Enum.map(records, fn record ->
|
||||||
case record.user do
|
case record.user do
|
||||||
%{email: user_email} when is_binary(user_email) -> user_email
|
%{email: user_email} ->
|
||||||
_ -> record.member_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)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -6,14 +6,12 @@ defmodule Mv.Membership.MemberEmailTest do
|
||||||
test "email shows member_email when no user is assigned" do
|
test "email shows member_email when no user is assigned" do
|
||||||
{:ok, member} =
|
{:ok, member} =
|
||||||
Membership.create_member(%{
|
Membership.create_member(%{
|
||||||
first_name: "Test",
|
|
||||||
last_name: "Member",
|
|
||||||
member_email: "memberonly@example.com"
|
member_email: "memberonly@example.com"
|
||||||
})
|
})
|
||||||
|
|
||||||
# Load the email calculation
|
# Load the email calculation
|
||||||
member = Ash.load!(member, :email, domain: Membership)
|
member = Ash.load!(member, :email, domain: Membership)
|
||||||
|
|
||||||
assert member.member_email == "memberonly@example.com"
|
assert member.member_email == "memberonly@example.com"
|
||||||
assert member.email == "memberonly@example.com"
|
assert member.email == "memberonly@example.com"
|
||||||
end
|
end
|
||||||
|
|
@ -21,8 +19,6 @@ defmodule Mv.Membership.MemberEmailTest do
|
||||||
test "updating member_email updates the computed email when no user is assigned" do
|
test "updating member_email updates the computed email when no user is assigned" do
|
||||||
{:ok, member} =
|
{:ok, member} =
|
||||||
Membership.create_member(%{
|
Membership.create_member(%{
|
||||||
first_name: "Update",
|
|
||||||
last_name: "Test",
|
|
||||||
member_email: "old@example.com"
|
member_email: "old@example.com"
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
@ -31,23 +27,73 @@ defmodule Mv.Membership.MemberEmailTest do
|
||||||
|
|
||||||
# Load the email calculation
|
# Load the email calculation
|
||||||
member = Ash.load!(member, :email, domain: Membership)
|
member = Ash.load!(member, :email, domain: Membership)
|
||||||
|
|
||||||
assert member.member_email == "new@example.com"
|
assert member.member_email == "new@example.com"
|
||||||
assert member.email == "new@example.com"
|
assert member.email == "new@example.com"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "member can be created without member_email" do
|
test "member can be created without member_email" do
|
||||||
{:ok, member} =
|
{:ok, member} =
|
||||||
Membership.create_member(%{
|
Membership.create_member(%{})
|
||||||
first_name: "No",
|
|
||||||
last_name: "Email"
|
# 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.member_email == nil
|
||||||
assert member.email == nil
|
assert member.email == nil
|
||||||
end
|
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
|
end
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue