Add actor parameter to all tests requiring authorization
This commit adds actor: system_actor to all Ash operations in tests that require authorization.
This commit is contained in:
parent
686f69c9e9
commit
0f48a9b15a
75 changed files with 4686 additions and 2859 deletions
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue