Fix Credo Readability (strict)

- Max line length, implicit try, alias order, zero-arity defs
- String sigils, long comments split; redundant blank lines fixed
This commit is contained in:
Moritz 2026-03-03 17:46:38 +01:00
parent f0a8dfcc21
commit 81ce204502
Signed by: moritz
GPG key ID: 1020A035E5DD0824
48 changed files with 131 additions and 144 deletions

View file

@ -164,7 +164,7 @@ defmodule Mv.Accounts.User.Validations.OidcEmailCollision do
end end
@impl true @impl true
def atomic?(), do: false def atomic?, do: false
@impl true @impl true
def describe(_opts) do def describe(_opts) do

View file

@ -519,12 +519,10 @@ defmodule Mv.Membership.MemberExport.Build do
defp key_to_atom(k) when is_atom(k), do: k defp key_to_atom(k) when is_atom(k), do: k
defp key_to_atom(k) when is_binary(k) do defp key_to_atom(k) when is_binary(k) do
try do
String.to_existing_atom(k) String.to_existing_atom(k)
rescue rescue
ArgumentError -> k ArgumentError -> k
end end
end
defp get_cfv_by_id(member, id) do defp get_cfv_by_id(member, id) do
values = values =

View file

@ -74,12 +74,10 @@ defmodule Mv.Membership.MembersCSV do
defp key_to_atom(k) when is_atom(k), do: k defp key_to_atom(k) when is_atom(k), do: k
defp key_to_atom(k) when is_binary(k) do defp key_to_atom(k) when is_binary(k) do
try do
String.to_existing_atom(k) String.to_existing_atom(k)
rescue rescue
ArgumentError -> k ArgumentError -> k
end end
end
defp get_cfv_by_id(member, id) do defp get_cfv_by_id(member, id) do
values = values =

View file

@ -299,12 +299,10 @@ defmodule Mv.Membership.MembersPDF do
defp date_column?(_), do: false defp date_column?(_), do: false
defp key_to_atom_safe(key) when is_binary(key) do defp key_to_atom_safe(key) when is_binary(key) do
try do
String.to_existing_atom(key) String.to_existing_atom(key)
rescue rescue
ArgumentError -> key ArgumentError -> key
end end
end
defp key_to_atom_safe(key), do: key defp key_to_atom_safe(key), do: key

View file

@ -82,12 +82,10 @@ defmodule Mv.OidcRoleSync do
end end
defp safe_get_atom(map, key) when is_binary(key) do defp safe_get_atom(map, key) when is_binary(key) do
try do
Map.get(map, String.to_existing_atom(key)) Map.get(map, String.to_existing_atom(key))
rescue rescue
ArgumentError -> nil ArgumentError -> nil
end end
end
defp safe_get_atom(_map, _key), do: nil defp safe_get_atom(_map, _key), do: nil

View file

@ -10,10 +10,10 @@ defmodule Mv.Vereinfacht.Changes.SyncLinkedMemberAfterUserChange do
use Ash.Resource.Change use Ash.Resource.Change
require Logger require Logger
alias Mv.Membership.Member
alias Mv.Membership
alias Mv.Helpers.SystemActor
alias Mv.Helpers alias Mv.Helpers
alias Mv.Helpers.SystemActor
alias Mv.Membership
alias Mv.Membership.Member
@impl true @impl true
def change(changeset, _opts, _context) do def change(changeset, _opts, _context) do

View file

@ -9,10 +9,10 @@ defmodule Mv.Vereinfacht do
""" """
require Ash.Query require Ash.Query
import Ash.Expr import Ash.Expr
alias Mv.Vereinfacht.Client
alias Mv.Membership.Member
alias Mv.Helpers.SystemActor
alias Mv.Helpers alias Mv.Helpers
alias Mv.Helpers.SystemActor
alias Mv.Membership.Member
alias Mv.Vereinfacht.Client
@doc """ @doc """
Tests the connection to the Vereinfacht API using the current configuration. Tests the connection to the Vereinfacht API using the current configuration.

View file

@ -94,8 +94,8 @@ defmodule MvWeb do
import MvWeb.Authorization, only: [can?: 3, can_access_page?: 2] import MvWeb.Authorization, only: [can?: 3, can_access_page?: 2]
# Common modules used in templates # Common modules used in templates
alias Phoenix.LiveView.JS
alias MvWeb.Layouts alias MvWeb.Layouts
alias Phoenix.LiveView.JS
# Routes generation with the ~p sigil # Routes generation with the ~p sigil
unquote(verified_routes()) unquote(verified_routes())

View file

@ -14,8 +14,8 @@ defmodule MvWeb.MemberExportController do
alias Mv.Membership.CustomField alias Mv.Membership.CustomField
alias Mv.Membership.Member alias Mv.Membership.Member
alias Mv.Membership.MembersCSV alias Mv.Membership.MembersCSV
alias MvWeb.Translations.MemberFields
alias MvWeb.MemberLive.Index.MembershipFeeStatus alias MvWeb.MemberLive.Index.MembershipFeeStatus
alias MvWeb.Translations.MemberFields
use Gettext, backend: MvWeb.Gettext use Gettext, backend: MvWeb.Gettext
@member_fields_allowlist (Mv.Constants.member_fields() |> Enum.map(&Atom.to_string/1)) ++ @member_fields_allowlist (Mv.Constants.member_fields() |> Enum.map(&Atom.to_string/1)) ++
@ -105,13 +105,11 @@ defmodule MvWeb.MemberExportController do
end end
defp atom_exists?(name) do defp atom_exists?(name) do
try do
_ = String.to_existing_atom(name) _ = String.to_existing_atom(name)
true true
rescue rescue
ArgumentError -> false ArgumentError -> false
end end
end
defp extract_list(params, key) do defp extract_list(params, key) do
case Map.get(params, key) do case Map.get(params, key) do

View file

@ -446,7 +446,6 @@ defmodule MvWeb.MemberLive.Form do
end end
def handle_event("save", %{"member" => member_params}, socket) do def handle_event("save", %{"member" => member_params}, socket) do
try do
actor = current_actor(socket) actor = current_actor(socket)
case submit_form(socket.assigns.form, member_params, actor) do case submit_form(socket.assigns.form, member_params, actor) do
@ -463,7 +462,6 @@ defmodule MvWeb.MemberLive.Form do
e -> e ->
handle_save_exception(socket, e) handle_save_exception(socket, e)
end end
end
@impl true @impl true
def handle_event("open_delete_modal", _params, socket) do def handle_event("open_delete_modal", _params, socket) do
@ -690,12 +688,10 @@ defmodule MvWeb.MemberLive.Form do
# Extracts message from struct error using Ash.ErrorKind protocol # Extracts message from struct error using Ash.ErrorKind protocol
defp extract_struct_error_message(error) do defp extract_struct_error_message(error) do
try do
Ash.ErrorKind.message(error) Ash.ErrorKind.message(error)
rescue rescue
Protocol.UndefinedError -> gettext("Failed to save member. Please try again.") Protocol.UndefinedError -> gettext("Failed to save member. Please try again.")
end end
end
# Checks if form has any errors # Checks if form has any errors
defp has_form_errors?(form) do defp has_form_errors?(form) do

View file

@ -708,12 +708,10 @@ defmodule MvWeb.MemberLive.Index do
end end
defp to_sort_id(field) when is_binary(field) do defp to_sort_id(field) when is_binary(field) do
try do
String.to_existing_atom("sort_#{field}") String.to_existing_atom("sort_#{field}")
rescue rescue
ArgumentError -> :"sort_#{field}" ArgumentError -> :"sort_#{field}"
end end
end
defp to_sort_id(field) when is_atom(field), do: :"sort_#{field}" defp to_sort_id(field) when is_atom(field), do: :"sort_#{field}"

View file

@ -18,10 +18,10 @@ defmodule MvWeb.MemberLive.Show.MembershipFeesComponent do
alias Mv.Membership alias Mv.Membership
alias Mv.MembershipFees alias Mv.MembershipFees
alias Mv.MembershipFees.MembershipFeeType
alias Mv.MembershipFees.MembershipFeeCycle
alias Mv.MembershipFees.CycleGenerator
alias Mv.MembershipFees.CalendarCycles alias Mv.MembershipFees.CalendarCycles
alias Mv.MembershipFees.CycleGenerator
alias Mv.MembershipFees.MembershipFeeCycle
alias Mv.MembershipFees.MembershipFeeType
alias MvWeb.Helpers.MembershipFeeHelpers alias MvWeb.Helpers.MembershipFeeHelpers
@impl true @impl true

View file

@ -21,7 +21,6 @@ defmodule MvWeb.RoleLive.Show do
@impl true @impl true
def mount(%{"id" => id}, _session, socket) do def mount(%{"id" => id}, _session, socket) do
try do
case Ash.get( case Ash.get(
Mv.Authorization.Role, Mv.Authorization.Role,
id, id,
@ -64,7 +63,6 @@ defmodule MvWeb.RoleLive.Show do
reraise e, __STACKTRACE__ reraise e, __STACKTRACE__
end end
end end
end
@impl true @impl true
def handle_event("delete", %{"id" => id}, socket) do def handle_event("delete", %{"id" => id}, socket) do

View file

@ -9,8 +9,8 @@ defmodule MvWeb.StatisticsLive do
require Logger require Logger
import MvWeb.LiveHelpers, only: [current_actor: 1] import MvWeb.LiveHelpers, only: [current_actor: 1]
alias Mv.Statistics
alias Mv.MembershipFees.MembershipFeeType alias Mv.MembershipFees.MembershipFeeType
alias Mv.Statistics
alias MvWeb.Helpers.MembershipFeeHelpers alias MvWeb.Helpers.MembershipFeeHelpers
@impl true @impl true

View file

@ -221,7 +221,8 @@ defmodule MvWeb.Plugs.CheckPagePermission do
defp path_param_equals(_, _, _, _), do: false defp path_param_equals(_, _, _, _), do: false
# For own_data: only allow show/edit when :id is the user's linked member. For other permission sets: allow when not reserved. # For own_data: only allow show/edit when :id is the user's linked member.
# For other permission sets: allow when not reserved.
defp members_show_allowed?(pattern, request_path, user) do defp members_show_allowed?(pattern, request_path, user) do
if permission_set_name_from_user(user) == "own_data" do if permission_set_name_from_user(user) == "own_data" do
path_param_equals(pattern, request_path, "id", user_member_id(user)) path_param_equals(pattern, request_path, "id", user_member_id(user))

View file

@ -4,9 +4,9 @@ defmodule Mv.Membership.MemberCycleCalculationsTest do
""" """
use Mv.DataCase, async: true use Mv.DataCase, async: true
alias Mv.MembershipFees.MembershipFeeType
alias Mv.MembershipFees.MembershipFeeCycle
alias Mv.MembershipFees.CalendarCycles alias Mv.MembershipFees.CalendarCycles
alias Mv.MembershipFees.MembershipFeeCycle
alias Mv.MembershipFees.MembershipFeeType
setup do setup do
system_actor = Mv.Helpers.SystemActor.get_system_actor() system_actor = Mv.Helpers.SystemActor.get_system_actor()

View file

@ -4,9 +4,9 @@ defmodule Mv.Membership.MemberTypeChangeIntegrationTest do
""" """
use Mv.DataCase, async: true use Mv.DataCase, async: true
alias Mv.MembershipFees.MembershipFeeType
alias Mv.MembershipFees.MembershipFeeCycle
alias Mv.MembershipFees.CalendarCycles alias Mv.MembershipFees.CalendarCycles
alias Mv.MembershipFees.MembershipFeeCycle
alias Mv.MembershipFees.MembershipFeeType
require Ash.Query require Ash.Query

View file

@ -4,8 +4,8 @@ defmodule Mv.MembershipFees.Changes.ValidateSameIntervalTest do
""" """
use Mv.DataCase, async: true use Mv.DataCase, async: true
alias Mv.MembershipFees.MembershipFeeType
alias Mv.MembershipFees.Changes.ValidateSameInterval alias Mv.MembershipFees.Changes.ValidateSameInterval
alias Mv.MembershipFees.MembershipFeeType
setup do setup do
system_actor = Mv.Helpers.SystemActor.get_system_actor() system_actor = Mv.Helpers.SystemActor.get_system_actor()

View file

@ -4,9 +4,9 @@ defmodule Mv.MembershipFees.ForeignKeyTest do
""" """
use Mv.DataCase, async: true use Mv.DataCase, async: true
alias Mv.Membership.Member
alias Mv.MembershipFees.MembershipFeeCycle alias Mv.MembershipFees.MembershipFeeCycle
alias Mv.MembershipFees.MembershipFeeType alias Mv.MembershipFees.MembershipFeeType
alias Mv.Membership.Member
setup do setup do
system_actor = Mv.Helpers.SystemActor.get_system_actor() system_actor = Mv.Helpers.SystemActor.get_system_actor()

View file

@ -4,9 +4,9 @@ defmodule Mv.MembershipFees.MembershipFeeTypeIntegrationTest do
""" """
use Mv.DataCase, async: false use Mv.DataCase, async: false
alias Mv.MembershipFees.MembershipFeeType
alias Mv.MembershipFees.MembershipFeeCycle
alias Mv.Membership.Member alias Mv.Membership.Member
alias Mv.MembershipFees.MembershipFeeCycle
alias Mv.MembershipFees.MembershipFeeType
require Ash.Query require Ash.Query

View file

@ -169,8 +169,8 @@ defmodule Mv.MembershipFees.MembershipFeeTypeTest do
end end
test "cannot delete when cycles exist", %{actor: actor, fee_type: fee_type} do test "cannot delete when cycles exist", %{actor: actor, fee_type: fee_type} do
alias Mv.MembershipFees.MembershipFeeCycle
alias Mv.Membership.Member alias Mv.Membership.Member
alias Mv.MembershipFees.MembershipFeeCycle
# Create a member with this fee type # Create a member with this fee type
{:ok, member} = {:ok, member} =

View file

@ -4,9 +4,9 @@ defmodule Mv.Helpers.SystemActorTest do
""" """
use Mv.DataCase, async: false use Mv.DataCase, async: false
alias Mv.Helpers.SystemActor
alias Mv.Authorization
alias Mv.Accounts alias Mv.Accounts
alias Mv.Authorization
alias Mv.Helpers.SystemActor
require Ash.Query require Ash.Query

View file

@ -9,8 +9,8 @@ defmodule Mv.Membership.CustomFieldValuePoliciesTest do
# async: false because we need database commits to be visible across queries # async: false because we need database commits to be visible across queries
use Mv.DataCase, async: false use Mv.DataCase, async: false
alias Mv.Membership.{CustomField, CustomFieldValue}
alias Mv.Accounts alias Mv.Accounts
alias Mv.Membership.{CustomField, CustomFieldValue}
require Ash.Query require Ash.Query

View file

@ -10,8 +10,8 @@ defmodule Mv.Membership.MemberPoliciesTest do
# in the same test (especially for unlinked members) # in the same test (especially for unlinked members)
use Mv.DataCase, async: false use Mv.DataCase, async: false
alias Mv.Membership
alias Mv.Accounts alias Mv.Accounts
alias Mv.Membership
require Ash.Query require Ash.Query

View file

@ -8,8 +8,8 @@ defmodule Mv.MembershipFees.MembershipFeeCyclePoliciesTest do
""" """
use Mv.DataCase, async: false use Mv.DataCase, async: false
alias Mv.MembershipFees
alias Mv.Membership alias Mv.Membership
alias Mv.MembershipFees
setup do setup do
system_actor = Mv.Helpers.SystemActor.get_system_actor() system_actor = Mv.Helpers.SystemActor.get_system_actor()

View file

@ -92,7 +92,7 @@ defmodule Mv.OidcRoleSyncTest do
# Minimal JWT: header.payload.signature with "groups" in payload (Rauthy puts groups in access_token) # Minimal JWT: header.payload.signature with "groups" in payload (Rauthy puts groups in access_token)
payload = Jason.encode!(%{"groups" => ["mila-admin"], "sub" => "oidc-123"}) payload = Jason.encode!(%{"groups" => ["mila-admin"], "sub" => "oidc-123"})
payload_b64 = Base.url_encode64(payload, padding: false) payload_b64 = Base.url_encode64(payload, padding: false)
header_b64 = Base.url_encode64("{\"alg\":\"HS256\",\"typ\":\"JWT\"}", padding: false) header_b64 = Base.url_encode64(~s({"alg":"HS256","typ":"JWT"}), padding: false)
sig_b64 = Base.url_encode64("sig", padding: false) sig_b64 = Base.url_encode64("sig", padding: false)
access_token = "#{header_b64}.#{payload_b64}.#{sig_b64}" access_token = "#{header_b64}.#{payload_b64}.#{sig_b64}"
oauth_tokens = %{"access_token" => access_token} oauth_tokens = %{"access_token" => access_token}

View file

@ -8,10 +8,10 @@ defmodule Mv.StatisticsTest do
import Ash.Expr import Ash.Expr
alias Mv.Membership.Member alias Mv.Membership.Member
alias Mv.Statistics
alias Mv.MembershipFees alias Mv.MembershipFees
alias Mv.MembershipFees.MembershipFeeCycle alias Mv.MembershipFees.MembershipFeeCycle
alias Mv.MembershipFees.MembershipFeeType alias Mv.MembershipFees.MembershipFeeType
alias Mv.Statistics
setup do setup do
actor = Mv.Helpers.SystemActor.get_system_actor() actor = Mv.Helpers.SystemActor.get_system_actor()

View file

@ -4,9 +4,9 @@ defmodule MvWeb.AuthorizationTest do
""" """
use ExUnit.Case, async: true use ExUnit.Case, async: true
alias MvWeb.Authorization
alias Mv.Membership.Member
alias Mv.Accounts.User alias Mv.Accounts.User
alias Mv.Membership.Member
alias MvWeb.Authorization
describe "can?/3 with resource atom" do describe "can?/3 with resource atom" do
test "returns true when user has permission for resource+action" do test "returns true when user has permission for resource+action" do

View file

@ -199,7 +199,8 @@ defmodule MvWeb.AuthControllerTest do
assert to =~ "/auth/user/password/sign_in_with_token" assert to =~ "/auth/user/password/sign_in_with_token"
# After login, user is redirected to /auth/user/password/sign_in_with_token. Session handling for protected routes should be tested in integration or E2E tests. # After login, user is redirected to /auth/user/password/sign_in_with_token.
# Session handling for protected routes should be tested in integration or E2E tests.
end end
# Edge cases # Edge cases

View file

@ -177,8 +177,8 @@ defmodule MvWeb.MemberExportControllerTest do
assert body =~ "Alice" assert body =~ "Alice"
end end
# Regression: when membership_fee_start_date is not in member_fields, Fee Type must still be exported (append fallback) # Regression: when membership_fee_start_date is not in member_fields, Fee Type must still be exported.
test "export includes Fee Type when only first_name and membership_fee_type are requested (no start_date)", test "export includes Fee Type when first_name and membership_fee_type only (no start_date)",
%{ %{
conn: conn, conn: conn,
member1: m1 member1: m1

View file

@ -6,8 +6,8 @@ defmodule MvWeb.Helpers.MembershipFeeHelpersTest do
require Ash.Query require Ash.Query
alias MvWeb.Helpers.MembershipFeeHelpers
alias Mv.MembershipFees.CalendarCycles alias Mv.MembershipFees.CalendarCycles
alias MvWeb.Helpers.MembershipFeeHelpers
setup do setup do
system_actor = Mv.Helpers.SystemActor.get_system_actor() system_actor = Mv.Helpers.SystemActor.get_system_actor()

View file

@ -13,8 +13,8 @@ defmodule MvWeb.GroupLive.IndexTest do
import Phoenix.LiveViewTest import Phoenix.LiveViewTest
use Gettext, backend: MvWeb.Gettext use Gettext, backend: MvWeb.Gettext
alias Mv.Membership
alias Mv.Fixtures alias Mv.Fixtures
alias Mv.Membership
describe "mount and display" do describe "mount and display" do
test "page renders successfully for admin user", %{conn: conn} do test "page renders successfully for admin user", %{conn: conn} do

View file

@ -14,8 +14,8 @@ defmodule MvWeb.GroupLive.IntegrationTest do
import Ash.Expr import Ash.Expr
use Gettext, backend: MvWeb.Gettext use Gettext, backend: MvWeb.Gettext
alias Mv.Membership
alias Mv.Fixtures alias Mv.Fixtures
alias Mv.Membership
describe "complete workflow" do describe "complete workflow" do
test "create → view via slug → edit → view via slug (slug unchanged)", %{ test "create → view via slug → edit → view via slug (slug unchanged)", %{

View file

@ -8,8 +8,8 @@ defmodule MvWeb.GroupLive.ShowAccessibilityTest do
import Phoenix.LiveViewTest import Phoenix.LiveViewTest
use Gettext, backend: MvWeb.Gettext use Gettext, backend: MvWeb.Gettext
alias Mv.Membership
alias Mv.Fixtures alias Mv.Fixtures
alias Mv.Membership
describe "ARIA labels and roles" do describe "ARIA labels and roles" do
test "search input has proper ARIA attributes", %{conn: conn} do test "search input has proper ARIA attributes", %{conn: conn} do

View file

@ -9,8 +9,8 @@ defmodule MvWeb.GroupLive.ShowAddMemberTest do
import MvWeb.GroupLiveHelpers import MvWeb.GroupLiveHelpers
use Gettext, backend: MvWeb.Gettext use Gettext, backend: MvWeb.Gettext
alias Mv.Membership
alias Mv.Fixtures alias Mv.Fixtures
alias Mv.Membership
describe "successful add member" do describe "successful add member" do
test "member is added to group after selection and clicking Add", %{conn: conn} do test "member is added to group after selection and clicking Add", %{conn: conn} do

View file

@ -8,8 +8,8 @@ defmodule MvWeb.GroupLive.ShowAddRemoveMembersTest do
import Phoenix.LiveViewTest import Phoenix.LiveViewTest
use Gettext, backend: MvWeb.Gettext use Gettext, backend: MvWeb.Gettext
alias Mv.Membership
alias Mv.Fixtures alias Mv.Fixtures
alias Mv.Membership
describe "Add Member button visibility" do describe "Add Member button visibility" do
@tag role: :read_only @tag role: :read_only

View file

@ -8,8 +8,8 @@ defmodule MvWeb.GroupLive.ShowAuthorizationTest do
import Phoenix.LiveViewTest import Phoenix.LiveViewTest
use Gettext, backend: MvWeb.Gettext use Gettext, backend: MvWeb.Gettext
alias Mv.Membership
alias Mv.Fixtures alias Mv.Fixtures
alias Mv.Membership
describe "server-side authorization" do describe "server-side authorization" do
test "add member event handler checks :update permission", %{conn: conn} do test "add member event handler checks :update permission", %{conn: conn} do

View file

@ -8,8 +8,8 @@ defmodule MvWeb.GroupLive.ShowIntegrationTest do
import Phoenix.LiveViewTest import Phoenix.LiveViewTest
use Gettext, backend: MvWeb.Gettext use Gettext, backend: MvWeb.Gettext
alias Mv.Membership
alias Mv.Fixtures alias Mv.Fixtures
alias Mv.Membership
describe "data consistency" do describe "data consistency" do
test "member appears in group after add (verified in database)", %{conn: conn} do test "member appears in group after add (verified in database)", %{conn: conn} do

View file

@ -8,8 +8,8 @@ defmodule MvWeb.GroupLive.ShowMemberSearchTest do
import Phoenix.LiveViewTest import Phoenix.LiveViewTest
use Gettext, backend: MvWeb.Gettext use Gettext, backend: MvWeb.Gettext
alias Mv.Membership
alias Mv.Fixtures alias Mv.Fixtures
alias Mv.Membership
# Helper to setup authenticated connection for admin # Helper to setup authenticated connection for admin
defp setup_admin_conn(conn) do defp setup_admin_conn(conn) do

View file

@ -8,8 +8,8 @@ defmodule MvWeb.GroupLive.ShowRemoveMemberTest do
import Phoenix.LiveViewTest import Phoenix.LiveViewTest
use Gettext, backend: MvWeb.Gettext use Gettext, backend: MvWeb.Gettext
alias Mv.Membership
alias Mv.Fixtures alias Mv.Fixtures
alias Mv.Membership
describe "successful remove member" do describe "successful remove member" do
test "member is removed from group after clicking Remove", %{conn: conn} do test "member is removed from group after clicking Remove", %{conn: conn} do

View file

@ -15,8 +15,8 @@ defmodule MvWeb.GroupLive.ShowTest do
require Ash.Query require Ash.Query
use Gettext, backend: MvWeb.Gettext use Gettext, backend: MvWeb.Gettext
alias Mv.Membership
alias Mv.Fixtures alias Mv.Fixtures
alias Mv.Membership
describe "mount and display" do describe "mount and display" do
test "page renders successfully", %{conn: conn} do test "page renders successfully", %{conn: conn} do

View file

@ -4,10 +4,10 @@ defmodule MvWeb.MemberLive.Index.MembershipFeeStatusTest do
""" """
use Mv.DataCase, async: false use Mv.DataCase, async: false
alias MvWeb.MemberLive.Index.MembershipFeeStatus
alias Mv.Membership.Member alias Mv.Membership.Member
alias Mv.MembershipFees.MembershipFeeType
alias Mv.MembershipFees.MembershipFeeCycle alias Mv.MembershipFees.MembershipFeeCycle
alias Mv.MembershipFees.MembershipFeeType
alias MvWeb.MemberLive.Index.MembershipFeeStatus
require Ash.Query require Ash.Query

View file

@ -6,8 +6,8 @@ defmodule MvWeb.MemberLive.IndexMembershipFeeStatusTest do
import Phoenix.LiveViewTest import Phoenix.LiveViewTest
alias Mv.MembershipFees.MembershipFeeType
alias Mv.MembershipFees.MembershipFeeCycle alias Mv.MembershipFees.MembershipFeeCycle
alias Mv.MembershipFees.MembershipFeeType
require Ash.Query require Ash.Query

View file

@ -3,8 +3,8 @@ defmodule MvWeb.MemberLive.IndexTest do
import Phoenix.LiveViewTest import Phoenix.LiveViewTest
require Ash.Query require Ash.Query
alias Mv.MembershipFees.MembershipFeeType
alias Mv.MembershipFees.MembershipFeeCycle alias Mv.MembershipFees.MembershipFeeCycle
alias Mv.MembershipFees.MembershipFeeType
# Helper to create a membership fee type (shared across all tests) # Helper to create a membership fee type (shared across all tests)
defp create_fee_type(attrs, actor) do defp create_fee_type(attrs, actor) do

View file

@ -6,8 +6,8 @@ defmodule MvWeb.MemberLive.MembershipFeeIntegrationTest do
import Phoenix.LiveViewTest import Phoenix.LiveViewTest
alias Mv.MembershipFees.MembershipFeeType
alias Mv.MembershipFees.MembershipFeeCycle alias Mv.MembershipFees.MembershipFeeCycle
alias Mv.MembershipFees.MembershipFeeType
require Ash.Query require Ash.Query

View file

@ -6,8 +6,8 @@ defmodule MvWeb.MemberLive.ShowMembershipFeesTest do
import Phoenix.LiveViewTest import Phoenix.LiveViewTest
alias Mv.MembershipFees.MembershipFeeType
alias Mv.MembershipFees.MembershipFeeCycle alias Mv.MembershipFees.MembershipFeeCycle
alias Mv.MembershipFees.MembershipFeeType
require Ash.Query require Ash.Query

View file

@ -4,8 +4,8 @@ defmodule MvWeb.Plugs.CheckPagePermissionTest do
""" """
use MvWeb.ConnCase, async: true use MvWeb.ConnCase, async: true
alias MvWeb.Plugs.CheckPagePermission
alias Mv.Fixtures alias Mv.Fixtures
alias MvWeb.Plugs.CheckPagePermission
defp conn_with_user(path, user) do defp conn_with_user(path, user) do
build_conn(:get, path) build_conn(:get, path)
@ -46,21 +46,21 @@ defmodule MvWeb.Plugs.CheckPagePermissionTest do
end end
describe "dynamic routes" do describe "dynamic routes" do
test "user with \"/members/:id\" permission can access \"/members/123\"" do test ~s(user with "/members/:id" permission can access "/members/123") do
user = Fixtures.user_with_role_fixture("read_only") user = Fixtures.user_with_role_fixture("read_only")
conn = conn_with_user("/members/123", user) |> CheckPagePermission.call([]) conn = conn_with_user("/members/123", user) |> CheckPagePermission.call([])
refute conn.halted refute conn.halted
end end
test "user with \"/members/:id/edit\" permission can access \"/members/456/edit\"" do test ~s(user with "/members/:id/edit" permission can access "/members/456/edit") do
user = Fixtures.user_with_role_fixture("normal_user") user = Fixtures.user_with_role_fixture("normal_user")
conn = conn_with_user("/members/456/edit", user) |> CheckPagePermission.call([]) conn = conn_with_user("/members/456/edit", user) |> CheckPagePermission.call([])
refute conn.halted refute conn.halted
end end
test "user with only \"/members/:id\" cannot access \"/members/123/edit\"" do test ~s(user with only "/members/:id" cannot access "/members/123/edit") do
user = Fixtures.user_with_role_fixture("read_only") user = Fixtures.user_with_role_fixture("read_only")
conn = conn_with_user("/members/123/edit", user) |> CheckPagePermission.call([]) conn = conn_with_user("/members/123/edit", user) |> CheckPagePermission.call([])
@ -456,7 +456,8 @@ defmodule MvWeb.Plugs.CheckPagePermissionTest do
assert conn.status == 200 assert conn.status == 200
end end
# Full-router test: session may not preserve member_id; plug logic covered by unit test "own_data user with linked member can access /members/:id/edit (plug direct call)" # Full-router test: session may not preserve member_id; plug logic covered by unit test
# "own_data user with linked member can access /members/:id/edit (plug direct call)".
@tag role: :member @tag role: :member
@tag :skip @tag :skip
test "GET /members/:id/edit (linked member edit) returns 200 when user has linked member", %{ test "GET /members/:id/edit (linked member edit) returns 200 when user has linked member", %{
@ -512,7 +513,8 @@ defmodule MvWeb.Plugs.CheckPagePermissionTest do
assert conn.status == 200 assert conn.status == 200
end end
# Skipped: MemberLive.Show requires membership fee cycle data; plug allows access (page loads then LiveView may error). # Skipped: MemberLive.Show requires membership fee cycle data; plug allows access
# (page loads then LiveView may error).
@tag role: :member @tag role: :member
@tag :skip @tag :skip
test "GET /members/:id for linked member returns 200", %{conn: conn, current_user: user} do test "GET /members/:id for linked member returns 200", %{conn: conn, current_user: user} do

View file

@ -116,7 +116,8 @@ defmodule MvWeb.UserLive.IndexTest do
end end
describe "delete functionality" do describe "delete functionality" do
# Delete is only on user show page (Danger zone), not on index (per CODE_GUIDELINES: at most one UI smoke test for delete) # Delete is only on user show page (Danger zone), not on index
# (per CODE_GUIDELINES: at most one UI smoke test for delete).
test "can delete a user from show page", %{conn: conn} do test "can delete a user from show page", %{conn: conn} do
user = create_test_user(%{email: "delete-me@example.com"}) user = create_test_user(%{email: "delete-me@example.com"})
conn = conn_with_oidc_user(conn) conn = conn_with_oidc_user(conn)