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:
parent
f0a8dfcc21
commit
81ce204502
48 changed files with 131 additions and 144 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -519,11 +519,9 @@ 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
|
||||||
|
|
|
||||||
|
|
@ -74,11 +74,9 @@ 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
|
||||||
|
|
|
||||||
|
|
@ -299,11 +299,9 @@ 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
|
||||||
|
|
|
||||||
|
|
@ -82,11 +82,9 @@ 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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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())
|
||||||
|
|
|
||||||
|
|
@ -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,12 +105,10 @@ 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
|
||||||
|
|
|
||||||
|
|
@ -446,23 +446,21 @@ 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
|
||||||
{:ok, member} ->
|
{:ok, member} ->
|
||||||
handle_save_success(socket, member)
|
handle_save_success(socket, member)
|
||||||
|
|
||||||
{:error, form} ->
|
{:error, form} ->
|
||||||
handle_save_error(socket, form)
|
handle_save_error(socket, form)
|
||||||
end
|
|
||||||
rescue
|
|
||||||
_e in [Ash.Error.Forbidden, Ash.Error.Forbidden.Policy] ->
|
|
||||||
handle_save_forbidden(socket)
|
|
||||||
|
|
||||||
e ->
|
|
||||||
handle_save_exception(socket, e)
|
|
||||||
end
|
end
|
||||||
|
rescue
|
||||||
|
_e in [Ash.Error.Forbidden, Ash.Error.Forbidden.Policy] ->
|
||||||
|
handle_save_forbidden(socket)
|
||||||
|
|
||||||
|
e ->
|
||||||
|
handle_save_exception(socket, e)
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
|
|
@ -690,11 +688,9 @@ 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
|
||||||
|
|
|
||||||
|
|
@ -708,11 +708,9 @@ 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}"
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -21,49 +21,47 @@ 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,
|
domain: Mv.Authorization,
|
||||||
domain: Mv.Authorization,
|
actor: socket.assigns[:current_user]
|
||||||
actor: socket.assigns[:current_user]
|
) do
|
||||||
) do
|
{:ok, role} ->
|
||||||
{:ok, role} ->
|
user_count = load_user_count(role, socket.assigns[:current_user])
|
||||||
user_count = load_user_count(role, socket.assigns[:current_user])
|
|
||||||
|
|
||||||
{:ok,
|
{:ok,
|
||||||
socket
|
socket
|
||||||
|> assign(:page_title, gettext("Show Role"))
|
|> assign(:page_title, gettext("Show Role"))
|
||||||
|> assign(:role, role)
|
|> assign(:role, role)
|
||||||
|> assign(:user_count, user_count)
|
|> assign(:user_count, user_count)
|
||||||
|> assign(:show_delete_modal, false)}
|
|> assign(:show_delete_modal, false)}
|
||||||
|
|
||||||
{:error, %Ash.Error.Invalid{errors: [%Ash.Error.Query.NotFound{} | _]}} ->
|
{:error, %Ash.Error.Invalid{errors: [%Ash.Error.Query.NotFound{} | _]}} ->
|
||||||
|
{:ok,
|
||||||
|
socket
|
||||||
|
|> put_flash(:error, gettext("Role not found."))
|
||||||
|
|> redirect(to: ~p"/admin/roles")}
|
||||||
|
|
||||||
|
{:error, error} ->
|
||||||
|
{:ok,
|
||||||
|
socket
|
||||||
|
|> put_flash(:error, format_error(error))
|
||||||
|
|> redirect(to: ~p"/admin/roles")}
|
||||||
|
end
|
||||||
|
rescue
|
||||||
|
e in [Ash.Error.Invalid] ->
|
||||||
|
# Handle exceptions that Ash.get might throw (e.g., policy violations)
|
||||||
|
case e do
|
||||||
|
%Ash.Error.Invalid{errors: [%Ash.Error.Query.NotFound{} | _]} ->
|
||||||
{:ok,
|
{:ok,
|
||||||
socket
|
socket
|
||||||
|> put_flash(:error, gettext("Role not found."))
|
|> put_flash(:error, gettext("Role not found."))
|
||||||
|> redirect(to: ~p"/admin/roles")}
|
|> redirect(to: ~p"/admin/roles")}
|
||||||
|
|
||||||
{:error, error} ->
|
_ ->
|
||||||
{:ok,
|
reraise e, __STACKTRACE__
|
||||||
socket
|
|
||||||
|> put_flash(:error, format_error(error))
|
|
||||||
|> redirect(to: ~p"/admin/roles")}
|
|
||||||
end
|
end
|
||||||
rescue
|
|
||||||
e in [Ash.Error.Invalid] ->
|
|
||||||
# Handle exceptions that Ash.get might throw (e.g., policy violations)
|
|
||||||
case e do
|
|
||||||
%Ash.Error.Invalid{errors: [%Ash.Error.Query.NotFound{} | _]} ->
|
|
||||||
{:ok,
|
|
||||||
socket
|
|
||||||
|> put_flash(:error, gettext("Role not found."))
|
|
||||||
|> redirect(to: ~p"/admin/roles")}
|
|
||||||
|
|
||||||
_ ->
|
|
||||||
reraise e, __STACKTRACE__
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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))
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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} =
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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}
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)", %{
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue