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
|
|
@ -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])
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue