test(membership-fees): share create_fee_type and create_cycle fixtures

Replace the create_fee_type/create_cycle helpers duplicated across 18/8
membership-fee test files with a single shared definition in Mv.Fixtures,
reconciling the divergent local signatures (including the reversed
argument order) into one superset so behavior is unchanged.
This commit is contained in:
Moritz 2026-06-16 17:49:50 +02:00
parent 9aa5bdb6a7
commit 18fb954f73
19 changed files with 279 additions and 513 deletions

View file

@ -12,9 +12,10 @@ defmodule Mv.MembershipFees.CycleGeneratorEdgeCasesTest do
"""
use Mv.DataCase, async: false
import Mv.Fixtures, only: [create_fee_type: 2]
alias Mv.MembershipFees.CycleGenerator
alias Mv.MembershipFees.MembershipFeeCycle
alias Mv.MembershipFees.MembershipFeeType
require Ash.Query
@ -23,21 +24,6 @@ defmodule Mv.MembershipFees.CycleGeneratorEdgeCasesTest do
%{actor: system_actor}
end
# Helper to create a membership fee type
defp create_fee_type(attrs, actor) do
default_attrs = %{
name: "Test Fee Type #{System.unique_integer([:positive])}",
amount: Decimal.new("50.00"),
interval: :yearly
}
attrs = Map.merge(default_attrs, attrs)
MembershipFeeType
|> Ash.Changeset.for_create(:create, attrs)
|> Ash.create!(actor: actor)
end
# Helper to create a member. Note: If membership_fee_type_id is provided,
# cycles will be auto-generated during creation in test environment.
defp create_member(attrs, actor) do

View file

@ -4,9 +4,10 @@ defmodule Mv.MembershipFees.CycleGeneratorTest do
"""
use Mv.DataCase, async: false
import Mv.Fixtures, only: [create_fee_type: 2]
alias Mv.MembershipFees.CycleGenerator
alias Mv.MembershipFees.MembershipFeeCycle
alias Mv.MembershipFees.MembershipFeeType
require Ash.Query
@ -15,21 +16,6 @@ defmodule Mv.MembershipFees.CycleGeneratorTest do
%{actor: system_actor}
end
# Helper to create a membership fee type
defp create_fee_type(attrs, actor) do
default_attrs = %{
name: "Test Fee Type #{System.unique_integer([:positive])}",
amount: Decimal.new("50.00"),
interval: :yearly
}
attrs = Map.merge(default_attrs, attrs)
MembershipFeeType
|> Ash.Changeset.for_create(:create, attrs)
|> Ash.create!(actor: actor)
end
# Helper to create a member without triggering cycle generation
defp create_member_without_cycles(attrs, actor) do
default_attrs = %{

View file

@ -8,6 +8,8 @@ defmodule Mv.MembershipFees.MembershipFeeCyclePoliciesTest do
"""
use Mv.DataCase, async: false
import Mv.Fixtures, only: [create_fee_type: 1, create_cycle: 3]
alias Mv.Membership
alias Mv.MembershipFees
@ -32,41 +34,15 @@ defmodule Mv.MembershipFees.MembershipFeeCyclePoliciesTest do
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
defp fee_type_fixture do
create_fee_type(%{amount: Decimal.new("10.00"), description: "Test"})
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
defp cycle_fixture do
create_cycle(create_member_fixture(), fee_type_fixture(), %{
cycle_start: Date.utc_today(),
amount: Decimal.new("10.00")
})
end
describe "own_data permission set" do
@ -74,7 +50,7 @@ defmodule Mv.MembershipFees.MembershipFeeCyclePoliciesTest do
user = Mv.Fixtures.user_with_role_fixture("own_data")
linked_member = create_member_fixture()
other_member = create_member_fixture()
fee_type = create_fee_type_fixture()
fee_type = fee_type_fixture()
admin = Mv.Fixtures.user_with_role_fixture("admin")
user =
@ -130,7 +106,7 @@ defmodule Mv.MembershipFees.MembershipFeeCyclePoliciesTest do
describe "read_only permission set" do
setup %{actor: actor} do
user = Mv.Fixtures.user_with_role_fixture("read_only")
cycle = create_cycle_fixture()
cycle = cycle_fixture()
%{actor: actor, user: user, cycle: cycle}
end
@ -156,7 +132,7 @@ defmodule Mv.MembershipFees.MembershipFeeCyclePoliciesTest do
test "cannot create cycle (returns forbidden)", %{user: user, actor: _actor} do
member = create_member_fixture()
fee_type = create_fee_type_fixture()
fee_type = fee_type_fixture()
assert {:error, %Ash.Error.Forbidden{}} =
MembershipFees.create_membership_fee_cycle(
@ -180,7 +156,7 @@ defmodule Mv.MembershipFees.MembershipFeeCyclePoliciesTest do
describe "normal_user permission set" do
setup %{actor: actor} do
user = Mv.Fixtures.user_with_role_fixture("normal_user")
cycle = create_cycle_fixture()
cycle = cycle_fixture()
%{actor: actor, user: user, cycle: cycle}
end
@ -210,7 +186,7 @@ defmodule Mv.MembershipFees.MembershipFeeCyclePoliciesTest do
test "can create cycle", %{user: user, actor: _actor} do
member = create_member_fixture()
fee_type = create_fee_type_fixture()
fee_type = fee_type_fixture()
assert {:ok, created} =
MembershipFees.create_membership_fee_cycle(
@ -235,7 +211,7 @@ defmodule Mv.MembershipFees.MembershipFeeCyclePoliciesTest do
describe "admin permission set" do
setup %{actor: actor} do
user = Mv.Fixtures.user_with_role_fixture("admin")
cycle = create_cycle_fixture()
cycle = cycle_fixture()
%{actor: actor, user: user, cycle: cycle}
end
@ -270,7 +246,7 @@ defmodule Mv.MembershipFees.MembershipFeeCyclePoliciesTest do
test "can create cycle", %{user: user, actor: _actor} do
member = create_member_fixture()
fee_type = create_fee_type_fixture()
fee_type = fee_type_fixture()
assert {:ok, created} =
MembershipFees.create_membership_fee_cycle(

View file

@ -6,11 +6,11 @@ defmodule Mv.StatisticsTest do
require Ash.Query
import Ash.Expr
import Mv.Fixtures, only: [create_fee_type: 2]
alias Mv.Membership.Member
alias Mv.MembershipFees
alias Mv.MembershipFees.MembershipFeeCycle
alias Mv.MembershipFees.MembershipFeeType
alias Mv.Statistics
setup do
@ -18,22 +18,6 @@ defmodule Mv.StatisticsTest do
%{actor: actor}
end
defp create_fee_type(actor, attrs) do
MembershipFeeType
|> Ash.Changeset.for_create(
:create,
Map.merge(
%{
name: "Test Fee #{System.unique_integer([:positive])}",
amount: Decimal.new("50.00"),
interval: :yearly
},
attrs
)
)
|> Ash.create!(actor: actor)
end
describe "first_join_year/1" do
test "returns the year of the earliest join_date", %{actor: actor} do
Mv.Fixtures.member_fixture(%{join_date: ~D[2019-03-15]})
@ -131,7 +115,7 @@ defmodule Mv.StatisticsTest do
end
test "returns totals by status for cycles in that year", %{actor: actor} do
fee_type = create_fee_type(actor, %{amount: Decimal.new("50.00")})
fee_type = create_fee_type(%{amount: Decimal.new("50.00")}, actor)
# Creating members with fee type triggers cycle generation (2020..today). We use 2024 cycles.
_member1 =
@ -171,8 +155,8 @@ defmodule Mv.StatisticsTest do
test "when fee_type_id is passed in opts, returns only cycles of that fee type", %{
actor: actor
} do
fee_type_a = create_fee_type(actor, %{amount: Decimal.new("30.00")})
fee_type_b = create_fee_type(actor, %{amount: Decimal.new("70.00")})
fee_type_a = create_fee_type(%{amount: Decimal.new("30.00")}, actor)
fee_type_b = create_fee_type(%{amount: Decimal.new("70.00")}, actor)
_m1 =
Mv.Fixtures.member_fixture(%{
@ -207,7 +191,7 @@ defmodule Mv.StatisticsTest do
end
test "returns sum of amount for all unpaid cycles", %{actor: actor} do
fee_type = create_fee_type(actor, %{amount: Decimal.new("50.00")})
fee_type = create_fee_type(%{amount: Decimal.new("50.00")}, actor)
_member =
Mv.Fixtures.member_fixture(%{