CFV policies test: system_actor for setup, verify destroy with actor

- create_linked_member_for_user and create_unlinked_member use actor
  (system_actor) directly instead of creating admin user per call
- Remove create_admin_user helper
- After destroy, verify with Ash.get(..., actor: actor) to avoid
  false positive from Forbidden vs NotFound
This commit is contained in:
Moritz 2026-01-27 15:44:43 +01:00
parent 185ccb0217
commit 6e01af10f5

View file

@ -60,13 +60,7 @@ defmodule Mv.Membership.CustomFieldValuePoliciesTest do
user_with_role user_with_role
end end
defp create_admin_user(actor) do
create_user_with_permission_set("admin", actor)
end
defp create_linked_member_for_user(user, actor) do defp create_linked_member_for_user(user, actor) do
admin = create_admin_user(actor)
{:ok, member} = {:ok, member} =
Member Member
|> Ash.Changeset.for_create(:create_member, %{ |> Ash.Changeset.for_create(:create_member, %{
@ -74,19 +68,17 @@ defmodule Mv.Membership.CustomFieldValuePoliciesTest do
last_name: "Member", last_name: "Member",
email: "linked#{System.unique_integer([:positive])}@example.com" email: "linked#{System.unique_integer([:positive])}@example.com"
}) })
|> Ash.create(actor: admin, return_notifications?: false) |> Ash.create(actor: actor, return_notifications?: false)
user user
|> Ash.Changeset.for_update(:update, %{}) |> Ash.Changeset.for_update(:update, %{})
|> Ash.Changeset.force_change_attribute(:member_id, member.id) |> Ash.Changeset.force_change_attribute(:member_id, member.id)
|> Ash.update(actor: admin, domain: Mv.Accounts, return_notifications?: false) |> Ash.update(actor: actor, domain: Mv.Accounts, return_notifications?: false)
member member
end end
defp create_unlinked_member(actor) do defp create_unlinked_member(actor) do
admin = create_admin_user(actor)
{:ok, member} = {:ok, member} =
Member Member
|> Ash.Changeset.for_create(:create_member, %{ |> Ash.Changeset.for_create(:create_member, %{
@ -94,7 +86,7 @@ defmodule Mv.Membership.CustomFieldValuePoliciesTest do
last_name: "Member", last_name: "Member",
email: "unlinked#{System.unique_integer([:positive])}@example.com" email: "unlinked#{System.unique_integer([:positive])}@example.com"
}) })
|> Ash.create(actor: admin) |> Ash.create(actor: actor)
member member
end end
@ -201,11 +193,16 @@ defmodule Mv.Membership.CustomFieldValuePoliciesTest do
assert cfv.custom_field_id == custom_field2.id assert cfv.custom_field_id == custom_field2.id
end end
test "can destroy custom field value of linked member", %{user: user, cfv_linked: cfv_linked} do test "can destroy custom field value of linked member", %{
user: user,
cfv_linked: cfv_linked,
actor: actor
} do
result = Ash.destroy(cfv_linked, actor: user, domain: Mv.Membership) result = Ash.destroy(cfv_linked, actor: user, domain: Mv.Membership)
assert :ok = result assert :ok = result
assert {:error, _} = Ash.get(CustomFieldValue, cfv_linked.id, domain: Mv.Membership) assert {:error, _} =
Ash.get(CustomFieldValue, cfv_linked.id, domain: Mv.Membership, actor: actor)
end end
test "cannot read custom field values of unlinked member", %{ test "cannot read custom field values of unlinked member", %{
@ -408,10 +405,15 @@ defmodule Mv.Membership.CustomFieldValuePoliciesTest do
assert %Ash.Union{value: "updated", type: :string} = updated.value assert %Ash.Union{value: "updated", type: :string} = updated.value
end end
test "can destroy any custom field value", %{user: user, cfv_unlinked: cfv_unlinked} do test "can destroy any custom field value", %{
user: user,
cfv_unlinked: cfv_unlinked,
actor: actor
} do
:ok = Ash.destroy(cfv_unlinked, actor: user, domain: Mv.Membership) :ok = Ash.destroy(cfv_unlinked, actor: user, domain: Mv.Membership)
assert {:error, _} = Ash.get(CustomFieldValue, cfv_unlinked.id, domain: Mv.Membership) assert {:error, _} =
Ash.get(CustomFieldValue, cfv_unlinked.id, domain: Mv.Membership, actor: actor)
end end
end end
@ -478,10 +480,15 @@ defmodule Mv.Membership.CustomFieldValuePoliciesTest do
assert %Ash.Union{value: "updated", type: :string} = updated.value assert %Ash.Union{value: "updated", type: :string} = updated.value
end end
test "can destroy any custom field value", %{user: user, cfv_unlinked: cfv_unlinked} do test "can destroy any custom field value", %{
user: user,
cfv_unlinked: cfv_unlinked,
actor: actor
} do
:ok = Ash.destroy(cfv_unlinked, actor: user, domain: Mv.Membership) :ok = Ash.destroy(cfv_unlinked, actor: user, domain: Mv.Membership)
assert {:error, _} = Ash.get(CustomFieldValue, cfv_unlinked.id, domain: Mv.Membership) assert {:error, _} =
Ash.get(CustomFieldValue, cfv_unlinked.id, domain: Mv.Membership, actor: actor)
end end
end end
end end