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

@ -9,8 +9,13 @@ defmodule Mv.Membership.MemberCycleCalculationsTest do
alias Mv.MembershipFees.MembershipFeeCycle
alias Mv.MembershipFees.CalendarCycles
setup do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
%{actor: system_actor}
end
# Helper to create a membership fee type
defp create_fee_type(attrs) do
defp create_fee_type(attrs, actor) do
default_attrs = %{
name: "Test Fee Type #{System.unique_integer([:positive])}",
amount: Decimal.new("50.00"),
@ -21,11 +26,11 @@ defmodule Mv.Membership.MemberCycleCalculationsTest do
MembershipFeeType
|> Ash.Changeset.for_create(:create, attrs)
|> Ash.create!()
|> Ash.create!(actor: actor)
end
# Helper to create a member
defp create_member(attrs) do
defp create_member(attrs, actor) do
default_attrs = %{
first_name: "Test",
last_name: "Member",
@ -36,11 +41,11 @@ defmodule Mv.Membership.MemberCycleCalculationsTest do
Member
|> Ash.Changeset.for_create(:create_member, attrs)
|> Ash.create!()
|> Ash.create!(actor: actor)
end
# Helper to create a cycle
defp create_cycle(member, fee_type, attrs) do
defp create_cycle(member, fee_type, attrs, actor) do
default_attrs = %{
cycle_start: ~D[2024-01-01],
amount: Decimal.new("50.00"),
@ -53,62 +58,77 @@ defmodule Mv.Membership.MemberCycleCalculationsTest do
MembershipFeeCycle
|> Ash.Changeset.for_create(:create, attrs)
|> Ash.create!()
|> Ash.create!(actor: actor)
end
describe "current_cycle_status" do
test "returns status of current cycle for member with active cycle" do
fee_type = create_fee_type(%{interval: :yearly})
member = create_member(%{membership_fee_type_id: fee_type.id})
test "returns status of current cycle for member with active cycle", %{actor: actor} do
fee_type = create_fee_type(%{interval: :yearly}, actor)
member = create_member(%{membership_fee_type_id: fee_type.id}, actor)
# Create a cycle that is active today (2024-01-01 to 2024-12-31)
# Assuming today is in 2024
today = Date.utc_today()
cycle_start = CalendarCycles.calculate_cycle_start(today, :yearly)
create_cycle(member, fee_type, %{
cycle_start: cycle_start,
status: :paid
})
create_cycle(
member,
fee_type,
%{
cycle_start: cycle_start,
status: :paid
},
actor
)
member = Ash.load!(member, :current_cycle_status)
assert member.current_cycle_status == :paid
end
test "returns nil for member without current cycle" do
fee_type = create_fee_type(%{interval: :yearly})
member = create_member(%{membership_fee_type_id: fee_type.id})
test "returns nil for member without current cycle", %{actor: actor} do
fee_type = create_fee_type(%{interval: :yearly}, actor)
member = create_member(%{membership_fee_type_id: fee_type.id}, actor)
# Create a cycle in the past (not current)
create_cycle(member, fee_type, %{
cycle_start: ~D[2020-01-01],
status: :paid
})
create_cycle(
member,
fee_type,
%{
cycle_start: ~D[2020-01-01],
status: :paid
},
actor
)
member = Ash.load!(member, :current_cycle_status)
assert member.current_cycle_status == nil
end
test "returns nil for member without cycles" do
fee_type = create_fee_type(%{interval: :yearly})
member = create_member(%{membership_fee_type_id: fee_type.id})
test "returns nil for member without cycles", %{actor: actor} do
fee_type = create_fee_type(%{interval: :yearly}, actor)
member = create_member(%{membership_fee_type_id: fee_type.id}, actor)
member = Ash.load!(member, :current_cycle_status)
assert member.current_cycle_status == nil
end
test "returns status of current cycle for monthly interval" do
fee_type = create_fee_type(%{interval: :monthly})
member = create_member(%{membership_fee_type_id: fee_type.id})
test "returns status of current cycle for monthly interval", %{actor: actor} do
fee_type = create_fee_type(%{interval: :monthly}, actor)
member = create_member(%{membership_fee_type_id: fee_type.id}, actor)
# Create a cycle that is active today (current month)
today = Date.utc_today()
cycle_start = CalendarCycles.calculate_cycle_start(today, :monthly)
create_cycle(member, fee_type, %{
cycle_start: cycle_start,
status: :unpaid
})
create_cycle(
member,
fee_type,
%{
cycle_start: cycle_start,
status: :unpaid
},
actor
)
member = Ash.load!(member, :current_cycle_status)
assert member.current_cycle_status == :unpaid
@ -116,79 +136,109 @@ defmodule Mv.Membership.MemberCycleCalculationsTest do
end
describe "last_cycle_status" do
test "returns status of last completed cycle" do
fee_type = create_fee_type(%{interval: :yearly})
member = create_member(%{membership_fee_type_id: fee_type.id})
test "returns status of last completed cycle", %{actor: actor} do
fee_type = create_fee_type(%{interval: :yearly}, actor)
member = create_member(%{membership_fee_type_id: fee_type.id}, actor)
# Create cycles: 2022 (completed), 2023 (completed), 2024 (current)
today = Date.utc_today()
create_cycle(member, fee_type, %{
cycle_start: ~D[2022-01-01],
status: :paid
})
create_cycle(
member,
fee_type,
%{
cycle_start: ~D[2022-01-01],
status: :paid
},
actor
)
create_cycle(member, fee_type, %{
cycle_start: ~D[2023-01-01],
status: :unpaid
})
create_cycle(
member,
fee_type,
%{
cycle_start: ~D[2023-01-01],
status: :unpaid
},
actor
)
# Current cycle
cycle_start = CalendarCycles.calculate_cycle_start(today, :yearly)
create_cycle(member, fee_type, %{
cycle_start: cycle_start,
status: :paid
})
create_cycle(
member,
fee_type,
%{
cycle_start: cycle_start,
status: :paid
},
actor
)
member = Ash.load!(member, :last_cycle_status)
# Should return status of 2023 (last completed)
assert member.last_cycle_status == :unpaid
end
test "returns nil for member without completed cycles" do
fee_type = create_fee_type(%{interval: :yearly})
member = create_member(%{membership_fee_type_id: fee_type.id})
test "returns nil for member without completed cycles", %{actor: actor} do
fee_type = create_fee_type(%{interval: :yearly}, actor)
member = create_member(%{membership_fee_type_id: fee_type.id}, actor)
# Only create current cycle (not completed yet)
today = Date.utc_today()
cycle_start = CalendarCycles.calculate_cycle_start(today, :yearly)
create_cycle(member, fee_type, %{
cycle_start: cycle_start,
status: :paid
})
create_cycle(
member,
fee_type,
%{
cycle_start: cycle_start,
status: :paid
},
actor
)
member = Ash.load!(member, :last_cycle_status)
assert member.last_cycle_status == nil
end
test "returns nil for member without cycles" do
fee_type = create_fee_type(%{interval: :yearly})
member = create_member(%{membership_fee_type_id: fee_type.id})
test "returns nil for member without cycles", %{actor: actor} do
fee_type = create_fee_type(%{interval: :yearly}, actor)
member = create_member(%{membership_fee_type_id: fee_type.id}, actor)
member = Ash.load!(member, :last_cycle_status)
assert member.last_cycle_status == nil
end
test "returns status of last completed cycle for monthly interval" do
fee_type = create_fee_type(%{interval: :monthly})
member = create_member(%{membership_fee_type_id: fee_type.id})
test "returns status of last completed cycle for monthly interval", %{actor: actor} do
fee_type = create_fee_type(%{interval: :monthly}, actor)
member = create_member(%{membership_fee_type_id: fee_type.id}, actor)
today = Date.utc_today()
# Create cycles: last month (completed), current month (not completed)
last_month_start = Date.add(today, -32) |> CalendarCycles.calculate_cycle_start(:monthly)
current_month_start = CalendarCycles.calculate_cycle_start(today, :monthly)
create_cycle(member, fee_type, %{
cycle_start: last_month_start,
status: :paid
})
create_cycle(
member,
fee_type,
%{
cycle_start: last_month_start,
status: :paid
},
actor
)
create_cycle(member, fee_type, %{
cycle_start: current_month_start,
status: :unpaid
})
create_cycle(
member,
fee_type,
%{
cycle_start: current_month_start,
status: :unpaid
},
actor
)
member = Ash.load!(member, :last_cycle_status)
# Should return status of last month (last completed)
@ -197,9 +247,9 @@ defmodule Mv.Membership.MemberCycleCalculationsTest do
end
describe "overdue_count" do
test "counts only unpaid cycles that have ended" do
fee_type = create_fee_type(%{interval: :yearly})
member = create_member(%{membership_fee_type_id: fee_type.id})
test "counts only unpaid cycles that have ended", %{actor: actor} do
fee_type = create_fee_type(%{interval: :yearly}, actor)
member = create_member(%{membership_fee_type_id: fee_type.id}, actor)
today = Date.utc_today()
@ -209,23 +259,38 @@ defmodule Mv.Membership.MemberCycleCalculationsTest do
# 2024: unpaid, current (not overdue)
# 2025: unpaid, future (not overdue)
create_cycle(member, fee_type, %{
cycle_start: ~D[2022-01-01],
status: :unpaid
})
create_cycle(
member,
fee_type,
%{
cycle_start: ~D[2022-01-01],
status: :unpaid
},
actor
)
create_cycle(member, fee_type, %{
cycle_start: ~D[2023-01-01],
status: :paid
})
create_cycle(
member,
fee_type,
%{
cycle_start: ~D[2023-01-01],
status: :paid
},
actor
)
# Current cycle
cycle_start = CalendarCycles.calculate_cycle_start(today, :yearly)
create_cycle(member, fee_type, %{
cycle_start: cycle_start,
status: :unpaid
})
create_cycle(
member,
fee_type,
%{
cycle_start: cycle_start,
status: :unpaid
},
actor
)
# Future cycle (if we're not at the end of the year)
next_year = today.year + 1
@ -233,10 +298,15 @@ defmodule Mv.Membership.MemberCycleCalculationsTest do
if today.month < 12 or today.day < 31 do
next_year_start = Date.new!(next_year, 1, 1)
create_cycle(member, fee_type, %{
cycle_start: next_year_start,
status: :unpaid
})
create_cycle(
member,
fee_type,
%{
cycle_start: next_year_start,
status: :unpaid
},
actor
)
end
member = Ash.load!(member, :overdue_count)
@ -244,31 +314,36 @@ defmodule Mv.Membership.MemberCycleCalculationsTest do
assert member.overdue_count == 1
end
test "returns 0 when no overdue cycles" do
fee_type = create_fee_type(%{interval: :yearly})
member = create_member(%{membership_fee_type_id: fee_type.id})
test "returns 0 when no overdue cycles", %{actor: actor} do
fee_type = create_fee_type(%{interval: :yearly}, actor)
member = create_member(%{membership_fee_type_id: fee_type.id}, actor)
# Create only paid cycles
create_cycle(member, fee_type, %{
cycle_start: ~D[2022-01-01],
status: :paid
})
create_cycle(
member,
fee_type,
%{
cycle_start: ~D[2022-01-01],
status: :paid
},
actor
)
member = Ash.load!(member, :overdue_count)
assert member.overdue_count == 0
end
test "returns 0 for member without cycles" do
fee_type = create_fee_type(%{interval: :yearly})
member = create_member(%{membership_fee_type_id: fee_type.id})
test "returns 0 for member without cycles", %{actor: actor} do
fee_type = create_fee_type(%{interval: :yearly}, actor)
member = create_member(%{membership_fee_type_id: fee_type.id}, actor)
member = Ash.load!(member, :overdue_count)
assert member.overdue_count == 0
end
test "counts overdue cycles for monthly interval" do
fee_type = create_fee_type(%{interval: :monthly})
member = create_member(%{membership_fee_type_id: fee_type.id})
test "counts overdue cycles for monthly interval", %{actor: actor} do
fee_type = create_fee_type(%{interval: :monthly}, actor)
member = create_member(%{membership_fee_type_id: fee_type.id}, actor)
today = Date.utc_today()
@ -279,45 +354,75 @@ defmodule Mv.Membership.MemberCycleCalculationsTest do
last_month_start = Date.add(today, -32) |> CalendarCycles.calculate_cycle_start(:monthly)
current_month_start = CalendarCycles.calculate_cycle_start(today, :monthly)
create_cycle(member, fee_type, %{
cycle_start: two_months_ago_start,
status: :unpaid
})
create_cycle(
member,
fee_type,
%{
cycle_start: two_months_ago_start,
status: :unpaid
},
actor
)
create_cycle(member, fee_type, %{
cycle_start: last_month_start,
status: :paid
})
create_cycle(
member,
fee_type,
%{
cycle_start: last_month_start,
status: :paid
},
actor
)
create_cycle(member, fee_type, %{
cycle_start: current_month_start,
status: :unpaid
})
create_cycle(
member,
fee_type,
%{
cycle_start: current_month_start,
status: :unpaid
},
actor
)
member = Ash.load!(member, :overdue_count)
# Should only count two_months_ago (unpaid and ended)
assert member.overdue_count == 1
end
test "counts multiple overdue cycles" do
fee_type = create_fee_type(%{interval: :yearly})
member = create_member(%{membership_fee_type_id: fee_type.id})
test "counts multiple overdue cycles", %{actor: actor} do
fee_type = create_fee_type(%{interval: :yearly}, actor)
member = create_member(%{membership_fee_type_id: fee_type.id}, actor)
# Create multiple unpaid, ended cycles
create_cycle(member, fee_type, %{
cycle_start: ~D[2020-01-01],
status: :unpaid
})
create_cycle(
member,
fee_type,
%{
cycle_start: ~D[2020-01-01],
status: :unpaid
},
actor
)
create_cycle(member, fee_type, %{
cycle_start: ~D[2021-01-01],
status: :unpaid
})
create_cycle(
member,
fee_type,
%{
cycle_start: ~D[2021-01-01],
status: :unpaid
},
actor
)
create_cycle(member, fee_type, %{
cycle_start: ~D[2022-01-01],
status: :unpaid
})
create_cycle(
member,
fee_type,
%{
cycle_start: ~D[2022-01-01],
status: :unpaid
},
actor
)
member = Ash.load!(member, :overdue_count)
assert member.overdue_count == 3
@ -325,29 +430,44 @@ defmodule Mv.Membership.MemberCycleCalculationsTest do
end
describe "calculations with multiple cycles" do
test "all calculations work correctly with multiple cycles" do
fee_type = create_fee_type(%{interval: :yearly})
member = create_member(%{membership_fee_type_id: fee_type.id})
test "all calculations work correctly with multiple cycles", %{actor: actor} do
fee_type = create_fee_type(%{interval: :yearly}, actor)
member = create_member(%{membership_fee_type_id: fee_type.id}, actor)
today = Date.utc_today()
# Create cycles: 2022 (unpaid, ended), 2023 (paid, ended), 2024 (unpaid, current)
create_cycle(member, fee_type, %{
cycle_start: ~D[2022-01-01],
status: :unpaid
})
create_cycle(
member,
fee_type,
%{
cycle_start: ~D[2022-01-01],
status: :unpaid
},
actor
)
create_cycle(member, fee_type, %{
cycle_start: ~D[2023-01-01],
status: :paid
})
create_cycle(
member,
fee_type,
%{
cycle_start: ~D[2023-01-01],
status: :paid
},
actor
)
cycle_start = CalendarCycles.calculate_cycle_start(today, :yearly)
create_cycle(member, fee_type, %{
cycle_start: cycle_start,
status: :unpaid
})
create_cycle(
member,
fee_type,
%{
cycle_start: cycle_start,
status: :unpaid
},
actor
)
member =
Ash.load!(member, [:current_cycle_status, :last_cycle_status, :overdue_count])