From 15a7c615d68838ee9e2dca6ae04bb346fc5380a0 Mon Sep 17 00:00:00 2001 From: Moritz Date: Sat, 24 Jan 2026 02:39:06 +0100 Subject: [PATCH] Fix rebase conflict: Add actor parameter to helper functions in index_test.exs --- test/mv_web/member_live/index_test.exs | 259 +++++++++++++++---------- 1 file changed, 157 insertions(+), 102 deletions(-) diff --git a/test/mv_web/member_live/index_test.exs b/test/mv_web/member_live/index_test.exs index bf412d8..0f3d03b 100644 --- a/test/mv_web/member_live/index_test.exs +++ b/test/mv_web/member_live/index_test.exs @@ -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)