- Policy tests: use Fixtures where applicable; create_custom_field() fix in custom_field_value. - Replace unused actor with _actor, remove unused alias Accounts in policy tests. - profile_navigation_test: disable Credo for intentional TODO comment.
236 lines
7.1 KiB
Elixir
236 lines
7.1 KiB
Elixir
defmodule Mv.MembershipFees.MembershipFeeCyclePoliciesTest do
|
|
@moduledoc """
|
|
Tests for MembershipFeeCycle resource authorization policies.
|
|
|
|
Verifies read_only can only read (no update/mark_as_paid);
|
|
normal_user and admin can read and update (including mark_as_paid);
|
|
only admin can create and destroy.
|
|
"""
|
|
use Mv.DataCase, async: false
|
|
|
|
alias Mv.MembershipFees
|
|
alias Mv.Membership
|
|
|
|
setup do
|
|
system_actor = Mv.Helpers.SystemActor.get_system_actor()
|
|
%{actor: system_actor}
|
|
end
|
|
|
|
defp create_member_fixture do
|
|
admin = Mv.Fixtures.user_with_role_fixture("admin")
|
|
|
|
{:ok, member} =
|
|
Membership.create_member(
|
|
%{
|
|
first_name: "Test",
|
|
last_name: "Member",
|
|
email: "test#{System.unique_integer([:positive])}@example.com"
|
|
},
|
|
actor: admin
|
|
)
|
|
|
|
member
|
|
end
|
|
|
|
defp create_fee_type_fixture do
|
|
admin = Mv.Fixtures.user_with_role_fixture("admin")
|
|
|
|
{:ok, fee_type} =
|
|
MembershipFees.create_membership_fee_type(
|
|
%{
|
|
name: "Test Fee #{System.unique_integer([:positive])}",
|
|
amount: Decimal.new("10.00"),
|
|
interval: :yearly,
|
|
description: "Test"
|
|
},
|
|
actor: admin
|
|
)
|
|
|
|
fee_type
|
|
end
|
|
|
|
defp create_cycle_fixture do
|
|
admin = Mv.Fixtures.user_with_role_fixture("admin")
|
|
member = create_member_fixture()
|
|
fee_type = create_fee_type_fixture()
|
|
|
|
{:ok, cycle} =
|
|
MembershipFees.create_membership_fee_cycle(
|
|
%{
|
|
member_id: member.id,
|
|
membership_fee_type_id: fee_type.id,
|
|
cycle_start: Date.utc_today(),
|
|
amount: Decimal.new("10.00"),
|
|
status: :unpaid
|
|
},
|
|
actor: admin
|
|
)
|
|
|
|
cycle
|
|
end
|
|
|
|
describe "read_only permission set" do
|
|
setup %{actor: actor} do
|
|
user = Mv.Fixtures.user_with_role_fixture("read_only")
|
|
cycle = create_cycle_fixture()
|
|
%{actor: actor, user: user, cycle: cycle}
|
|
end
|
|
|
|
test "can read membership_fee_cycles (list)", %{user: user} do
|
|
{:ok, list} =
|
|
Mv.MembershipFees.MembershipFeeCycle
|
|
|> Ash.read(actor: user, domain: Mv.MembershipFees)
|
|
|
|
assert is_list(list)
|
|
end
|
|
|
|
test "cannot update cycle (returns forbidden)", %{user: user, cycle: cycle} do
|
|
assert {:error, %Ash.Error.Forbidden{}} =
|
|
MembershipFees.update_membership_fee_cycle(cycle, %{status: :paid}, actor: user)
|
|
end
|
|
|
|
test "cannot mark_as_paid (returns forbidden)", %{user: user, cycle: cycle} do
|
|
assert {:error, %Ash.Error.Forbidden{}} =
|
|
cycle
|
|
|> Ash.Changeset.for_update(:mark_as_paid, %{}, domain: Mv.MembershipFees)
|
|
|> Ash.update(actor: user, domain: Mv.MembershipFees)
|
|
end
|
|
|
|
test "cannot create cycle (returns forbidden)", %{user: user, actor: _actor} do
|
|
member = create_member_fixture()
|
|
fee_type = create_fee_type_fixture()
|
|
|
|
assert {:error, %Ash.Error.Forbidden{}} =
|
|
MembershipFees.create_membership_fee_cycle(
|
|
%{
|
|
member_id: member.id,
|
|
membership_fee_type_id: fee_type.id,
|
|
cycle_start: Date.utc_today(),
|
|
amount: Decimal.new("10.00"),
|
|
status: :unpaid
|
|
},
|
|
actor: user
|
|
)
|
|
end
|
|
|
|
test "cannot destroy cycle (returns forbidden)", %{user: user, cycle: cycle} do
|
|
assert {:error, %Ash.Error.Forbidden{}} =
|
|
MembershipFees.destroy_membership_fee_cycle(cycle, actor: user)
|
|
end
|
|
end
|
|
|
|
describe "normal_user permission set" do
|
|
setup %{actor: actor} do
|
|
user = Mv.Fixtures.user_with_role_fixture("normal_user")
|
|
cycle = create_cycle_fixture()
|
|
%{actor: actor, user: user, cycle: cycle}
|
|
end
|
|
|
|
test "can read membership_fee_cycles (list)", %{user: user} do
|
|
{:ok, list} =
|
|
Mv.MembershipFees.MembershipFeeCycle
|
|
|> Ash.read(actor: user, domain: Mv.MembershipFees)
|
|
|
|
assert is_list(list)
|
|
end
|
|
|
|
test "can update cycle status", %{user: user, cycle: cycle} do
|
|
assert {:ok, updated} =
|
|
MembershipFees.update_membership_fee_cycle(cycle, %{status: :paid}, actor: user)
|
|
|
|
assert updated.status == :paid
|
|
end
|
|
|
|
test "can mark_as_paid", %{user: user, cycle: cycle} do
|
|
assert {:ok, updated} =
|
|
cycle
|
|
|> Ash.Changeset.for_update(:mark_as_paid, %{}, domain: Mv.MembershipFees)
|
|
|> Ash.update(actor: user, domain: Mv.MembershipFees)
|
|
|
|
assert updated.status == :paid
|
|
end
|
|
|
|
test "can create cycle", %{user: user, actor: _actor} do
|
|
member = create_member_fixture()
|
|
fee_type = create_fee_type_fixture()
|
|
|
|
assert {:ok, created} =
|
|
MembershipFees.create_membership_fee_cycle(
|
|
%{
|
|
member_id: member.id,
|
|
membership_fee_type_id: fee_type.id,
|
|
cycle_start: Date.utc_today(),
|
|
amount: Decimal.new("10.00"),
|
|
status: :unpaid
|
|
},
|
|
actor: user
|
|
)
|
|
|
|
assert created.member_id == member.id
|
|
end
|
|
|
|
test "can destroy cycle", %{user: user, cycle: cycle} do
|
|
assert :ok = MembershipFees.destroy_membership_fee_cycle(cycle, actor: user)
|
|
end
|
|
end
|
|
|
|
describe "admin permission set" do
|
|
setup %{actor: actor} do
|
|
user = Mv.Fixtures.user_with_role_fixture("admin")
|
|
cycle = create_cycle_fixture()
|
|
%{actor: actor, user: user, cycle: cycle}
|
|
end
|
|
|
|
test "can read membership_fee_cycles (list)", %{user: user} do
|
|
{:ok, list} =
|
|
Mv.MembershipFees.MembershipFeeCycle
|
|
|> Ash.read(actor: user, domain: Mv.MembershipFees)
|
|
|
|
assert is_list(list)
|
|
end
|
|
|
|
test "can update cycle", %{user: user, cycle: cycle} do
|
|
assert {:ok, updated} =
|
|
MembershipFees.update_membership_fee_cycle(cycle, %{status: :paid}, actor: user)
|
|
|
|
assert updated.status == :paid
|
|
end
|
|
|
|
test "can mark_as_paid", %{user: user, cycle: cycle} do
|
|
cycle_unpaid =
|
|
cycle
|
|
|> Ash.Changeset.for_update(:mark_as_unpaid, %{}, domain: Mv.MembershipFees)
|
|
|> Ash.update!(actor: user, domain: Mv.MembershipFees)
|
|
|
|
assert {:ok, updated} =
|
|
cycle_unpaid
|
|
|> Ash.Changeset.for_update(:mark_as_paid, %{}, domain: Mv.MembershipFees)
|
|
|> Ash.update(actor: user, domain: Mv.MembershipFees)
|
|
|
|
assert updated.status == :paid
|
|
end
|
|
|
|
test "can create cycle", %{user: user, actor: _actor} do
|
|
member = create_member_fixture()
|
|
fee_type = create_fee_type_fixture()
|
|
|
|
assert {:ok, created} =
|
|
MembershipFees.create_membership_fee_cycle(
|
|
%{
|
|
member_id: member.id,
|
|
membership_fee_type_id: fee_type.id,
|
|
cycle_start: Date.utc_today(),
|
|
amount: Decimal.new("10.00"),
|
|
status: :unpaid
|
|
},
|
|
actor: user
|
|
)
|
|
|
|
assert created.member_id == member.id
|
|
end
|
|
|
|
test "can destroy cycle", %{user: user, cycle: cycle} do
|
|
assert :ok = MembershipFees.destroy_membership_fee_cycle(cycle, actor: user)
|
|
end
|
|
end
|
|
end
|