From cbd37ecb2c38f27a75f4ca75d2c5a4f2588a18b3 Mon Sep 17 00:00:00 2001 From: Moritz Date: Tue, 16 Jun 2026 15:34:35 +0200 Subject: [PATCH] style: order module directives per StrictModuleLayout --- lib/accounts/user.ex | 3 ++- .../user/validations/oidc_email_collision.ex | 3 ++- lib/membership/email.ex | 4 ++++ lib/membership/group.ex | 3 ++- lib/membership/member.ex | 5 +++-- lib/membership/membership.ex | 4 +++- lib/membership/setting.ex | 4 ++-- .../tasks/join_requests.cleanup_expired.ex | 7 +++---- .../send_new_user_confirmation_email.ex | 5 +++-- .../user/senders/send_password_reset_email.ex | 5 +++-- lib/mv/authorization/actor.ex | 4 ++-- lib/mv/authorization/checks/has_permission.ex | 5 ++++- lib/mv/email_sync/helpers.ex | 3 ++- lib/mv/helpers/system_actor.ex | 4 ++-- lib/mv/mailer.ex | 5 +++-- lib/mv/membership/import/column_resolver.ex | 4 ++-- lib/mv/membership/import/member_csv.ex | 19 ++++++++----------- lib/mv/membership/member_export/build.ex | 3 ++- lib/mv/membership/members_pdf.ex | 4 ++-- lib/mv/membership_fees/cycle_generator.ex | 14 +++++++------- lib/mv/release.ex | 4 ++-- lib/mv/statistics.ex | 6 +++--- .../sync_linked_member_after_user_change.ex | 3 ++- lib/mv/vereinfacht/vereinfacht.ex | 4 +++- lib/mv_web/components/table_components.ex | 3 ++- .../controllers/import_template_controller.ex | 4 ++-- .../controllers/member_export_controller.ex | 6 +++--- .../member_pdf_export_controller.ex | 7 +++---- .../live/auth/link_oidc_account_live.ex | 5 +++-- lib/mv_web/live/global_settings_live.ex | 3 ++- lib/mv_web/live/group_live/show.ex | 6 +++--- lib/mv_web/live/import_live/components.ex | 4 ++-- lib/mv_web/live/join_request_live/index.ex | 6 +++--- lib/mv_web/live/join_request_live/show.ex | 6 +++--- lib/mv_web/live/member_live/form.ex | 3 ++- lib/mv_web/live/member_live/index.ex | 5 +++-- .../live/member_live/index/date_filter.ex | 3 ++- .../show/membership_fees_component.ex | 5 +++-- .../live/membership_fee_settings_live.ex | 4 ++-- .../live/membership_fee_type_live/form.ex | 4 ++-- .../live/membership_fee_type_live/index.ex | 4 ++-- lib/mv_web/live/role_live/form.ex | 4 ++-- lib/mv_web/live/role_live/index.ex | 4 ++-- lib/mv_web/live/role_live/show.ex | 6 +++--- lib/mv_web/live/statistics_live.ex | 5 +++-- lib/mv_web/live/user_live/form.ex | 8 ++++---- lib/mv_web/live_user_auth.ex | 3 ++- .../group_database_constraints_test.exs | 3 ++- test/membership/group_test.exs | 3 ++- .../join_request_approval_domain_test.exs | 3 ++- test/membership/join_request_test.exs | 3 ++- test/membership/member_group_test.exs | 3 ++- .../member_groups_relationship_test.exs | 3 ++- .../has_permission_fail_closed_test.exs | 4 ++-- test/mv/statistics_test.exs | 3 ++- .../member_filter_component_test.exs | 3 ++- .../helpers/membership_fee_helpers_test.exs | 4 ++-- .../live/custom_field_live/deletion_test.exs | 3 ++- .../live/custom_field_live/form_test.exs | 3 ++- test/mv_web/live/group_live/form_test.exs | 3 ++- test/mv_web/live/group_live/index_test.exs | 3 ++- .../live/group_live/integration_test.exs | 8 +++++--- .../group_live/show_accessibility_test.exs | 3 ++- .../live/group_live/show_add_member_test.exs | 5 +++-- .../show_add_remove_members_test.exs | 3 ++- .../group_live/show_authorization_test.exs | 3 ++- .../live/group_live/show_integration_test.exs | 3 ++- .../group_live/show_member_search_test.exs | 3 ++- .../group_live/show_remove_member_test.exs | 3 ++- test/mv_web/live/group_live/show_test.exs | 6 ++++-- .../live/member_live/deactivate_test.exs | 3 ++- test/mv_web/live/role_live/show_test.exs | 6 ++++-- test/mv_web/live/user_live/show_test.exs | 6 ++++-- ...index_custom_fields_accessibility_test.exs | 3 ++- .../index_custom_fields_display_test.exs | 3 ++- .../index_custom_fields_edge_cases_test.exs | 3 ++- .../index_custom_fields_sorting_test.exs | 3 ++- .../index_field_visibility_test.exs | 3 ++- .../index_groups_accessibility_test.exs | 3 ++- .../member_live/index_groups_display_test.exs | 3 ++- .../member_live/index_groups_filter_test.exs | 3 ++- .../index_groups_integration_test.exs | 3 ++- .../index_groups_performance_test.exs | 3 ++- .../member_live/index_groups_sorting_test.exs | 3 ++- .../index_groups_url_params_test.exs | 3 ++- test/mv_web/member_live/index_test.exs | 3 ++- .../member_live/show_groups_display_test.exs | 6 ++++-- test/mv_web/member_live/show_test.exs | 6 ++++-- 88 files changed, 225 insertions(+), 155 deletions(-) diff --git a/lib/accounts/user.ex b/lib/accounts/user.ex index 0127796..f7f59ff 100644 --- a/lib/accounts/user.ex +++ b/lib/accounts/user.ex @@ -8,7 +8,6 @@ defmodule Mv.Accounts.User do extensions: [AshAuthentication], authorizers: [Ash.Policy.Authorizer] - require Ash.Query import Ash.Expr alias Ash.Resource.Preparation.Builtins @@ -16,6 +15,8 @@ defmodule Mv.Accounts.User do alias Mv.Helpers.SystemActor alias Mv.OidcRoleSync + require Ash.Query + postgres do table "users" repo Mv.Repo diff --git a/lib/accounts/user/validations/oidc_email_collision.ex b/lib/accounts/user/validations/oidc_email_collision.ex index 7ae8510..87e8250 100644 --- a/lib/accounts/user/validations/oidc_email_collision.ex +++ b/lib/accounts/user/validations/oidc_email_collision.ex @@ -24,12 +24,13 @@ defmodule Mv.Accounts.User.Validations.OidcEmailCollision do - Allow (new user will be created) """ use Ash.Resource.Validation - require Logger alias Mv.Accounts.User alias Mv.Accounts.User.Errors.PasswordVerificationRequired alias Mv.Helpers.SystemActor + require Logger + @impl true def init(opts), do: {:ok, opts} diff --git a/lib/membership/email.ex b/lib/membership/email.ex index 730ccd7..4dfbcc8 100644 --- a/lib/membership/email.ex +++ b/lib/membership/email.ex @@ -38,6 +38,10 @@ defmodule Mv.Membership.Email do @min_length 5 @max_length 254 + # These compile-time constants are referenced by the `use` options below, so + # they must be declared first; StrictModuleLayout cannot be satisfied by + # reordering here without breaking the macro expansion. + # credo:disable-for-next-line Credo.Check.Readability.StrictModuleLayout use Ash.Type.NewType, subtype_of: :string, constraints: [ diff --git a/lib/membership/group.ex b/lib/membership/group.ex index d468166..fcfe077 100644 --- a/lib/membership/group.ex +++ b/lib/membership/group.ex @@ -39,9 +39,10 @@ defmodule Mv.Membership.Group do data_layer: AshPostgres.DataLayer, authorizers: [Ash.Policy.Authorizer] - require Ash.Query alias Mv.Helpers alias Mv.Helpers.SystemActor + + require Ash.Query require Logger postgres do diff --git a/lib/membership/member.ex b/lib/membership/member.ex index cddc23f..0f67a00 100644 --- a/lib/membership/member.ex +++ b/lib/membership/member.ex @@ -37,9 +37,9 @@ defmodule Mv.Membership.Member do data_layer: AshPostgres.DataLayer, authorizers: [Ash.Policy.Authorizer] - import Bitwise - require Ash.Query import Ash.Expr + import Bitwise + alias Ecto.Adapters.SQL, as: EctoSQL alias Mv.Helpers alias Mv.Helpers.SystemActor @@ -49,6 +49,7 @@ defmodule Mv.Membership.Member do alias Mv.MembershipFees.MembershipFeeCycle alias Mv.Repo + require Ash.Query require Logger @typedoc "An `Mv.Membership.Member` resource record." diff --git a/lib/membership/membership.ex b/lib/membership/membership.ex index 72be69b..2a5b17f 100644 --- a/lib/membership/membership.ex +++ b/lib/membership/membership.ex @@ -26,13 +26,15 @@ defmodule Mv.Membership do use Ash.Domain, extensions: [AshAdmin.Domain, AshPhoenix] - require Ash.Query import Ash.Expr + alias Ash.Error.Query.NotFound, as: NotFoundError alias Mv.Helpers.SystemActor alias Mv.Membership.JoinRequest alias Mv.Membership.Member alias Mv.Membership.SettingsCache + + require Ash.Query require Logger admin do diff --git a/lib/membership/setting.ex b/lib/membership/setting.ex index 83c5c8b..f319685 100644 --- a/lib/membership/setting.ex +++ b/lib/membership/setting.ex @@ -65,12 +65,12 @@ defmodule Mv.Membership.Setting do data_layer: AshPostgres.DataLayer, primary_read_warning?: false + alias Ash.Resource.Info, as: ResourceInfo + # Used in join_form_field_ids validation (compile-time to avoid recompiling regex and list on every validation) @uuid_pattern ~r/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i @valid_join_form_member_fields Mv.Constants.member_fields() |> Enum.map(&Atom.to_string/1) - alias Ash.Resource.Info, as: ResourceInfo - postgres do table "settings" repo Mv.Repo diff --git a/lib/mix/tasks/join_requests.cleanup_expired.ex b/lib/mix/tasks/join_requests.cleanup_expired.ex index 0d1823c..0cc8a8b 100644 --- a/lib/mix/tasks/join_requests.cleanup_expired.ex +++ b/lib/mix/tasks/join_requests.cleanup_expired.ex @@ -1,4 +1,5 @@ defmodule Mix.Tasks.JoinRequests.CleanupExpired do + @shortdoc "Deletes join requests in pending_confirmation with expired confirmation token" @moduledoc """ Hard-deletes JoinRequests in status `pending_confirmation` whose confirmation link has expired. @@ -16,12 +17,10 @@ defmodule Mix.Tasks.JoinRequests.CleanupExpired do """ use Mix.Task - require Ash.Query - require Logger - alias Mv.Membership.JoinRequest - @shortdoc "Deletes join requests in pending_confirmation with expired confirmation token" + require Ash.Query + require Logger @impl Mix.Task def run(_args) do diff --git a/lib/mv/accounts/user/senders/send_new_user_confirmation_email.ex b/lib/mv/accounts/user/senders/send_new_user_confirmation_email.ex index 7312b91..30dd381 100644 --- a/lib/mv/accounts/user/senders/send_new_user_confirmation_email.ex +++ b/lib/mv/accounts/user/senders/send_new_user_confirmation_email.ex @@ -13,13 +13,14 @@ defmodule Mv.Accounts.User.Senders.SendNewUserConfirmationEmail do layout: {MvWeb.EmailLayoutView, "layout.html"} use MvWeb, :verified_routes - import Swoosh.Email use Gettext, backend: MvWeb.Gettext, otp_app: :mv - require Logger + import Swoosh.Email alias Mv.Mailer + require Logger + @doc """ Sends a confirmation email to a new user. diff --git a/lib/mv/accounts/user/senders/send_password_reset_email.ex b/lib/mv/accounts/user/senders/send_password_reset_email.ex index e276e20..8527f04 100644 --- a/lib/mv/accounts/user/senders/send_password_reset_email.ex +++ b/lib/mv/accounts/user/senders/send_password_reset_email.ex @@ -13,13 +13,14 @@ defmodule Mv.Accounts.User.Senders.SendPasswordResetEmail do layout: {MvWeb.EmailLayoutView, "layout.html"} use MvWeb, :verified_routes - import Swoosh.Email use Gettext, backend: MvWeb.Gettext, otp_app: :mv - require Logger + import Swoosh.Email alias Mv.Mailer + require Logger + @doc """ Sends a password reset email to a user. diff --git a/lib/mv/authorization/actor.ex b/lib/mv/authorization/actor.ex index edc6b8b..b7f8844 100644 --- a/lib/mv/authorization/actor.ex +++ b/lib/mv/authorization/actor.ex @@ -49,10 +49,10 @@ defmodule Mv.Authorization.Actor do adds complexity and potential for inconsistency. """ - require Logger - alias Mv.Helpers.SystemActor + require Logger + @doc """ Ensures the actor (User) has their `:role` relationship loaded. diff --git a/lib/mv/authorization/checks/has_permission.ex b/lib/mv/authorization/checks/has_permission.ex index a11bf2e..94981f7 100644 --- a/lib/mv/authorization/checks/has_permission.ex +++ b/lib/mv/authorization/checks/has_permission.ex @@ -79,10 +79,13 @@ defmodule Mv.Authorization.Checks.HasPermission do """ use Ash.Policy.Check - require Ash.Query + import Ash.Expr + alias Mv.Authorization.Actor alias Mv.Authorization.PermissionSets + + require Ash.Query require Logger @impl true diff --git a/lib/mv/email_sync/helpers.ex b/lib/mv/email_sync/helpers.ex index 7feaf57..72f586a 100644 --- a/lib/mv/email_sync/helpers.ex +++ b/lib/mv/email_sync/helpers.ex @@ -6,9 +6,10 @@ defmodule Mv.EmailSync.Helpers do provides clean abstractions for email updates within transactions. """ - require Logger import Ecto.Changeset + require Logger + @doc """ Extracts the record from an Ash action result. diff --git a/lib/mv/helpers/system_actor.ex b/lib/mv/helpers/system_actor.ex index 7b86a3c..8070138 100644 --- a/lib/mv/helpers/system_actor.ex +++ b/lib/mv/helpers/system_actor.ex @@ -48,10 +48,10 @@ defmodule Mv.Helpers.SystemActor do use Agent - require Ash.Query - alias Mv.Config + require Ash.Query + @doc """ Starts the SystemActor Agent. diff --git a/lib/mv/mailer.ex b/lib/mv/mailer.ex index 1e55b6e..98697ff 100644 --- a/lib/mv/mailer.ex +++ b/lib/mv/mailer.ex @@ -27,11 +27,12 @@ defmodule Mv.Mailer do ENV takes priority over Settings (same pattern as OIDC and Vereinfacht). """ use Swoosh.Mailer, otp_app: :mv - - import Swoosh.Email use Gettext, backend: MvWeb.Gettext, otp_app: :mv + import Swoosh.Email + alias Mv.Smtp.ConfigBuilder + require Logger # Simple format check for test-email recipient only (e.g. allows a@b.c). Not for strict RFC validation. diff --git a/lib/mv/membership/import/column_resolver.ex b/lib/mv/membership/import/column_resolver.ex index 2edb540..f034b7a 100644 --- a/lib/mv/membership/import/column_resolver.ex +++ b/lib/mv/membership/import/column_resolver.ex @@ -15,10 +15,10 @@ defmodule Mv.Membership.Import.ColumnResolver do This module has no Phoenix or web dependencies. """ - require Logger - alias Mv.Membership.Import.HeaderMapper + require Logger + @preview_row_limit 3 @type numbered_row :: {pos_integer(), [String.t()]} diff --git a/lib/mv/membership/import/member_csv.ex b/lib/mv/membership/import/member_csv.ex index 31dea59..c666458 100644 --- a/lib/mv/membership/import/member_csv.ex +++ b/lib/mv/membership/import/member_csv.ex @@ -53,6 +53,14 @@ defmodule Mv.Membership.Import.MemberCSV do MemberCSV.process_chunk(chunk, import_state.column_map, import_state.custom_field_map, []) """ + use Gettext, backend: MvWeb.Gettext + + alias Mv.Helpers.SystemActor + alias Mv.Membership.Import.ColumnResolver + alias Mv.Membership.Import.CsvParser + alias Mv.Membership.Import.HeaderMapper + alias MvWeb.Translations.FieldTypes + defmodule Error do @moduledoc """ Error struct for CSV import errors. @@ -101,17 +109,6 @@ defmodule Mv.Membership.Import.MemberCSV do groups_found: list(Mv.Membership.Group.t() | %{id: String.t(), name: String.t()}) } - alias Mv.Membership.Import.ColumnResolver - alias Mv.Membership.Import.CsvParser - alias Mv.Membership.Import.HeaderMapper - - use Gettext, backend: MvWeb.Gettext - - alias Mv.Helpers.SystemActor - - # Import FieldTypes for human-readable type labels - alias MvWeb.Translations.FieldTypes - # Configuration constants @default_max_errors 50 @default_chunk_size 200 diff --git a/lib/mv/membership/member_export/build.ex b/lib/mv/membership/member_export/build.ex index 7159679..9f848a3 100644 --- a/lib/mv/membership/member_export/build.ex +++ b/lib/mv/membership/member_export/build.ex @@ -17,13 +17,14 @@ defmodule Mv.Membership.MemberExport.Build do No translations/Gettext in this module - labels come from the web layer via a function. """ - require Ash.Query import Ash.Expr alias Mv.Membership.{CustomField, CustomFieldValueFormatter, Member, MemberExportSort} alias MvWeb.MemberLive.Index alias MvWeb.MemberLive.Index.MembershipFeeStatus + require Ash.Query + @custom_field_prefix Mv.Constants.custom_field_prefix() @doc """ diff --git a/lib/mv/membership/members_pdf.ex b/lib/mv/membership/members_pdf.ex index a1c8418..f4bd353 100644 --- a/lib/mv/membership/members_pdf.ex +++ b/lib/mv/membership/members_pdf.ex @@ -12,12 +12,12 @@ defmodule Mv.Membership.MembersPDF do to avoid symlink issues and ensure isolation. """ - require Logger - use Gettext, backend: MvWeb.Gettext alias Mv.Config + require Logger + @template_filename "members_export.typ" @doc """ diff --git a/lib/mv/membership_fees/cycle_generator.ex b/lib/mv/membership_fees/cycle_generator.ex index 189f40a..a6c2d30 100644 --- a/lib/mv/membership_fees/cycle_generator.ex +++ b/lib/mv/membership_fees/cycle_generator.ex @@ -1,11 +1,4 @@ defmodule Mv.MembershipFees.CycleGenerator do - @typedoc "Aggregate counts returned by a batch cycle-generation run." - @type results_summary :: %{ - success: non_neg_integer(), - failed: non_neg_integer(), - total: non_neg_integer() - } - @moduledoc """ Module for generating membership fee cycles for members. @@ -66,6 +59,13 @@ defmodule Mv.MembershipFees.CycleGenerator do require Ash.Query require Logger + @typedoc "Aggregate counts returned by a batch cycle-generation run." + @type results_summary :: %{ + success: non_neg_integer(), + failed: non_neg_integer(), + total: non_neg_integer() + } + @type generate_result :: {:ok, [MembershipFeeCycle.t()], [Ash.Notifier.Notification.t()]} | {:error, term()} diff --git a/lib/mv/release.ex b/lib/mv/release.ex index 5db4751..107b096 100644 --- a/lib/mv/release.ex +++ b/lib/mv/release.ex @@ -12,8 +12,6 @@ defmodule Mv.Release do or ADMIN_PASSWORD_FILE). Idempotent; can be run on every deployment or via shell to update the admin password without redeploying. """ - @app :mv - alias Mv.Accounts alias Mv.Accounts.User alias Mv.Authorization.Role @@ -21,6 +19,8 @@ defmodule Mv.Release do require Ash.Query require Logger + @app :mv + def migrate do _ = load_app() diff --git a/lib/mv/statistics.ex b/lib/mv/statistics.ex index b3c54c0..dbec91f 100644 --- a/lib/mv/statistics.ex +++ b/lib/mv/statistics.ex @@ -7,15 +7,15 @@ defmodule Mv.Statistics do to Ash reads so that policies are enforced. """ - require Ash.Query import Ash.Expr - require Logger - alias Mv.Membership.Member alias Mv.MembershipFees alias Mv.MembershipFees.MembershipFeeCycle + require Ash.Query + require Logger + @doc """ Returns the earliest year in which any member has a join_date. diff --git a/lib/mv/vereinfacht/changes/sync_linked_member_after_user_change.ex b/lib/mv/vereinfacht/changes/sync_linked_member_after_user_change.ex index 79f8c47..5f08606 100644 --- a/lib/mv/vereinfacht/changes/sync_linked_member_after_user_change.ex +++ b/lib/mv/vereinfacht/changes/sync_linked_member_after_user_change.ex @@ -9,9 +9,10 @@ defmodule Mv.Vereinfacht.Changes.SyncLinkedMemberAfterUserChange do """ use Ash.Resource.Change - require Logger alias Mv.EmailSync.Loader + require Logger + @impl true def change(changeset, _opts, _context) do if Mv.Config.vereinfacht_configured?() and relevant_change?(changeset) do diff --git a/lib/mv/vereinfacht/vereinfacht.ex b/lib/mv/vereinfacht/vereinfacht.ex index 4d58f8d..de1ed61 100644 --- a/lib/mv/vereinfacht/vereinfacht.ex +++ b/lib/mv/vereinfacht/vereinfacht.ex @@ -7,13 +7,15 @@ defmodule Mv.Vereinfacht do the linked member's email via Ecto (e.g. user email change). - `sync_members_without_contact/0` – Bulk sync of members without a contact ID. """ - require Ash.Query import Ash.Expr + alias Mv.Helpers alias Mv.Helpers.SystemActor alias Mv.Membership.Member alias Mv.Vereinfacht.Client + require Ash.Query + @doc """ Tests the connection to the Vereinfacht API using the current configuration. diff --git a/lib/mv_web/components/table_components.ex b/lib/mv_web/components/table_components.ex index 6b3c060..9d083dd 100644 --- a/lib/mv_web/components/table_components.ex +++ b/lib/mv_web/components/table_components.ex @@ -3,9 +3,10 @@ defmodule MvWeb.TableComponents do TableComponents that can be used in tables as components (like a button for sorting, a filter...) """ use Phoenix.Component - import MvWeb.CoreComponents use Gettext, backend: MvWeb.Gettext + import MvWeb.CoreComponents + attr :field, :atom, required: true attr :label, :string, required: true attr :sort_field, :atom, default: nil diff --git a/lib/mv_web/controllers/import_template_controller.ex b/lib/mv_web/controllers/import_template_controller.ex index 877697d..f4df97f 100644 --- a/lib/mv_web/controllers/import_template_controller.ex +++ b/lib/mv_web/controllers/import_template_controller.ex @@ -13,12 +13,12 @@ defmodule MvWeb.ImportTemplateController do """ use MvWeb, :controller + import MvWeb.ControllerHelpers, only: [current_actor: 1] + alias Mv.Membership.Member alias Mv.Membership.MembersCSV alias MvWeb.Authorization - import MvWeb.ControllerHelpers, only: [current_actor: 1] - # Standard member columns in template order, with their English and German headers # and a placeholder example value. Groups and fee type are importable extras. @columns [ diff --git a/lib/mv_web/controllers/member_export_controller.ex b/lib/mv_web/controllers/member_export_controller.ex index 240db34..e33b211 100644 --- a/lib/mv_web/controllers/member_export_controller.ex +++ b/lib/mv_web/controllers/member_export_controller.ex @@ -6,9 +6,10 @@ defmodule MvWeb.MemberExportController do Same permission and actor context as the member overview; 403 if unauthorized. """ use MvWeb, :controller + use Gettext, backend: MvWeb.Gettext - require Ash.Query import Ash.Expr + import MvWeb.ControllerHelpers, only: [current_actor: 1] alias Mv.Membership.CustomField alias Mv.Membership.CustomFieldSort @@ -18,8 +19,7 @@ defmodule MvWeb.MemberExportController do alias MvWeb.MemberLive.Index.MembershipFeeStatus alias MvWeb.Translations.MemberFields - import MvWeb.ControllerHelpers, only: [current_actor: 1] - use Gettext, backend: MvWeb.Gettext + require Ash.Query @member_fields_allowlist (Mv.Constants.member_fields() |> Enum.map(&Atom.to_string/1)) ++ ["membership_fee_type", "groups"] diff --git a/lib/mv_web/controllers/member_pdf_export_controller.ex b/lib/mv_web/controllers/member_pdf_export_controller.ex index 1e82898..f5bdc6e 100644 --- a/lib/mv_web/controllers/member_pdf_export_controller.ex +++ b/lib/mv_web/controllers/member_pdf_export_controller.ex @@ -7,15 +7,14 @@ defmodule MvWeb.MemberPdfExportController do """ use MvWeb, :controller + use Gettext, backend: MvWeb.Gettext - require Logger + import MvWeb.ControllerHelpers, only: [current_actor: 1] alias Mv.Membership.{MemberExport, MemberExport.Build, MembersPDF} alias MvWeb.Translations.MemberFields - import MvWeb.ControllerHelpers, only: [current_actor: 1] - - use Gettext, backend: MvWeb.Gettext + require Logger @payload_required_message "payload required" @invalid_json_message "invalid JSON" diff --git a/lib/mv_web/live/auth/link_oidc_account_live.ex b/lib/mv_web/live/auth/link_oidc_account_live.ex index c4b3ab0..c0ab0e5 100644 --- a/lib/mv_web/live/auth/link_oidc_account_live.ex +++ b/lib/mv_web/live/auth/link_oidc_account_live.ex @@ -15,13 +15,14 @@ defmodule MvWeb.LinkOidcAccountLive do 6. User is redirected to complete OIDC login """ use MvWeb, :live_view - require Ash.Query - require Logger alias AshAuthentication.Strategy.Password.Actions, as: PasswordActions alias Mv.Accounts.User, as: UserResource alias Mv.Helpers.SystemActor + require Ash.Query + require Logger + @impl true def mount(_params, session, socket) do # Use SystemActor for authorization during OIDC linking (user is not yet logged in) diff --git a/lib/mv_web/live/global_settings_live.ex b/lib/mv_web/live/global_settings_live.ex index 735c165..42311df 100644 --- a/lib/mv_web/live/global_settings_live.ex +++ b/lib/mv_web/live/global_settings_live.ex @@ -34,7 +34,6 @@ defmodule MvWeb.GlobalSettingsLive do """ use MvWeb, :live_view - require Ash.Query import Ash.Expr alias Mv.Helpers @@ -44,6 +43,8 @@ defmodule MvWeb.GlobalSettingsLive do alias MvWeb.Helpers.MemberHelpers alias MvWeb.Translations.MemberFields + require Ash.Query + on_mount {MvWeb.LiveHelpers, :ensure_user_role_loaded} @impl true diff --git a/lib/mv_web/live/group_live/show.ex b/lib/mv_web/live/group_live/show.ex index 9e5bdf6..af93719 100644 --- a/lib/mv_web/live/group_live/show.ex +++ b/lib/mv_web/live/group_live/show.ex @@ -15,16 +15,16 @@ defmodule MvWeb.GroupLive.Show do """ use MvWeb, :live_view - require Logger - import Ash.Expr - import MvWeb.LiveHelpers, only: [current_actor: 1] import MvWeb.Authorization + import MvWeb.LiveHelpers, only: [current_actor: 1] alias Mv.Membership alias MvWeb.Helpers.MemberHelpers, as: MemberHelpers alias MvWeb.Live.MemberDropdownNav + require Logger + @impl true def mount(_params, _session, socket) do {:ok, diff --git a/lib/mv_web/live/import_live/components.ex b/lib/mv_web/live/import_live/components.ex index c317b87..4058bc8 100644 --- a/lib/mv_web/live/import_live/components.ex +++ b/lib/mv_web/live/import_live/components.ex @@ -7,13 +7,13 @@ defmodule MvWeb.ImportLive.Components do use Phoenix.Component use Gettext, backend: MvWeb.Gettext - import MvWeb.CoreComponents - use Phoenix.VerifiedRoutes, endpoint: MvWeb.Endpoint, router: MvWeb.Router, statics: MvWeb.static_paths() + import MvWeb.CoreComponents + @doc """ Renders the info box explaining that data fields must exist before import and linking to Manage Member Data (custom fields). diff --git a/lib/mv_web/live/join_request_live/index.ex b/lib/mv_web/live/join_request_live/index.ex index 533f0ce..4326416 100644 --- a/lib/mv_web/live/join_request_live/index.ex +++ b/lib/mv_web/live/join_request_live/index.ex @@ -13,15 +13,15 @@ defmodule MvWeb.JoinRequestLive.Index do """ use MvWeb, :live_view - require Logger - - import MvWeb.LiveHelpers, only: [current_actor: 1] import MvWeb.Authorization + import MvWeb.LiveHelpers, only: [current_actor: 1] alias Mv.Membership alias MvWeb.Helpers.DateFormatter alias MvWeb.JoinRequestLive.Helpers, as: JoinRequestHelpers + require Logger + @impl true def mount(_params, _session, socket) do actor = current_actor(socket) diff --git a/lib/mv_web/live/join_request_live/show.ex b/lib/mv_web/live/join_request_live/show.ex index d634f53..e02c64d 100644 --- a/lib/mv_web/live/join_request_live/show.ex +++ b/lib/mv_web/live/join_request_live/show.ex @@ -14,10 +14,8 @@ defmodule MvWeb.JoinRequestLive.Show do """ use MvWeb, :live_view - require Logger - - import MvWeb.LiveHelpers, only: [current_actor: 1] import MvWeb.Authorization + import MvWeb.LiveHelpers, only: [current_actor: 1] alias Mv.Constants alias Mv.Membership @@ -26,6 +24,8 @@ defmodule MvWeb.JoinRequestLive.Show do alias MvWeb.JoinRequestLive.Helpers, as: JoinRequestHelpers alias MvWeb.Translations.MemberFields, as: MemberFieldsTranslations + require Logger + @impl true def mount(_params, _session, socket) do if Membership.join_form_enabled?() do diff --git a/lib/mv_web/live/member_live/form.ex b/lib/mv_web/live/member_live/form.ex index 7770e90..dc79c9c 100644 --- a/lib/mv_web/live/member_live/form.ex +++ b/lib/mv_web/live/member_live/form.ex @@ -20,7 +20,6 @@ defmodule MvWeb.MemberLive.Form do """ use MvWeb, :live_view - require Logger import MvWeb.LiveHelpers, only: [current_actor: 1, submit_form: 3] alias Mv.Membership @@ -32,6 +31,8 @@ defmodule MvWeb.MemberLive.Form do alias MvWeb.Helpers.MemberHelpers alias MvWeb.Helpers.MembershipFeeHelpers + require Logger + @impl true def render(assigns) do # Sort custom fields by name for display only diff --git a/lib/mv_web/live/member_live/index.ex b/lib/mv_web/live/member_live/index.ex index 1b38820..c991f7f 100644 --- a/lib/mv_web/live/member_live/index.ex +++ b/lib/mv_web/live/member_live/index.ex @@ -26,8 +26,6 @@ defmodule MvWeb.MemberLive.Index do """ use MvWeb, :live_view - require Ash.Query - require Logger import Ash.Expr import MvWeb.LiveHelpers, only: [current_actor: 1] @@ -45,6 +43,9 @@ defmodule MvWeb.MemberLive.Index do alias MvWeb.MemberLive.Index.Formatter alias MvWeb.MemberLive.Index.MembershipFeeStatus + require Ash.Query + require Logger + @custom_field_prefix Mv.Constants.custom_field_prefix() @boolean_filter_prefix Mv.Constants.boolean_filter_prefix() @group_filter_prefix Mv.Constants.group_filter_prefix() diff --git a/lib/mv_web/live/member_live/index/date_filter.ex b/lib/mv_web/live/member_live/index/date_filter.ex index 162524a..14d1aef 100644 --- a/lib/mv_web/live/member_live/index/date_filter.ex +++ b/lib/mv_web/live/member_live/index/date_filter.ex @@ -28,12 +28,13 @@ defmodule MvWeb.MemberLive.Index.DateFilter do `exit_date IS NULL OR exit_date > today` — a member who left today is hidden. """ - require Ash.Query import Ash.Expr alias MvWeb.MemberLive.Index.CustomFieldValueLookup alias MvWeb.MemberLive.Index.FilterParams + require Ash.Query + @join_date_from_param Mv.Constants.join_date_from_param() @join_date_to_param Mv.Constants.join_date_to_param() @exit_date_mode_param Mv.Constants.exit_date_mode_param() diff --git a/lib/mv_web/live/member_live/show/membership_fees_component.ex b/lib/mv_web/live/member_live/show/membership_fees_component.ex index 16ee5dc..3a5a976 100644 --- a/lib/mv_web/live/member_live/show/membership_fees_component.ex +++ b/lib/mv_web/live/member_live/show/membership_fees_component.ex @@ -12,10 +12,9 @@ defmodule MvWeb.MemberLive.Show.MembershipFeesComponent do """ use MvWeb, :live_component - require Ash.Query - import MvWeb.LiveHelpers, only: [current_actor: 1] import MvWeb.Authorization, only: [can?: 3] import MvWeb.Helpers.AshErrorHelpers, only: [format_error: 1] + import MvWeb.LiveHelpers, only: [current_actor: 1] alias Mv.Membership alias Mv.MembershipFees @@ -25,6 +24,8 @@ defmodule MvWeb.MemberLive.Show.MembershipFeesComponent do alias Mv.MembershipFees.MembershipFeeType alias MvWeb.Helpers.MembershipFeeHelpers + require Ash.Query + @impl true def render(assigns) do ~H""" diff --git a/lib/mv_web/live/membership_fee_settings_live.ex b/lib/mv_web/live/membership_fee_settings_live.ex index 56de3b5..7ff1ec9 100644 --- a/lib/mv_web/live/membership_fee_settings_live.ex +++ b/lib/mv_web/live/membership_fee_settings_live.ex @@ -9,8 +9,6 @@ defmodule MvWeb.MembershipFeeSettingsLive do """ use MvWeb, :live_view - require Ash.Query - import MvWeb.LiveHelpers, only: [current_actor: 1] alias Mv.Membership @@ -18,6 +16,8 @@ defmodule MvWeb.MembershipFeeSettingsLive do alias Mv.MembershipFees.MembershipFeeType alias MvWeb.Helpers.MembershipFeeHelpers + require Ash.Query + @impl true def mount(_params, _session, socket) do actor = current_actor(socket) diff --git a/lib/mv_web/live/membership_fee_type_live/form.ex b/lib/mv_web/live/membership_fee_type_live/form.ex index a4d8506..6b726c2 100644 --- a/lib/mv_web/live/membership_fee_type_live/form.ex +++ b/lib/mv_web/live/membership_fee_type_live/form.ex @@ -15,13 +15,13 @@ defmodule MvWeb.MembershipFeeTypeLive.Form do import MvWeb.LiveHelpers, only: [current_actor: 1, submit_form: 3] - require Ash.Query - alias Mv.Membership.Member alias Mv.MembershipFees alias Mv.MembershipFees.MembershipFeeType alias MvWeb.Helpers.MembershipFeeHelpers + require Ash.Query + @impl true def render(assigns) do ~H""" diff --git a/lib/mv_web/live/membership_fee_type_live/index.ex b/lib/mv_web/live/membership_fee_type_live/index.ex index b6290e2..6efdad3 100644 --- a/lib/mv_web/live/membership_fee_type_live/index.ex +++ b/lib/mv_web/live/membership_fee_type_live/index.ex @@ -16,14 +16,14 @@ defmodule MvWeb.MembershipFeeTypeLive.Index do import MvWeb.LiveHelpers, only: [current_actor: 1] - require Ash.Query - alias Mv.Membership alias Mv.Membership.Member alias Mv.MembershipFees alias Mv.MembershipFees.MembershipFeeType alias MvWeb.Helpers.MembershipFeeHelpers + require Ash.Query + @impl true def mount(_params, _session, socket) do actor = current_actor(socket) diff --git a/lib/mv_web/live/role_live/form.ex b/lib/mv_web/live/role_live/form.ex index 2e315b9..bf61230 100644 --- a/lib/mv_web/live/role_live/form.ex +++ b/lib/mv_web/live/role_live/form.ex @@ -13,10 +13,10 @@ defmodule MvWeb.RoleLive.Form do """ use MvWeb, :live_view - alias Mv.Authorization.PermissionSets - import MvWeb.RoleLive.Helpers, only: [format_error: 1] + alias Mv.Authorization.PermissionSets + @impl true def render(assigns) do ~H""" diff --git a/lib/mv_web/live/role_live/index.ex b/lib/mv_web/live/role_live/index.ex index 5e210b5..188754f 100644 --- a/lib/mv_web/live/role_live/index.ex +++ b/lib/mv_web/live/role_live/index.ex @@ -13,13 +13,13 @@ defmodule MvWeb.RoleLive.Index do """ use MvWeb, :live_view + import MvWeb.RoleLive.Helpers, only: [permission_set_badge_variant: 1] + alias Mv.Accounts alias Mv.Authorization require Ash.Query - import MvWeb.RoleLive.Helpers, only: [permission_set_badge_variant: 1] - @impl true def mount(_params, _session, socket) do actor = socket.assigns[:current_user] diff --git a/lib/mv_web/live/role_live/show.ex b/lib/mv_web/live/role_live/show.ex index d8153be..2aed457 100644 --- a/lib/mv_web/live/role_live/show.ex +++ b/lib/mv_web/live/role_live/show.ex @@ -12,13 +12,13 @@ defmodule MvWeb.RoleLive.Show do """ use MvWeb, :live_view + import MvWeb.RoleLive.Helpers, + only: [format_error: 1, permission_set_badge_variant: 1, opts_with_actor: 3] + alias Mv.Accounts require Ash.Query - import MvWeb.RoleLive.Helpers, - only: [format_error: 1, permission_set_badge_variant: 1, opts_with_actor: 3] - @impl true def mount(%{"id" => id}, _session, socket) do case Ash.get( diff --git a/lib/mv_web/live/statistics_live.ex b/lib/mv_web/live/statistics_live.ex index bdaae01..8a9b5cd 100644 --- a/lib/mv_web/live/statistics_live.ex +++ b/lib/mv_web/live/statistics_live.ex @@ -6,13 +6,14 @@ defmodule MvWeb.StatisticsLive do """ use MvWeb, :live_view - require Logger - import MvWeb.LiveHelpers, only: [current_actor: 1] + alias Mv.MembershipFees.MembershipFeeType alias Mv.Statistics alias MvWeb.Helpers.MembershipFeeHelpers + require Logger + @impl true def mount(_params, _session, socket) do # Only static assigns and fee types here; load_statistics runs once in handle_params diff --git a/lib/mv_web/live/user_live/form.ex b/lib/mv_web/live/user_live/form.ex index 297f1f6..2d29592 100644 --- a/lib/mv_web/live/user_live/form.ex +++ b/lib/mv_web/live/user_live/form.ex @@ -33,7 +33,9 @@ defmodule MvWeb.UserLive.Form do """ use MvWeb, :live_view - require Jason + import MvWeb.Authorization, only: [can?: 3] + import MvWeb.ErrorHelpers, only: [format_ash_error: 1] + import MvWeb.LiveHelpers, only: [current_actor: 1, submit_form: 3] alias Mv.Accounts alias Mv.Accounts.User, as: UserResource @@ -45,9 +47,7 @@ defmodule MvWeb.UserLive.Form do alias MvWeb.Helpers.MemberHelpers alias MvWeb.Live.MemberDropdownNav - import MvWeb.LiveHelpers, only: [current_actor: 1, submit_form: 3] - import MvWeb.Authorization, only: [can?: 3] - import MvWeb.ErrorHelpers, only: [format_ash_error: 1] + require Jason @impl true def render(assigns) do diff --git a/lib/mv_web/live_user_auth.ex b/lib/mv_web/live_user_auth.ex index 617b079..a5b3f6f 100644 --- a/lib/mv_web/live_user_auth.ex +++ b/lib/mv_web/live_user_auth.ex @@ -3,9 +3,10 @@ defmodule MvWeb.LiveUserAuth do Helpers for authenticating users in LiveViews. """ - import Phoenix.Component use MvWeb, :verified_routes + import Phoenix.Component + alias AshAuthentication.Phoenix.LiveSession alias Phoenix.LiveView diff --git a/test/membership/group_database_constraints_test.exs b/test/membership/group_database_constraints_test.exs index 4418b33..25f0f90 100644 --- a/test/membership/group_database_constraints_test.exs +++ b/test/membership/group_database_constraints_test.exs @@ -5,10 +5,11 @@ defmodule Mv.Membership.GroupDatabaseConstraintsTest do """ use Mv.DataCase, async: false + import Ash.Expr + alias Mv.Membership require Ash.Query - import Ash.Expr setup do system_actor = Mv.Helpers.SystemActor.get_system_actor() diff --git a/test/membership/group_test.exs b/test/membership/group_test.exs index 72db874..a7befb9 100644 --- a/test/membership/group_test.exs +++ b/test/membership/group_test.exs @@ -5,10 +5,11 @@ defmodule Mv.Membership.GroupTest do """ use Mv.DataCase, async: true + import Ash.Expr + alias Mv.Membership require Ash.Query - import Ash.Expr setup do system_actor = Mv.Helpers.SystemActor.get_system_actor() diff --git a/test/membership/join_request_approval_domain_test.exs b/test/membership/join_request_approval_domain_test.exs index 15f5636..fece3d8 100644 --- a/test/membership/join_request_approval_domain_test.exs +++ b/test/membership/join_request_approval_domain_test.exs @@ -8,13 +8,14 @@ defmodule Mv.Membership.JoinRequestApprovalDomainTest do use Mv.DataCase, async: true import Ash.Expr - require Ash.Query alias Mv.Fixtures alias Mv.Helpers.SystemActor alias Mv.Membership alias Mv.Membership.Member + require Ash.Query + defp member_count do actor = SystemActor.get_system_actor() {:ok, members} = Membership.list_members(actor: actor) diff --git a/test/membership/join_request_test.exs b/test/membership/join_request_test.exs index 5f0ae83..9915d4a 100644 --- a/test/membership/join_request_test.exs +++ b/test/membership/join_request_test.exs @@ -12,13 +12,14 @@ defmodule Mv.Membership.JoinRequestTest do """ use Mv.DataCase, async: true - require Ash.Query import Ash.Expr alias Mv.Fixtures alias Mv.Membership alias Mv.Membership.JoinRequest + require Ash.Query + # Valid minimal attributes for submit (email required; confirmation_token optional for tests) @valid_submit_attrs %{ email: "join#{System.unique_integer([:positive])}@example.com" diff --git a/test/membership/member_group_test.exs b/test/membership/member_group_test.exs index 430ae7b..f7afaa1 100644 --- a/test/membership/member_group_test.exs +++ b/test/membership/member_group_test.exs @@ -5,10 +5,11 @@ defmodule Mv.Membership.MemberGroupTest do """ use Mv.DataCase, async: true + import Ash.Expr + alias Mv.Membership require Ash.Query - import Ash.Expr setup do system_actor = Mv.Helpers.SystemActor.get_system_actor() diff --git a/test/membership/member_groups_relationship_test.exs b/test/membership/member_groups_relationship_test.exs index 5ecddbd..188f71c 100644 --- a/test/membership/member_groups_relationship_test.exs +++ b/test/membership/member_groups_relationship_test.exs @@ -4,10 +4,11 @@ defmodule Mv.Membership.MemberGroupsRelationshipTest do """ use Mv.DataCase, async: true + import Ash.Expr + alias Mv.Membership require Ash.Query - import Ash.Expr setup do system_actor = Mv.Helpers.SystemActor.get_system_actor() diff --git a/test/mv/authorization/checks/has_permission_fail_closed_test.exs b/test/mv/authorization/checks/has_permission_fail_closed_test.exs index 36ddbd2..940da35 100644 --- a/test/mv/authorization/checks/has_permission_fail_closed_test.exs +++ b/test/mv/authorization/checks/has_permission_fail_closed_test.exs @@ -12,10 +12,10 @@ defmodule Mv.Authorization.Checks.HasPermissionFailClosedTest do """ use Mv.DataCase, async: true - alias Mv.Authorization.Checks.HasPermission - import Mv.Fixtures + alias Mv.Authorization.Checks.HasPermission + test "auto_filter deny-filter matches no records (regression for NOT IN [] allow-all bug)" do # Arrange: create some members in DB _m1 = member_fixture() diff --git a/test/mv/statistics_test.exs b/test/mv/statistics_test.exs index 6b72ffb..874681f 100644 --- a/test/mv/statistics_test.exs +++ b/test/mv/statistics_test.exs @@ -4,7 +4,6 @@ defmodule Mv.StatisticsTest do """ use Mv.DataCase, async: true - require Ash.Query import Ash.Expr alias Mv.Membership.Member @@ -13,6 +12,8 @@ defmodule Mv.StatisticsTest do alias Mv.MembershipFees.MembershipFeeType alias Mv.Statistics + require Ash.Query + setup do actor = Mv.Helpers.SystemActor.get_system_actor() %{actor: actor} diff --git a/test/mv_web/components/member_filter_component_test.exs b/test/mv_web/components/member_filter_component_test.exs index fcb45f6..9364eaa 100644 --- a/test/mv_web/components/member_filter_component_test.exs +++ b/test/mv_web/components/member_filter_component_test.exs @@ -11,9 +11,10 @@ defmodule MvWeb.Components.MemberFilterComponentTest do # async: false to prevent PostgreSQL deadlocks when running LiveView tests against DB use MvWeb.ConnCase, async: false - import Phoenix.LiveViewTest use Gettext, backend: MvWeb.Gettext + import Phoenix.LiveViewTest + alias Mv.Membership.CustomField # Helper to create a boolean custom field (uses system_actor - only admin can create) diff --git a/test/mv_web/helpers/membership_fee_helpers_test.exs b/test/mv_web/helpers/membership_fee_helpers_test.exs index 773bd26..c143b34 100644 --- a/test/mv_web/helpers/membership_fee_helpers_test.exs +++ b/test/mv_web/helpers/membership_fee_helpers_test.exs @@ -4,11 +4,11 @@ defmodule MvWeb.Helpers.MembershipFeeHelpersTest do """ use Mv.DataCase, async: true - require Ash.Query - alias Mv.MembershipFees.CalendarCycles alias MvWeb.Helpers.MembershipFeeHelpers + require Ash.Query + setup do system_actor = Mv.Helpers.SystemActor.get_system_actor() %{actor: system_actor} diff --git a/test/mv_web/live/custom_field_live/deletion_test.exs b/test/mv_web/live/custom_field_live/deletion_test.exs index 7b0953a..2e600d0 100644 --- a/test/mv_web/live/custom_field_live/deletion_test.exs +++ b/test/mv_web/live/custom_field_live/deletion_test.exs @@ -15,10 +15,11 @@ defmodule MvWeb.CustomFieldLive.DeletionTest do use MvWeb.ConnCase, async: true import Phoenix.LiveViewTest - require Ash.Query alias Mv.Membership.{CustomField, CustomFieldValue, Member} + require Ash.Query + setup do system_actor = Mv.Helpers.SystemActor.get_system_actor() admin_role = Mv.Fixtures.role_fixture("admin") diff --git a/test/mv_web/live/custom_field_live/form_test.exs b/test/mv_web/live/custom_field_live/form_test.exs index 4f7c8ec..bd5c60c 100644 --- a/test/mv_web/live/custom_field_live/form_test.exs +++ b/test/mv_web/live/custom_field_live/form_test.exs @@ -8,10 +8,11 @@ defmodule MvWeb.CustomFieldLive.FormTest do use MvWeb.ConnCase, async: true import Phoenix.LiveViewTest - require Ash.Query alias Mv.Membership.CustomField + require Ash.Query + setup do system_actor = Mv.Helpers.SystemActor.get_system_actor() admin_role = Mv.Fixtures.role_fixture("admin") diff --git a/test/mv_web/live/group_live/form_test.exs b/test/mv_web/live/group_live/form_test.exs index 8934e85..d0e73e4 100644 --- a/test/mv_web/live/group_live/form_test.exs +++ b/test/mv_web/live/group_live/form_test.exs @@ -10,9 +10,10 @@ defmodule MvWeb.GroupLive.FormTest do - Security """ use MvWeb.ConnCase, async: false - import Phoenix.LiveViewTest use Gettext, backend: MvWeb.Gettext + import Phoenix.LiveViewTest + alias Mv.Fixtures describe "create form" do diff --git a/test/mv_web/live/group_live/index_test.exs b/test/mv_web/live/group_live/index_test.exs index 5adfe56..aa1d23d 100644 --- a/test/mv_web/live/group_live/index_test.exs +++ b/test/mv_web/live/group_live/index_test.exs @@ -10,9 +10,10 @@ defmodule MvWeb.GroupLive.IndexTest do - Edge cases """ use MvWeb.ConnCase, async: false - import Phoenix.LiveViewTest use Gettext, backend: MvWeb.Gettext + import Phoenix.LiveViewTest + alias Mv.Fixtures alias Mv.Membership diff --git a/test/mv_web/live/group_live/integration_test.exs b/test/mv_web/live/group_live/integration_test.exs index 937ed1e..5cbf373 100644 --- a/test/mv_web/live/group_live/integration_test.exs +++ b/test/mv_web/live/group_live/integration_test.exs @@ -9,14 +9,16 @@ defmodule MvWeb.GroupLive.IntegrationTest do - URL persistence """ use MvWeb.ConnCase, async: false - import Phoenix.LiveViewTest - require Ash.Query - import Ash.Expr use Gettext, backend: MvWeb.Gettext + import Ash.Expr + import Phoenix.LiveViewTest + alias Mv.Fixtures alias Mv.Membership + require Ash.Query + describe "complete workflow" do test "create → view via slug → edit → view via slug (slug unchanged)", %{ conn: conn, diff --git a/test/mv_web/live/group_live/show_accessibility_test.exs b/test/mv_web/live/group_live/show_accessibility_test.exs index 14866ef..cbec37d 100644 --- a/test/mv_web/live/group_live/show_accessibility_test.exs +++ b/test/mv_web/live/group_live/show_accessibility_test.exs @@ -5,9 +5,10 @@ defmodule MvWeb.GroupLive.ShowAccessibilityTest do """ use MvWeb.ConnCase, async: false - import Phoenix.LiveViewTest use Gettext, backend: MvWeb.Gettext + import Phoenix.LiveViewTest + alias Mv.Fixtures alias Mv.Membership diff --git a/test/mv_web/live/group_live/show_add_member_test.exs b/test/mv_web/live/group_live/show_add_member_test.exs index 761dc83..fbc3bac 100644 --- a/test/mv_web/live/group_live/show_add_member_test.exs +++ b/test/mv_web/live/group_live/show_add_member_test.exs @@ -5,10 +5,11 @@ defmodule MvWeb.GroupLive.ShowAddMemberTest do """ use MvWeb.ConnCase, async: false - import Phoenix.LiveViewTest - import MvWeb.GroupLiveHelpers use Gettext, backend: MvWeb.Gettext + import MvWeb.GroupLiveHelpers + import Phoenix.LiveViewTest + alias Mv.Fixtures alias Mv.Membership diff --git a/test/mv_web/live/group_live/show_add_remove_members_test.exs b/test/mv_web/live/group_live/show_add_remove_members_test.exs index ede25fd..6737b91 100644 --- a/test/mv_web/live/group_live/show_add_remove_members_test.exs +++ b/test/mv_web/live/group_live/show_add_remove_members_test.exs @@ -5,9 +5,10 @@ defmodule MvWeb.GroupLive.ShowAddRemoveMembersTest do """ use MvWeb.ConnCase, async: false - import Phoenix.LiveViewTest use Gettext, backend: MvWeb.Gettext + import Phoenix.LiveViewTest + alias Mv.Fixtures alias Mv.Membership diff --git a/test/mv_web/live/group_live/show_authorization_test.exs b/test/mv_web/live/group_live/show_authorization_test.exs index c75e623..f7b5e33 100644 --- a/test/mv_web/live/group_live/show_authorization_test.exs +++ b/test/mv_web/live/group_live/show_authorization_test.exs @@ -5,9 +5,10 @@ defmodule MvWeb.GroupLive.ShowAuthorizationTest do """ use MvWeb.ConnCase, async: false - import Phoenix.LiveViewTest use Gettext, backend: MvWeb.Gettext + import Phoenix.LiveViewTest + alias Mv.Fixtures alias Mv.Membership diff --git a/test/mv_web/live/group_live/show_integration_test.exs b/test/mv_web/live/group_live/show_integration_test.exs index 407ed1e..519e6ca 100644 --- a/test/mv_web/live/group_live/show_integration_test.exs +++ b/test/mv_web/live/group_live/show_integration_test.exs @@ -5,9 +5,10 @@ defmodule MvWeb.GroupLive.ShowIntegrationTest do """ use MvWeb.ConnCase, async: false - import Phoenix.LiveViewTest use Gettext, backend: MvWeb.Gettext + import Phoenix.LiveViewTest + alias Mv.Fixtures alias Mv.Membership diff --git a/test/mv_web/live/group_live/show_member_search_test.exs b/test/mv_web/live/group_live/show_member_search_test.exs index 8a3d191..a855804 100644 --- a/test/mv_web/live/group_live/show_member_search_test.exs +++ b/test/mv_web/live/group_live/show_member_search_test.exs @@ -5,9 +5,10 @@ defmodule MvWeb.GroupLive.ShowMemberSearchTest do """ use MvWeb.ConnCase, async: false - import Phoenix.LiveViewTest use Gettext, backend: MvWeb.Gettext + import Phoenix.LiveViewTest + alias Mv.Fixtures alias Mv.Membership diff --git a/test/mv_web/live/group_live/show_remove_member_test.exs b/test/mv_web/live/group_live/show_remove_member_test.exs index 1dfd290..125a169 100644 --- a/test/mv_web/live/group_live/show_remove_member_test.exs +++ b/test/mv_web/live/group_live/show_remove_member_test.exs @@ -5,9 +5,10 @@ defmodule MvWeb.GroupLive.ShowRemoveMemberTest do """ use MvWeb.ConnCase, async: false - import Phoenix.LiveViewTest use Gettext, backend: MvWeb.Gettext + import Phoenix.LiveViewTest + alias Mv.Fixtures alias Mv.Membership diff --git a/test/mv_web/live/group_live/show_test.exs b/test/mv_web/live/group_live/show_test.exs index ee30991..0a82c15 100644 --- a/test/mv_web/live/group_live/show_test.exs +++ b/test/mv_web/live/group_live/show_test.exs @@ -11,13 +11,15 @@ defmodule MvWeb.GroupLive.ShowTest do - Delete functionality """ use MvWeb.ConnCase, async: false - import Phoenix.LiveViewTest - require Ash.Query use Gettext, backend: MvWeb.Gettext + import Phoenix.LiveViewTest + alias Mv.Fixtures alias Mv.Membership + require Ash.Query + describe "mount and display" do test "page renders successfully", %{conn: conn} do group = Fixtures.group_fixture() diff --git a/test/mv_web/live/member_live/deactivate_test.exs b/test/mv_web/live/member_live/deactivate_test.exs index 2e7a6a7..367c387 100644 --- a/test/mv_web/live/member_live/deactivate_test.exs +++ b/test/mv_web/live/member_live/deactivate_test.exs @@ -4,9 +4,10 @@ defmodule MvWeb.MemberLive.DeactivateTest do driven through the parent LiveView (the DeactivateComponent is stateful). """ use MvWeb.ConnCase, async: true - import Phoenix.LiveViewTest use Gettext, backend: MvWeb.Gettext + import Phoenix.LiveViewTest + alias Mv.Fixtures defp reload_member(member) do diff --git a/test/mv_web/live/role_live/show_test.exs b/test/mv_web/live/role_live/show_test.exs index fe5c48d..857f54b 100644 --- a/test/mv_web/live/role_live/show_test.exs +++ b/test/mv_web/live/role_live/show_test.exs @@ -11,13 +11,15 @@ defmodule MvWeb.RoleLive.ShowTest do - Delete functionality """ use MvWeb.ConnCase, async: false - import Phoenix.LiveViewTest - require Ash.Query use Gettext, backend: MvWeb.Gettext + import Phoenix.LiveViewTest + alias Mv.Authorization alias Mv.Authorization.Role + require Ash.Query + # Helper to create a role (authorize?: false for test data setup) defp create_role(attrs \\ %{}) do default_attrs = %{ diff --git a/test/mv_web/live/user_live/show_test.exs b/test/mv_web/live/user_live/show_test.exs index 084e346..dbfa0c2 100644 --- a/test/mv_web/live/user_live/show_test.exs +++ b/test/mv_web/live/user_live/show_test.exs @@ -10,10 +10,12 @@ defmodule MvWeb.UserLive.ShowTest do - Error handling """ use MvWeb.ConnCase, async: true - import Phoenix.LiveViewTest - require Ash.Query use Gettext, backend: MvWeb.Gettext + import Phoenix.LiveViewTest + + require Ash.Query + setup do # Create test user user = create_test_user(%{email: "test@example.com", oidc_id: "test123"}) diff --git a/test/mv_web/member_live/index_custom_fields_accessibility_test.exs b/test/mv_web/member_live/index_custom_fields_accessibility_test.exs index 17e6da4..c33210e 100644 --- a/test/mv_web/member_live/index_custom_fields_accessibility_test.exs +++ b/test/mv_web/member_live/index_custom_fields_accessibility_test.exs @@ -9,10 +9,11 @@ defmodule MvWeb.MemberLive.IndexCustomFieldsAccessibilityTest do """ use MvWeb.ConnCase, async: true import Phoenix.LiveViewTest - require Ash.Query alias Mv.Membership.{CustomField, CustomFieldValue} + require Ash.Query + setup do system_actor = Mv.Helpers.SystemActor.get_system_actor() diff --git a/test/mv_web/member_live/index_custom_fields_display_test.exs b/test/mv_web/member_live/index_custom_fields_display_test.exs index 9ada92b..e4e1824 100644 --- a/test/mv_web/member_live/index_custom_fields_display_test.exs +++ b/test/mv_web/member_live/index_custom_fields_display_test.exs @@ -12,10 +12,11 @@ defmodule MvWeb.MemberLive.IndexCustomFieldsDisplayTest do # async: false to prevent PostgreSQL deadlocks when creating members and custom fields use MvWeb.ConnCase, async: false import Phoenix.LiveViewTest - require Ash.Query alias Mv.Membership.{CustomField, CustomFieldValue} + require Ash.Query + setup do system_actor = Mv.Helpers.SystemActor.get_system_actor() diff --git a/test/mv_web/member_live/index_custom_fields_edge_cases_test.exs b/test/mv_web/member_live/index_custom_fields_edge_cases_test.exs index cf67fc3..288ea0a 100644 --- a/test/mv_web/member_live/index_custom_fields_edge_cases_test.exs +++ b/test/mv_web/member_live/index_custom_fields_edge_cases_test.exs @@ -8,10 +8,11 @@ defmodule MvWeb.MemberLive.IndexCustomFieldsEdgeCasesTest do """ use MvWeb.ConnCase, async: true import Phoenix.LiveViewTest - require Ash.Query alias Mv.Membership.CustomField + require Ash.Query + @tag :slow test "displays custom field column even when no members have values", %{conn: conn} do system_actor = Mv.Helpers.SystemActor.get_system_actor() diff --git a/test/mv_web/member_live/index_custom_fields_sorting_test.exs b/test/mv_web/member_live/index_custom_fields_sorting_test.exs index afce67b..4119205 100644 --- a/test/mv_web/member_live/index_custom_fields_sorting_test.exs +++ b/test/mv_web/member_live/index_custom_fields_sorting_test.exs @@ -11,10 +11,11 @@ defmodule MvWeb.MemberLive.IndexCustomFieldsSortingTest do """ use MvWeb.ConnCase, async: true import Phoenix.LiveViewTest - require Ash.Query alias Mv.Membership.{CustomField, CustomFieldValue} + require Ash.Query + setup do system_actor = Mv.Helpers.SystemActor.get_system_actor() diff --git a/test/mv_web/member_live/index_field_visibility_test.exs b/test/mv_web/member_live/index_field_visibility_test.exs index 79d078b..21c75ae 100644 --- a/test/mv_web/member_live/index_field_visibility_test.exs +++ b/test/mv_web/member_live/index_field_visibility_test.exs @@ -14,10 +14,11 @@ defmodule MvWeb.MemberLive.IndexFieldVisibilityTest do use MvWeb.ConnCase, async: false import Phoenix.LiveViewTest - require Ash.Query alias Mv.Membership.{CustomField, CustomFieldValue} + require Ash.Query + setup do system_actor = Mv.Helpers.SystemActor.get_system_actor() diff --git a/test/mv_web/member_live/index_groups_accessibility_test.exs b/test/mv_web/member_live/index_groups_accessibility_test.exs index d14cd9f..1644d5f 100644 --- a/test/mv_web/member_live/index_groups_accessibility_test.exs +++ b/test/mv_web/member_live/index_groups_accessibility_test.exs @@ -11,10 +11,11 @@ defmodule MvWeb.MemberLive.IndexGroupsAccessibilityTest do # async: false to prevent PostgreSQL deadlocks when creating members and groups use MvWeb.ConnCase, async: false import Phoenix.LiveViewTest - require Ash.Query alias Mv.Membership.{Group, MemberGroup} + require Ash.Query + setup do system_actor = Mv.Helpers.SystemActor.get_system_actor() diff --git a/test/mv_web/member_live/index_groups_display_test.exs b/test/mv_web/member_live/index_groups_display_test.exs index 263ac2a..4521942 100644 --- a/test/mv_web/member_live/index_groups_display_test.exs +++ b/test/mv_web/member_live/index_groups_display_test.exs @@ -11,10 +11,11 @@ defmodule MvWeb.MemberLive.IndexGroupsDisplayTest do # async: false to prevent PostgreSQL deadlocks when creating members and groups use MvWeb.ConnCase, async: false import Phoenix.LiveViewTest - require Ash.Query alias Mv.Membership.{Group, MemberGroup} + require Ash.Query + setup do system_actor = Mv.Helpers.SystemActor.get_system_actor() diff --git a/test/mv_web/member_live/index_groups_filter_test.exs b/test/mv_web/member_live/index_groups_filter_test.exs index d32b17f..48a335a 100644 --- a/test/mv_web/member_live/index_groups_filter_test.exs +++ b/test/mv_web/member_live/index_groups_filter_test.exs @@ -9,10 +9,11 @@ defmodule MvWeb.MemberLive.IndexGroupsFilterTest do # async: false to prevent PostgreSQL deadlocks when creating members and groups use MvWeb.ConnCase, async: false import Phoenix.LiveViewTest - require Ash.Query alias Mv.Membership.{Group, MemberGroup} + require Ash.Query + setup do system_actor = Mv.Helpers.SystemActor.get_system_actor() diff --git a/test/mv_web/member_live/index_groups_integration_test.exs b/test/mv_web/member_live/index_groups_integration_test.exs index 86738da..3c32f4c 100644 --- a/test/mv_web/member_live/index_groups_integration_test.exs +++ b/test/mv_web/member_live/index_groups_integration_test.exs @@ -13,12 +13,13 @@ defmodule MvWeb.MemberLive.IndexGroupsIntegrationTest do # async: false to prevent PostgreSQL deadlocks when creating members and groups use MvWeb.ConnCase, async: false import Phoenix.LiveViewTest - require Ash.Query alias Mv.Helpers.SystemActor alias Mv.Membership.{CustomField, CustomFieldValue, Group, MemberGroup} alias Mv.MembershipFees.{MembershipFeeCycle, MembershipFeeType} + require Ash.Query + setup do system_actor = SystemActor.get_system_actor() diff --git a/test/mv_web/member_live/index_groups_performance_test.exs b/test/mv_web/member_live/index_groups_performance_test.exs index 761c4eb..c5f170a 100644 --- a/test/mv_web/member_live/index_groups_performance_test.exs +++ b/test/mv_web/member_live/index_groups_performance_test.exs @@ -11,10 +11,11 @@ defmodule MvWeb.MemberLive.IndexGroupsPerformanceTest do # async: false to prevent PostgreSQL deadlocks when creating members and groups use MvWeb.ConnCase, async: false import Phoenix.LiveViewTest - require Ash.Query alias Mv.Membership.{Group, MemberGroup} + require Ash.Query + setup do system_actor = Mv.Helpers.SystemActor.get_system_actor() diff --git a/test/mv_web/member_live/index_groups_sorting_test.exs b/test/mv_web/member_live/index_groups_sorting_test.exs index 068152c..0828a33 100644 --- a/test/mv_web/member_live/index_groups_sorting_test.exs +++ b/test/mv_web/member_live/index_groups_sorting_test.exs @@ -5,10 +5,11 @@ defmodule MvWeb.MemberLive.IndexGroupsSortingTest do # async: false to prevent PostgreSQL deadlocks when creating members and groups use MvWeb.ConnCase, async: false import Phoenix.LiveViewTest - require Ash.Query alias Mv.Membership.{Group, MemberGroup} + require Ash.Query + setup do system_actor = Mv.Helpers.SystemActor.get_system_actor() diff --git a/test/mv_web/member_live/index_groups_url_params_test.exs b/test/mv_web/member_live/index_groups_url_params_test.exs index 469b010..d2f3b7b 100644 --- a/test/mv_web/member_live/index_groups_url_params_test.exs +++ b/test/mv_web/member_live/index_groups_url_params_test.exs @@ -12,10 +12,11 @@ defmodule MvWeb.MemberLive.IndexGroupsUrlParamsTest do # async: false to prevent PostgreSQL deadlocks when creating members and groups use MvWeb.ConnCase, async: false import Phoenix.LiveViewTest - require Ash.Query alias Mv.Membership.{Group, MemberGroup} + require Ash.Query + setup do system_actor = Mv.Helpers.SystemActor.get_system_actor() diff --git a/test/mv_web/member_live/index_test.exs b/test/mv_web/member_live/index_test.exs index 0cde8fd..d664a5c 100644 --- a/test/mv_web/member_live/index_test.exs +++ b/test/mv_web/member_live/index_test.exs @@ -1,7 +1,6 @@ defmodule MvWeb.MemberLive.IndexTest do use MvWeb.ConnCase, async: false import Phoenix.LiveViewTest - require Ash.Query alias Mv.Helpers.SystemActor alias Mv.Membership @@ -11,6 +10,8 @@ defmodule MvWeb.MemberLive.IndexTest do alias Mv.MembershipFees.MembershipFeeType alias MvWeb.MemberLive.Index, as: MemberIndex + require Ash.Query + # Helper to create a membership fee type (shared across all tests) defp create_fee_type(attrs, actor) do default_attrs = %{ diff --git a/test/mv_web/member_live/show_groups_display_test.exs b/test/mv_web/member_live/show_groups_display_test.exs index f8434b3..ea9cf52 100644 --- a/test/mv_web/member_live/show_groups_display_test.exs +++ b/test/mv_web/member_live/show_groups_display_test.exs @@ -14,12 +14,14 @@ defmodule MvWeb.MemberLive.ShowGroupsDisplayTest do in the same test run (same as IndexGroupsDisplayTest). """ use MvWeb.ConnCase, async: false - import Phoenix.LiveViewTest - require Ash.Query use Gettext, backend: MvWeb.Gettext + import Phoenix.LiveViewTest + alias Mv.Membership.{Group, MemberGroup} + require Ash.Query + describe "groups section" do setup do actor = Mv.Helpers.SystemActor.get_system_actor() diff --git a/test/mv_web/member_live/show_test.exs b/test/mv_web/member_live/show_test.exs index 2ec5a68..c6f26a8 100644 --- a/test/mv_web/member_live/show_test.exs +++ b/test/mv_web/member_live/show_test.exs @@ -14,12 +14,14 @@ defmodule MvWeb.MemberLive.ShowTest do - Custom field cleanup in tests ensures no interference between tests """ use MvWeb.ConnCase, async: true - import Phoenix.LiveViewTest - require Ash.Query use Gettext, backend: MvWeb.Gettext + import Phoenix.LiveViewTest + alias Mv.Membership.{CustomField, CustomFieldValue} + require Ash.Query + setup do system_actor = Mv.Helpers.SystemActor.get_system_actor()