[Refactor] Remove NoActor bypass #367

Merged
moritz merged 15 commits from refactor/remove_noactor into main 2026-01-24 14:56:45 +01:00
2 changed files with 67 additions and 64 deletions
Showing only changes of commit fcca4b0b89 - Show all commits

View file

@ -15,9 +15,8 @@ defmodule MvWeb.MembershipFeeTypeLive.IndexTest do
# No custom setup needed # No custom setup needed
# Helper to create a membership fee type # Helper to create a membership fee type
defp create_fee_type(attrs) do # Uses admin_user to test permissions (UI-/Permissions-nah)
system_actor = Mv.Helpers.SystemActor.get_system_actor() defp create_fee_type(attrs, admin_user) do
default_attrs = %{ default_attrs = %{
name: "Test Fee Type #{System.unique_integer([:positive])}", name: "Test Fee Type #{System.unique_integer([:positive])}",
amount: Decimal.new("50.00"), amount: Decimal.new("50.00"),
@ -28,7 +27,7 @@ defmodule MvWeb.MembershipFeeTypeLive.IndexTest do
MembershipFeeType MembershipFeeType
|> Ash.Changeset.for_create(:create, attrs) |> Ash.Changeset.for_create(:create, attrs)
|> Ash.create!(actor: system_actor) |> Ash.create!(actor: admin_user)
end end
# Helper to create a member # Helper to create a member
@ -50,12 +49,21 @@ defmodule MvWeb.MembershipFeeTypeLive.IndexTest do
end end
describe "list display" do describe "list display" do
test "displays all membership fee types with correct data", %{conn: conn} do test "displays all membership fee types with correct data", %{
conn: conn,
current_user: admin_user
} do
_fee_type1 = _fee_type1 =
create_fee_type(%{name: "Regular", amount: Decimal.new("60.00"), interval: :yearly}) create_fee_type(
%{name: "Regular", amount: Decimal.new("60.00"), interval: :yearly},
admin_user
)
_fee_type2 = _fee_type2 =
create_fee_type(%{name: "Reduced", amount: Decimal.new("30.00"), interval: :yearly}) create_fee_type(
%{name: "Reduced", amount: Decimal.new("30.00"), interval: :yearly},
admin_user
)
{:ok, _view, html} = live(conn, "/membership_fee_types") {:ok, _view, html} = live(conn, "/membership_fee_types")
@ -67,7 +75,7 @@ defmodule MvWeb.MembershipFeeTypeLive.IndexTest do
end end
test "member count column shows correct count", %{conn: conn, current_user: admin_user} do test "member count column shows correct count", %{conn: conn, current_user: admin_user} do
fee_type = create_fee_type(%{interval: :yearly}) fee_type = create_fee_type(%{interval: :yearly}, admin_user)
# Create 3 members with this fee type # Create 3 members with this fee type
Enum.each(1..3, fn _ -> Enum.each(1..3, fn _ ->
@ -90,8 +98,8 @@ defmodule MvWeb.MembershipFeeTypeLive.IndexTest do
assert to == "/membership_fee_types/new" assert to == "/membership_fee_types/new"
end end
test "edit button per row navigates to edit form", %{conn: conn} do test "edit button per row navigates to edit form", %{conn: conn, current_user: admin_user} do
fee_type = create_fee_type(%{interval: :yearly}) fee_type = create_fee_type(%{interval: :yearly}, admin_user)
{:ok, view, _html} = live(conn, "/membership_fee_types") {:ok, view, _html} = live(conn, "/membership_fee_types")
@ -106,7 +114,7 @@ defmodule MvWeb.MembershipFeeTypeLive.IndexTest do
describe "delete functionality" do describe "delete functionality" do
test "delete button disabled if type is in use", %{conn: conn, current_user: admin_user} do test "delete button disabled if type is in use", %{conn: conn, current_user: admin_user} do
fee_type = create_fee_type(%{interval: :yearly}) fee_type = create_fee_type(%{interval: :yearly}, admin_user)
create_member(%{membership_fee_type_id: fee_type.id}, admin_user) create_member(%{membership_fee_type_id: fee_type.id}, admin_user)
{:ok, _view, html} = live(conn, "/membership_fee_types") {:ok, _view, html} = live(conn, "/membership_fee_types")
@ -115,8 +123,8 @@ defmodule MvWeb.MembershipFeeTypeLive.IndexTest do
assert html =~ "disabled" || html =~ "cursor-not-allowed" assert html =~ "disabled" || html =~ "cursor-not-allowed"
end end
test "delete button works if type is not in use", %{conn: conn} do test "delete button works if type is not in use", %{conn: conn, current_user: admin_user} do
fee_type = create_fee_type(%{interval: :yearly}) fee_type = create_fee_type(%{interval: :yearly}, admin_user)
# No members assigned # No members assigned
{:ok, view, _html} = live(conn, "/membership_fee_types") {:ok, view, _html} = live(conn, "/membership_fee_types")
@ -126,9 +134,12 @@ defmodule MvWeb.MembershipFeeTypeLive.IndexTest do
|> element("button[phx-click='delete'][phx-value-id='#{fee_type.id}']") |> element("button[phx-click='delete'][phx-value-id='#{fee_type.id}']")
|> render_click() |> render_click()
# Type should be deleted # Type should be deleted - use admin_user to test permissions
assert {:error, %Ash.Error.Invalid{errors: [%Ash.Error.Query.NotFound{}]}} = assert {:error, %Ash.Error.Invalid{errors: [%Ash.Error.Query.NotFound{}]}} =
Ash.get(MembershipFeeType, fee_type.id, domain: Mv.MembershipFees) Ash.get(MembershipFeeType, fee_type.id,
domain: Mv.MembershipFees,
actor: admin_user
)
end end
end end

View file

@ -12,9 +12,8 @@ defmodule MvWeb.MemberLive.FormMembershipFeeTypeTest do
require Ash.Query require Ash.Query
# Helper to create a membership fee type # Helper to create a membership fee type
defp create_fee_type(attrs) do # Uses admin_user to test permissions (UI-/Permissions-nah)
system_actor = Mv.Helpers.SystemActor.get_system_actor() defp create_fee_type(attrs, admin_user) do
default_attrs = %{ default_attrs = %{
name: "Test Fee Type #{System.unique_integer([:positive])}", name: "Test Fee Type #{System.unique_integer([:positive])}",
amount: Decimal.new("50.00"), amount: Decimal.new("50.00"),
@ -25,13 +24,12 @@ defmodule MvWeb.MemberLive.FormMembershipFeeTypeTest do
MembershipFeeType MembershipFeeType
|> Ash.Changeset.for_create(:create, attrs) |> Ash.Changeset.for_create(:create, attrs)
|> Ash.create!(actor: system_actor) |> Ash.create!(actor: admin_user)
end end
# Helper to create a member # Helper to create a member
defp create_member(attrs) do # Uses admin_user to test permissions (UI-/Permissions-nah)
system_actor = Mv.Helpers.SystemActor.get_system_actor() defp create_member(attrs, admin_user) do
default_attrs = %{ default_attrs = %{
first_name: "Test", first_name: "Test",
last_name: "Member", last_name: "Member",
@ -42,7 +40,7 @@ defmodule MvWeb.MemberLive.FormMembershipFeeTypeTest do
Member Member
|> Ash.Changeset.for_create(:create_member, attrs) |> Ash.Changeset.for_create(:create_member, attrs)
|> Ash.create!(actor: system_actor) |> Ash.create!(actor: admin_user)
end end
describe "membership fee type dropdown" do describe "membership fee type dropdown" do
@ -54,9 +52,9 @@ defmodule MvWeb.MemberLive.FormMembershipFeeTypeTest do
html =~ "Beitragsart" html =~ "Beitragsart"
end end
test "shows available types", %{conn: conn} do test "shows available types", %{conn: conn, current_user: admin_user} do
_fee_type1 = create_fee_type(%{name: "Type 1", interval: :yearly}) _fee_type1 = create_fee_type(%{name: "Type 1", interval: :yearly}, admin_user)
_fee_type2 = create_fee_type(%{name: "Type 2", interval: :yearly}) _fee_type2 = create_fee_type(%{name: "Type 2", interval: :yearly}, admin_user)
{:ok, _view, html} = live(conn, "/members/new") {:ok, _view, html} = live(conn, "/members/new")
@ -64,11 +62,14 @@ defmodule MvWeb.MemberLive.FormMembershipFeeTypeTest do
assert html =~ "Type 2" assert html =~ "Type 2"
end end
test "filters to same interval types if member has type", %{conn: conn} do test "filters to same interval types if member has type", %{
yearly_type = create_fee_type(%{name: "Yearly Type", interval: :yearly}) conn: conn,
_monthly_type = create_fee_type(%{name: "Monthly Type", interval: :monthly}) current_user: admin_user
} do
yearly_type = create_fee_type(%{name: "Yearly Type", interval: :yearly}, admin_user)
_monthly_type = create_fee_type(%{name: "Monthly Type", interval: :monthly}, admin_user)
member = create_member(%{membership_fee_type_id: yearly_type.id}) member = create_member(%{membership_fee_type_id: yearly_type.id}, admin_user)
{:ok, _view, html} = live(conn, "/members/#{member.id}/edit") {:ok, _view, html} = live(conn, "/members/#{member.id}/edit")
@ -77,11 +78,11 @@ defmodule MvWeb.MemberLive.FormMembershipFeeTypeTest do
refute html =~ "Monthly Type" refute html =~ "Monthly Type"
end end
test "shows warning if different interval selected", %{conn: conn} do test "shows warning if different interval selected", %{conn: conn, current_user: admin_user} do
yearly_type = create_fee_type(%{name: "Yearly Type", interval: :yearly}) yearly_type = create_fee_type(%{name: "Yearly Type", interval: :yearly}, admin_user)
monthly_type = create_fee_type(%{name: "Monthly Type", interval: :monthly}) monthly_type = create_fee_type(%{name: "Monthly Type", interval: :monthly}, admin_user)
member = create_member(%{membership_fee_type_id: yearly_type.id}) member = create_member(%{membership_fee_type_id: yearly_type.id}, admin_user)
{:ok, _view, html} = live(conn, "/members/#{member.id}/edit") {:ok, _view, html} = live(conn, "/members/#{member.id}/edit")
@ -92,11 +93,11 @@ defmodule MvWeb.MemberLive.FormMembershipFeeTypeTest do
assert html =~ yearly_type.id assert html =~ yearly_type.id
end end
test "warning cleared if same interval selected", %{conn: conn} do test "warning cleared if same interval selected", %{conn: conn, current_user: admin_user} do
yearly_type1 = create_fee_type(%{name: "Yearly Type 1", interval: :yearly}) yearly_type1 = create_fee_type(%{name: "Yearly Type 1", interval: :yearly}, admin_user)
yearly_type2 = create_fee_type(%{name: "Yearly Type 2", interval: :yearly}) yearly_type2 = create_fee_type(%{name: "Yearly Type 2", interval: :yearly}, admin_user)
member = create_member(%{membership_fee_type_id: yearly_type1.id}) member = create_member(%{membership_fee_type_id: yearly_type1.id}, admin_user)
{:ok, view, _html} = live(conn, "/members/#{member.id}/edit") {:ok, view, _html} = live(conn, "/members/#{member.id}/edit")
@ -109,8 +110,8 @@ defmodule MvWeb.MemberLive.FormMembershipFeeTypeTest do
refute html =~ "Warning" || html =~ "Warnung" refute html =~ "Warning" || html =~ "Warnung"
end end
test "form saves with selected membership fee type", %{conn: conn} do test "form saves with selected membership fee type", %{conn: conn, current_user: admin_user} do
fee_type = create_fee_type(%{interval: :yearly}) fee_type = create_fee_type(%{interval: :yearly}, admin_user)
{:ok, view, _html} = live(conn, "/members/new") {:ok, view, _html} = live(conn, "/members/new")
@ -126,29 +127,26 @@ defmodule MvWeb.MemberLive.FormMembershipFeeTypeTest do
|> form("#member-form", form_data) |> form("#member-form", form_data)
|> render_submit() |> render_submit()
# Verify member was created with fee type # Verify member was created with fee type - use admin_user to test permissions
system_actor = Mv.Helpers.SystemActor.get_system_actor()
member = member =
Member Member
|> Ash.Query.filter(email == ^form_data["member[email]"]) |> Ash.Query.filter(email == ^form_data["member[email]"])
|> Ash.read_one!(actor: system_actor) |> Ash.read_one!(actor: admin_user)
assert member.membership_fee_type_id == fee_type.id assert member.membership_fee_type_id == fee_type.id
end end
test "new members get default membership fee type", %{conn: conn} do test "new members get default membership fee type", %{conn: conn, current_user: admin_user} do
# Set default fee type in settings # Set default fee type in settings
fee_type = create_fee_type(%{interval: :yearly}) fee_type = create_fee_type(%{interval: :yearly}, admin_user)
system_actor = Mv.Helpers.SystemActor.get_system_actor()
{:ok, settings} = Mv.Membership.get_settings() {:ok, settings} = Mv.Membership.get_settings()
settings settings
|> Ash.Changeset.for_update(:update_membership_fee_settings, %{ |> Ash.Changeset.for_update(:update_membership_fee_settings, %{
default_membership_fee_type_id: fee_type.id default_membership_fee_type_id: fee_type.id
}) })
|> Ash.update!(actor: system_actor) |> Ash.update!(actor: admin_user)
{:ok, view, _html} = live(conn, "/members/new") {:ok, view, _html} = live(conn, "/members/new")
@ -163,9 +161,7 @@ defmodule MvWeb.MemberLive.FormMembershipFeeTypeTest do
conn: conn, conn: conn,
current_user: admin_user current_user: admin_user
} do } do
system_actor = Mv.Helpers.SystemActor.get_system_actor() # Create custom field - use admin_user to test permissions
# Create custom field
custom_field = custom_field =
Mv.Membership.CustomField Mv.Membership.CustomField
|> Ash.Changeset.for_create(:create, %{ |> Ash.Changeset.for_create(:create, %{
@ -173,11 +169,11 @@ defmodule MvWeb.MemberLive.FormMembershipFeeTypeTest do
value_type: :string, value_type: :string,
required: false required: false
}) })
|> Ash.create!(actor: system_actor) |> Ash.create!(actor: admin_user)
# Create two fee types with same interval # Create two fee types with same interval
fee_type1 = create_fee_type(%{name: "Type 1", interval: :yearly}) fee_type1 = create_fee_type(%{name: "Type 1", interval: :yearly}, admin_user)
fee_type2 = create_fee_type(%{name: "Type 2", interval: :yearly}) fee_type2 = create_fee_type(%{name: "Type 2", interval: :yearly}, admin_user)
# Create member with fee type 1 and custom field value # Create member with fee type 1 and custom field value
member = member =
@ -212,9 +208,7 @@ defmodule MvWeb.MemberLive.FormMembershipFeeTypeTest do
end end
test "union/typed values roundtrip correctly", %{conn: conn, current_user: admin_user} do test "union/typed values roundtrip correctly", %{conn: conn, current_user: admin_user} do
system_actor = Mv.Helpers.SystemActor.get_system_actor() # Create date custom field - use admin_user to test permissions
# Create date custom field
custom_field = custom_field =
Mv.Membership.CustomField Mv.Membership.CustomField
|> Ash.Changeset.for_create(:create, %{ |> Ash.Changeset.for_create(:create, %{
@ -222,9 +216,9 @@ defmodule MvWeb.MemberLive.FormMembershipFeeTypeTest do
value_type: :date, value_type: :date,
required: false required: false
}) })
|> Ash.create!(actor: system_actor) |> Ash.create!(actor: admin_user)
fee_type = create_fee_type(%{interval: :yearly}) fee_type = create_fee_type(%{interval: :yearly}, admin_user)
# Create member with date custom field value # Create member with date custom field value
member = member =
@ -261,9 +255,7 @@ defmodule MvWeb.MemberLive.FormMembershipFeeTypeTest do
end end
test "removing custom field values works correctly", %{conn: conn, current_user: admin_user} do test "removing custom field values works correctly", %{conn: conn, current_user: admin_user} do
system_actor = Mv.Helpers.SystemActor.get_system_actor() # Create custom field - use admin_user to test permissions
# Create custom field
custom_field = custom_field =
Mv.Membership.CustomField Mv.Membership.CustomField
|> Ash.Changeset.for_create(:create, %{ |> Ash.Changeset.for_create(:create, %{
@ -271,9 +263,9 @@ defmodule MvWeb.MemberLive.FormMembershipFeeTypeTest do
value_type: :string, value_type: :string,
required: false required: false
}) })
|> Ash.create!(actor: system_actor) |> Ash.create!(actor: admin_user)
fee_type = create_fee_type(%{interval: :yearly}) fee_type = create_fee_type(%{interval: :yearly}, admin_user)
# Create member with custom field value # Create member with custom field value
member = member =