Fix rebase conflict: Add actor parameter to helper functions in index_test.exs
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Moritz 2026-01-24 02:39:06 +01:00
parent fcca4b0b89
commit 15a7c615d6
Signed by: moritz
GPG key ID: 1020A035E5DD0824

View file

@ -7,7 +7,7 @@ defmodule MvWeb.MemberLive.IndexTest do
alias Mv.MembershipFees.MembershipFeeCycle
# Helper to create a membership fee type (shared across all tests)
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"),
@ -18,18 +18,18 @@ defmodule MvWeb.MemberLive.IndexTest do
MembershipFeeType
|> Ash.Changeset.for_create(:create, attrs)
|> Ash.create!()
|> Ash.create!(actor: actor)
end
# Helper to create a cycle (shared across all tests)
defp create_cycle(member, fee_type, attrs) do
defp create_cycle(member, fee_type, attrs, actor) do
# Delete any auto-generated cycles first to avoid conflicts
existing_cycles =
MembershipFeeCycle
|> Ash.Query.filter(member_id == ^member.id)
|> Ash.read!()
|> Ash.read!(actor: actor)
Enum.each(existing_cycles, fn cycle -> Ash.destroy!(cycle) end)
Enum.each(existing_cycles, fn cycle -> Ash.destroy!(cycle, actor: actor) end)
default_attrs = %{
cycle_start: ~D[2023-01-01],
@ -43,7 +43,7 @@ defmodule MvWeb.MemberLive.IndexTest do
MembershipFeeCycle
|> Ash.Changeset.for_create(:create, attrs)
|> Ash.create!()
|> Ash.create!(actor: actor)
end
test "shows translated title in German", %{conn: conn} do
@ -522,25 +522,7 @@ defmodule MvWeb.MemberLive.IndexTest do
end
describe "cycle status filter" do
alias Mv.MembershipFees.MembershipFeeType
alias Mv.MembershipFees.MembershipFeeCycle
# 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
# Helper to create a member (only used in this describe block)
defp create_member(attrs, actor) do
default_attrs = %{
first_name: "Test",
@ -555,31 +537,6 @@ defmodule MvWeb.MemberLive.IndexTest do
|> Ash.create!(actor: actor)
end
# Helper to create a cycle
defp create_cycle(member, fee_type, attrs, actor) do
# Delete any auto-generated cycles first to avoid conflicts
existing_cycles =
MembershipFeeCycle
|> Ash.Query.filter(member_id == ^member.id)
|> Ash.read!(actor: actor)
Enum.each(existing_cycles, fn cycle -> Ash.destroy!(cycle, actor: actor) end)
default_attrs = %{
cycle_start: ~D[2023-01-01],
amount: Decimal.new("50.00"),
member_id: member.id,
membership_fee_type_id: fee_type.id,
status: :unpaid
}
attrs = Map.merge(default_attrs, attrs)
MembershipFeeCycle
|> Ash.Changeset.for_create(:create, attrs)
|> Ash.create!(actor: actor)
end
test "filter shows only members with paid status in last cycle", %{conn: conn} do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
conn = conn_with_oidc_user(conn)
@ -1164,7 +1121,7 @@ defmodule MvWeb.MemberLive.IndexTest do
end
# Helper to create a member with a boolean custom field value
defp create_member_with_boolean_value(member_attrs, custom_field, value) do
defp create_member_with_boolean_value(member_attrs, custom_field, value, actor) do
{:ok, member} =
Mv.Membership.Member
|> Ash.Changeset.for_create(
@ -1176,7 +1133,7 @@ defmodule MvWeb.MemberLive.IndexTest do
}
|> Map.merge(member_attrs)
)
|> Ash.create()
|> Ash.create(actor: actor)
{:ok, _cfv} =
Mv.Membership.CustomFieldValue
@ -1185,17 +1142,18 @@ defmodule MvWeb.MemberLive.IndexTest do
custom_field_id: custom_field.id,
value: %{"_union_type" => "boolean", "_union_value" => value}
})
|> Ash.create()
|> Ash.create(actor: actor)
# Reload member with custom field values
member
|> Ash.load!(:custom_field_values)
|> Ash.load!(:custom_field_values, actor: actor)
end
# Tests for get_boolean_custom_field_value/2
test "get_boolean_custom_field_value extracts true from Ash.Union format", %{conn: _conn} do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
boolean_field = create_boolean_custom_field()
member = create_member_with_boolean_value(%{}, boolean_field, true)
member = create_member_with_boolean_value(%{}, boolean_field, true, system_actor)
# Test the function (will fail until implemented)
result = MvWeb.MemberLive.Index.get_boolean_custom_field_value(member, boolean_field)
@ -1204,8 +1162,9 @@ defmodule MvWeb.MemberLive.IndexTest do
end
test "get_boolean_custom_field_value extracts false from Ash.Union format", %{conn: _conn} do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
boolean_field = create_boolean_custom_field()
member = create_member_with_boolean_value(%{}, boolean_field, false)
member = create_member_with_boolean_value(%{}, boolean_field, false, system_actor)
result = MvWeb.MemberLive.Index.get_boolean_custom_field_value(member, boolean_field)
@ -1214,6 +1173,7 @@ defmodule MvWeb.MemberLive.IndexTest do
test "get_boolean_custom_field_value extracts true from map format with _union_type and _union_value keys",
%{conn: _conn} do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
boolean_field = create_boolean_custom_field()
{:ok, member} =
@ -1223,7 +1183,7 @@ defmodule MvWeb.MemberLive.IndexTest do
last_name: "Member",
email: "test.member.#{System.unique_integer([:positive])}@example.com"
})
|> Ash.create()
|> Ash.create(actor: system_actor)
# Create CustomFieldValue with map format (Ash expects _union_type and _union_value)
{:ok, _cfv} =
@ -1233,10 +1193,10 @@ defmodule MvWeb.MemberLive.IndexTest do
custom_field_id: boolean_field.id,
value: %{"_union_type" => "boolean", "_union_value" => true}
})
|> Ash.create()
|> Ash.create(actor: system_actor)
# Reload member with custom field values
member = member |> Ash.load!(:custom_field_values)
member = member |> Ash.load!(:custom_field_values, actor: system_actor)
result = MvWeb.MemberLive.Index.get_boolean_custom_field_value(member, boolean_field)
@ -1246,6 +1206,7 @@ defmodule MvWeb.MemberLive.IndexTest do
test "get_boolean_custom_field_value returns nil when no CustomFieldValue exists", %{
conn: _conn
} do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
boolean_field = create_boolean_custom_field()
{:ok, member} =
@ -1255,10 +1216,10 @@ defmodule MvWeb.MemberLive.IndexTest do
last_name: "Member",
email: "test.member.#{System.unique_integer([:positive])}@example.com"
})
|> Ash.create()
|> Ash.create(actor: system_actor)
# Member has no custom field value for this field
member = member |> Ash.load!(:custom_field_values)
member = member |> Ash.load!(:custom_field_values, actor: system_actor)
result = MvWeb.MemberLive.Index.get_boolean_custom_field_value(member, boolean_field)
@ -1268,6 +1229,7 @@ defmodule MvWeb.MemberLive.IndexTest do
test "get_boolean_custom_field_value returns nil when CustomFieldValue has nil value", %{
conn: _conn
} do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
boolean_field = create_boolean_custom_field()
{:ok, member} =
@ -1277,7 +1239,7 @@ defmodule MvWeb.MemberLive.IndexTest do
last_name: "Member",
email: "test.member.#{System.unique_integer([:positive])}@example.com"
})
|> Ash.create()
|> Ash.create(actor: system_actor)
# Create CustomFieldValue with nil value (edge case)
{:ok, _cfv} =
@ -1287,9 +1249,9 @@ defmodule MvWeb.MemberLive.IndexTest do
custom_field_id: boolean_field.id,
value: nil
})
|> Ash.create()
|> Ash.create(actor: system_actor)
member = member |> Ash.load!(:custom_field_values)
member = member |> Ash.load!(:custom_field_values, actor: system_actor)
result = MvWeb.MemberLive.Index.get_boolean_custom_field_value(member, boolean_field)
@ -1299,6 +1261,7 @@ defmodule MvWeb.MemberLive.IndexTest do
test "get_boolean_custom_field_value returns nil for non-boolean CustomFieldValue", %{
conn: _conn
} do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
string_field = create_string_custom_field()
boolean_field = create_boolean_custom_field()
@ -1309,7 +1272,7 @@ defmodule MvWeb.MemberLive.IndexTest do
last_name: "Member",
email: "test.member.#{System.unique_integer([:positive])}@example.com"
})
|> Ash.create()
|> Ash.create(actor: system_actor)
# Create string custom field value (not boolean)
{:ok, _cfv} =
@ -1319,9 +1282,9 @@ defmodule MvWeb.MemberLive.IndexTest do
custom_field_id: string_field.id,
value: %{"_union_type" => "string", "_union_value" => "test"}
})
|> Ash.create()
|> Ash.create(actor: system_actor)
member = member |> Ash.load!(:custom_field_values)
member = member |> Ash.load!(:custom_field_values, actor: system_actor)
# Try to get boolean value from string field - should return nil
result = MvWeb.MemberLive.Index.get_boolean_custom_field_value(member, boolean_field)
@ -1332,13 +1295,24 @@ defmodule MvWeb.MemberLive.IndexTest do
# Tests for apply_boolean_custom_field_filters/2
test "apply_boolean_custom_field_filters filters members with true value and excludes false/without values",
%{conn: _conn} do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
boolean_field = create_boolean_custom_field()
member_with_true =
create_member_with_boolean_value(%{first_name: "TrueMember"}, boolean_field, true)
create_member_with_boolean_value(
%{first_name: "TrueMember"},
boolean_field,
true,
system_actor
)
member_with_false =
create_member_with_boolean_value(%{first_name: "FalseMember"}, boolean_field, false)
create_member_with_boolean_value(
%{first_name: "FalseMember"},
boolean_field,
false,
system_actor
)
{:ok, member_without_value} =
Mv.Membership.Member
@ -1347,7 +1321,7 @@ defmodule MvWeb.MemberLive.IndexTest do
last_name: "Member",
email: "novalue.member.#{System.unique_integer([:positive])}@example.com"
})
|> Ash.create()
|> Ash.create(actor: system_actor)
member_without_value = member_without_value |> Ash.load!(:custom_field_values)
@ -1370,13 +1344,24 @@ defmodule MvWeb.MemberLive.IndexTest do
test "apply_boolean_custom_field_filters filters members with false value and excludes true/without values",
%{conn: _conn} do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
boolean_field = create_boolean_custom_field()
member_with_true =
create_member_with_boolean_value(%{first_name: "TrueMember"}, boolean_field, true)
create_member_with_boolean_value(
%{first_name: "TrueMember"},
boolean_field,
true,
system_actor
)
member_with_false =
create_member_with_boolean_value(%{first_name: "FalseMember"}, boolean_field, false)
create_member_with_boolean_value(
%{first_name: "FalseMember"},
boolean_field,
false,
system_actor
)
{:ok, member_without_value} =
Mv.Membership.Member
@ -1385,9 +1370,10 @@ defmodule MvWeb.MemberLive.IndexTest do
last_name: "Member",
email: "novalue.member.#{System.unique_integer([:positive])}@example.com"
})
|> Ash.create()
|> Ash.create(actor: system_actor)
member_without_value = member_without_value |> Ash.load!(:custom_field_values)
member_without_value =
member_without_value |> Ash.load!(:custom_field_values, actor: system_actor)
members = [member_with_true, member_with_false, member_without_value]
filters = %{to_string(boolean_field.id) => false}
@ -1409,10 +1395,24 @@ defmodule MvWeb.MemberLive.IndexTest do
test "apply_boolean_custom_field_filters returns all members when filter map is empty", %{
conn: _conn
} do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
boolean_field = create_boolean_custom_field()
member1 = create_member_with_boolean_value(%{first_name: "Member1"}, boolean_field, true)
member2 = create_member_with_boolean_value(%{first_name: "Member2"}, boolean_field, false)
member1 =
create_member_with_boolean_value(
%{first_name: "Member1"},
boolean_field,
true,
system_actor
)
member2 =
create_member_with_boolean_value(
%{first_name: "Member2"},
boolean_field,
false,
system_actor
)
members = [member1, member2]
filters = %{}
@ -1435,6 +1435,7 @@ defmodule MvWeb.MemberLive.IndexTest do
test "apply_boolean_custom_field_filters applies multiple filters with AND logic", %{
conn: _conn
} do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
boolean_field1 = create_boolean_custom_field(%{name: "Field1"})
boolean_field2 = create_boolean_custom_field(%{name: "Field2"})
@ -1446,7 +1447,7 @@ defmodule MvWeb.MemberLive.IndexTest do
last_name: "Member",
email: "bothtrue.member.#{System.unique_integer([:positive])}@example.com"
})
|> Ash.create()
|> Ash.create(actor: system_actor)
{:ok, _cfv1} =
Mv.Membership.CustomFieldValue
@ -1455,7 +1456,7 @@ defmodule MvWeb.MemberLive.IndexTest do
custom_field_id: boolean_field1.id,
value: %{"_union_type" => "boolean", "_union_value" => true}
})
|> Ash.create()
|> Ash.create(actor: system_actor)
{:ok, _cfv2} =
Mv.Membership.CustomFieldValue
@ -1464,9 +1465,9 @@ defmodule MvWeb.MemberLive.IndexTest do
custom_field_id: boolean_field2.id,
value: %{"_union_type" => "boolean", "_union_value" => true}
})
|> Ash.create()
|> Ash.create(actor: system_actor)
member_both_true = member_both_true |> Ash.load!(:custom_field_values)
member_both_true = member_both_true |> Ash.load!(:custom_field_values, actor: system_actor)
# Member with field1 = true, field2 = false
{:ok, member_mixed} =
@ -1476,7 +1477,7 @@ defmodule MvWeb.MemberLive.IndexTest do
last_name: "Member",
email: "mixed.member.#{System.unique_integer([:positive])}@example.com"
})
|> Ash.create()
|> Ash.create(actor: system_actor)
{:ok, _cfv3} =
Mv.Membership.CustomFieldValue
@ -1485,7 +1486,7 @@ defmodule MvWeb.MemberLive.IndexTest do
custom_field_id: boolean_field1.id,
value: %{"_union_type" => "boolean", "_union_value" => true}
})
|> Ash.create()
|> Ash.create(actor: system_actor)
{:ok, _cfv4} =
Mv.Membership.CustomFieldValue
@ -1494,9 +1495,9 @@ defmodule MvWeb.MemberLive.IndexTest do
custom_field_id: boolean_field2.id,
value: %{"_union_type" => "boolean", "_union_value" => false}
})
|> Ash.create()
|> Ash.create(actor: system_actor)
member_mixed = member_mixed |> Ash.load!(:custom_field_values)
member_mixed = member_mixed |> Ash.load!(:custom_field_values, actor: system_actor)
members = [member_both_true, member_mixed]
@ -1522,10 +1523,17 @@ defmodule MvWeb.MemberLive.IndexTest do
test "apply_boolean_custom_field_filters ignores filter with non-existent custom field ID", %{
conn: _conn
} do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
boolean_field = create_boolean_custom_field()
fake_id = Ecto.UUID.generate()
member = create_member_with_boolean_value(%{first_name: "Member"}, boolean_field, true)
member =
create_member_with_boolean_value(
%{first_name: "Member"},
boolean_field,
true,
system_actor
)
members = [member]
filters = %{fake_id => true}
@ -1545,14 +1553,25 @@ defmodule MvWeb.MemberLive.IndexTest do
# Integration tests for boolean custom field filters in load_members
test "boolean filter integration filters members by boolean custom field value via URL parameter",
%{conn: conn} do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
conn = conn_with_oidc_user(conn)
boolean_field = create_boolean_custom_field()
_member_with_true =
create_member_with_boolean_value(%{first_name: "TrueMember"}, boolean_field, true)
create_member_with_boolean_value(
%{first_name: "TrueMember"},
boolean_field,
true,
system_actor
)
_member_with_false =
create_member_with_boolean_value(%{first_name: "FalseMember"}, boolean_field, false)
create_member_with_boolean_value(
%{first_name: "FalseMember"},
boolean_field,
false,
system_actor
)
{:ok, _member_without_value} =
Mv.Membership.Member
@ -1561,7 +1580,7 @@ defmodule MvWeb.MemberLive.IndexTest do
last_name: "Member",
email: "novalue.member.#{System.unique_integer([:positive])}@example.com"
})
|> Ash.create()
|> Ash.create(actor: system_actor)
# Test true filter
{:ok, _view, html_true} =
@ -1581,9 +1600,10 @@ defmodule MvWeb.MemberLive.IndexTest do
end
test "boolean filter integration works together with cycle_status_filter", %{conn: conn} do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
conn = conn_with_oidc_user(conn)
boolean_field = create_boolean_custom_field()
fee_type = create_fee_type(%{interval: :yearly})
fee_type = create_fee_type(%{interval: :yearly}, system_actor)
today = Date.utc_today()
last_year_start = Date.new!(today.year - 1, 1, 1)
@ -1596,7 +1616,7 @@ defmodule MvWeb.MemberLive.IndexTest do
email: "paidtrue.member.#{System.unique_integer([:positive])}@example.com",
membership_fee_type_id: fee_type.id
})
|> Ash.create()
|> Ash.create(actor: system_actor)
{:ok, _cfv} =
Mv.Membership.CustomFieldValue
@ -1605,9 +1625,14 @@ defmodule MvWeb.MemberLive.IndexTest do
custom_field_id: boolean_field.id,
value: %{"_union_type" => "boolean", "_union_value" => true}
})
|> Ash.create()
|> Ash.create(actor: system_actor)
create_cycle(member_paid_true, fee_type, %{cycle_start: last_year_start, status: :paid})
create_cycle(
member_paid_true,
fee_type,
%{cycle_start: last_year_start, status: :paid},
system_actor
)
# Member with true boolean value but unpaid status
{:ok, member_unpaid_true} =
@ -1618,7 +1643,7 @@ defmodule MvWeb.MemberLive.IndexTest do
email: "unpaidtrue.member.#{System.unique_integer([:positive])}@example.com",
membership_fee_type_id: fee_type.id
})
|> Ash.create()
|> Ash.create(actor: system_actor)
{:ok, _cfv2} =
Mv.Membership.CustomFieldValue
@ -1627,9 +1652,14 @@ defmodule MvWeb.MemberLive.IndexTest do
custom_field_id: boolean_field.id,
value: %{"_union_type" => "boolean", "_union_value" => true}
})
|> Ash.create()
|> Ash.create(actor: system_actor)
create_cycle(member_unpaid_true, fee_type, %{cycle_start: last_year_start, status: :unpaid})
create_cycle(
member_unpaid_true,
fee_type,
%{cycle_start: last_year_start, status: :unpaid},
system_actor
)
# Test both filters together
{:ok, _view, html} =
@ -1641,14 +1671,25 @@ defmodule MvWeb.MemberLive.IndexTest do
end
test "boolean filter integration works together with search query", %{conn: conn} do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
conn = conn_with_oidc_user(conn)
boolean_field = create_boolean_custom_field()
_member_with_true =
create_member_with_boolean_value(%{first_name: "TrueMember"}, boolean_field, true)
create_member_with_boolean_value(
%{first_name: "TrueMember"},
boolean_field,
true,
system_actor
)
_member_with_false =
create_member_with_boolean_value(%{first_name: "FalseMember"}, boolean_field, false)
create_member_with_boolean_value(
%{first_name: "FalseMember"},
boolean_field,
false,
system_actor
)
# Test search + boolean filter
{:ok, _view, html} =
@ -1660,16 +1701,27 @@ defmodule MvWeb.MemberLive.IndexTest do
end
test "boolean filter works even when custom field is not visible in overview", %{conn: conn} do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
conn = conn_with_oidc_user(conn)
# Create boolean field with show_in_overview: false
boolean_field = create_boolean_custom_field(%{show_in_overview: false})
_member_with_true =
create_member_with_boolean_value(%{first_name: "TrueMember"}, boolean_field, true)
create_member_with_boolean_value(
%{first_name: "TrueMember"},
boolean_field,
true,
system_actor
)
_member_with_false =
create_member_with_boolean_value(%{first_name: "FalseMember"}, boolean_field, false)
create_member_with_boolean_value(
%{first_name: "FalseMember"},
boolean_field,
false,
system_actor
)
{:ok, _member_without_value} =
Mv.Membership.Member
@ -1678,7 +1730,7 @@ defmodule MvWeb.MemberLive.IndexTest do
last_name: "Member",
email: "novalue.member.#{System.unique_integer([:positive])}@example.com"
})
|> Ash.create()
|> Ash.create(actor: system_actor)
# Test that filter works even though field is not visible in overview
{:ok, _view, html_true} =
@ -1723,6 +1775,7 @@ defmodule MvWeb.MemberLive.IndexTest do
end
test "boolean filter performance with 150 members", %{conn: conn} do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
conn = conn_with_oidc_user(conn)
boolean_field = create_boolean_custom_field()
@ -1735,7 +1788,8 @@ defmodule MvWeb.MemberLive.IndexTest do
email: "truemember#{i}@example.com"
},
boolean_field,
true
true,
system_actor
)
end)
@ -1747,7 +1801,8 @@ defmodule MvWeb.MemberLive.IndexTest do
email: "falsemember#{i}@example.com"
},
boolean_field,
false
false,
system_actor
)
end)