Add actor parameter to all tests requiring authorization
All checks were successful
continuous-integration/drone/push Build is passing

This commit adds actor: system_actor to all Ash operations in tests that
require authorization.
This commit is contained in:
Moritz 2026-01-23 20:00:24 +01:00
parent 4c846f8bba
commit a6cdeaa18d
Signed by: moritz
GPG key ID: 1020A035E5DD0824
75 changed files with 4649 additions and 2865 deletions

View file

@ -13,64 +13,87 @@ defmodule Mv.Membership.MemberAvailableForLinkingTest do
describe "available_for_linking/2" do
setup do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
# Create 5 unlinked members with distinct names
{:ok, member1} =
Membership.create_member(%{
first_name: "Alice",
last_name: "Anderson",
email: "alice@example.com"
})
Membership.create_member(
%{
first_name: "Alice",
last_name: "Anderson",
email: "alice@example.com"
},
actor: system_actor
)
{:ok, member2} =
Membership.create_member(%{
first_name: "Bob",
last_name: "Williams",
email: "bob@example.com"
})
Membership.create_member(
%{
first_name: "Bob",
last_name: "Williams",
email: "bob@example.com"
},
actor: system_actor
)
{:ok, member3} =
Membership.create_member(%{
first_name: "Charlie",
last_name: "Davis",
email: "charlie@example.com"
})
Membership.create_member(
%{
first_name: "Charlie",
last_name: "Davis",
email: "charlie@example.com"
},
actor: system_actor
)
{:ok, member4} =
Membership.create_member(%{
first_name: "Diana",
last_name: "Martinez",
email: "diana@example.com"
})
Membership.create_member(
%{
first_name: "Diana",
last_name: "Martinez",
email: "diana@example.com"
},
actor: system_actor
)
{:ok, member5} =
Membership.create_member(%{
first_name: "Emma",
last_name: "Taylor",
email: "emma@example.com"
})
Membership.create_member(
%{
first_name: "Emma",
last_name: "Taylor",
email: "emma@example.com"
},
actor: system_actor
)
unlinked_members = [member1, member2, member3, member4, member5]
# Create 2 linked members (with users)
{:ok, user1} = Mv.Accounts.create_user(%{email: "user1@example.com"})
{:ok, user1} = Mv.Accounts.create_user(%{email: "user1@example.com"}, actor: system_actor)
{:ok, linked_member1} =
Membership.create_member(%{
first_name: "Linked",
last_name: "Member1",
email: "linked1@example.com",
user: %{id: user1.id}
})
Membership.create_member(
%{
first_name: "Linked",
last_name: "Member1",
email: "linked1@example.com",
user: %{id: user1.id}
},
actor: system_actor
)
{:ok, user2} = Mv.Accounts.create_user(%{email: "user2@example.com"})
{:ok, user2} = Mv.Accounts.create_user(%{email: "user2@example.com"}, actor: system_actor)
{:ok, linked_member2} =
Membership.create_member(%{
first_name: "Linked",
last_name: "Member2",
email: "linked2@example.com",
user: %{id: user2.id}
})
Membership.create_member(
%{
first_name: "Linked",
last_name: "Member2",
email: "linked2@example.com",
user: %{id: user2.id}
},
actor: system_actor
)
%{
unlinked_members: unlinked_members,
@ -82,11 +105,13 @@ defmodule Mv.Membership.MemberAvailableForLinkingTest do
unlinked_members: unlinked_members,
linked_members: _linked_members
} do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
# Call the action without any arguments
members =
Mv.Membership.Member
|> Ash.Query.for_read(:available_for_linking, %{})
|> Ash.read!()
|> Ash.read!(actor: system_actor)
# Should return only the 5 unlinked members, not the 2 linked ones
assert length(members) == 5
@ -98,25 +123,32 @@ defmodule Mv.Membership.MemberAvailableForLinkingTest do
# Verify none of the returned members have a user_id
Enum.each(members, fn member ->
member_with_user = Ash.get!(Mv.Membership.Member, member.id, load: [:user])
member_with_user =
Ash.get!(Mv.Membership.Member, member.id, actor: system_actor, load: [:user])
assert is_nil(member_with_user.user)
end)
end
test "limits results to 10 members even when more exist" do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
# Create 15 additional unlinked members (total 20 unlinked)
for i <- 6..20 do
Membership.create_member(%{
first_name: "Extra#{i}",
last_name: "Member#{i}",
email: "extra#{i}@example.com"
})
Membership.create_member(
%{
first_name: "Extra#{i}",
last_name: "Member#{i}",
email: "extra#{i}@example.com"
},
actor: system_actor
)
end
members =
Mv.Membership.Member
|> Ash.Query.for_read(:available_for_linking, %{})
|> Ash.read!()
|> Ash.read!(actor: system_actor)
# Should be limited to 10
assert length(members) == 10
@ -125,6 +157,8 @@ defmodule Mv.Membership.MemberAvailableForLinkingTest do
test "email match: returns only member with matching email when exists", %{
unlinked_members: unlinked_members
} do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
# Get one of the unlinked members' email
target_member = List.first(unlinked_members)
user_email = target_member.email
@ -132,7 +166,7 @@ defmodule Mv.Membership.MemberAvailableForLinkingTest do
raw_members =
Mv.Membership.Member
|> Ash.Query.for_read(:available_for_linking, %{user_email: user_email})
|> Ash.read!()
|> Ash.read!(actor: system_actor)
# Apply email match filtering (sorted results come from query)
# When user_email matches, only that member should be returned
@ -145,13 +179,15 @@ defmodule Mv.Membership.MemberAvailableForLinkingTest do
end
test "email match: returns all unlinked members when no email match" do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
# Use an email that doesn't match any member
non_matching_email = "nonexistent@example.com"
raw_members =
Mv.Membership.Member
|> Ash.Query.for_read(:available_for_linking, %{user_email: non_matching_email})
|> Ash.read!()
|> Ash.read!(actor: system_actor)
# Apply email match filtering
members = Mv.Membership.Member.filter_by_email_match(raw_members, non_matching_email)
@ -163,11 +199,13 @@ defmodule Mv.Membership.MemberAvailableForLinkingTest do
test "search query: filters by first_name, last_name, and email", %{
unlinked_members: _unlinked_members
} do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
# Search by first name
members =
Mv.Membership.Member
|> Ash.Query.for_read(:available_for_linking, %{search_query: "Alice"})
|> Ash.read!()
|> Ash.read!(actor: system_actor)
assert length(members) == 1
assert List.first(members).first_name == "Alice"
@ -176,7 +214,7 @@ defmodule Mv.Membership.MemberAvailableForLinkingTest do
members =
Mv.Membership.Member
|> Ash.Query.for_read(:available_for_linking, %{search_query: "Williams"})
|> Ash.read!()
|> Ash.read!(actor: system_actor)
assert length(members) == 1
assert List.first(members).last_name == "Williams"
@ -185,7 +223,7 @@ defmodule Mv.Membership.MemberAvailableForLinkingTest do
members =
Mv.Membership.Member
|> Ash.Query.for_read(:available_for_linking, %{search_query: "charlie@"})
|> Ash.read!()
|> Ash.read!(actor: system_actor)
assert length(members) == 1
assert List.first(members).email == "charlie@example.com"
@ -194,12 +232,13 @@ defmodule Mv.Membership.MemberAvailableForLinkingTest do
members =
Mv.Membership.Member
|> Ash.Query.for_read(:available_for_linking, %{search_query: "NonExistent"})
|> Ash.read!()
|> Ash.read!(actor: system_actor)
assert Enum.empty?(members)
end
test "user_email takes precedence over search_query", %{unlinked_members: unlinked_members} do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
target_member = List.first(unlinked_members)
# Pass both email match and search query that would match different members
@ -209,7 +248,7 @@ defmodule Mv.Membership.MemberAvailableForLinkingTest do
user_email: target_member.email,
search_query: "Bob"
})
|> Ash.read!()
|> Ash.read!(actor: system_actor)
# Apply email-match filter (as LiveView does)
members = Mv.Membership.Member.filter_by_email_match(raw_members, target_member.email)