Fix Credo Design in test support and member index test

Add aliases in fixtures, conn_case, data_case. Use aliases
in index_test.exs. Remove empty placeholder test files.
This commit is contained in:
Moritz 2026-03-03 19:04:07 +01:00
parent 7a8b069834
commit e537f4eb31
Signed by: moritz
GPG key ID: 1020A035E5DD0824
6 changed files with 132 additions and 118 deletions

View file

@ -17,6 +17,14 @@ defmodule MvWeb.ConnCase do
use ExUnit.CaseTemplate
alias AshAuthentication.Plug.Helpers, as: AuthPlugHelpers
alias Mv.Accounts
alias Mv.Authorization.Actor
alias Mv.DataCase
alias Mv.Fixtures
alias Mv.Helpers.SystemActor
alias Phoenix.ConnTest
using do
quote do
# The default endpoint for testing
@ -92,8 +100,8 @@ defmodule MvWeb.ConnCase do
def sign_in_user_via_oidc(conn, user) do
# Mock OIDC sign-in by creating a token directly
conn
|> Phoenix.ConnTest.init_test_session(%{})
|> AshAuthentication.Plug.Helpers.store_in_session(user)
|> ConnTest.init_test_session(%{})
|> AuthPlugHelpers.store_in_session(user)
end
@doc """
@ -114,8 +122,8 @@ defmodule MvWeb.ConnCase do
user = create_test_user(Map.merge(default_attrs, user_attrs))
# Create admin role and assign it
admin_role = Mv.Fixtures.role_fixture("admin")
system_actor = Mv.Helpers.SystemActor.get_system_actor()
admin_role = Fixtures.role_fixture("admin")
system_actor = SystemActor.get_system_actor()
{:ok, user} =
user
@ -124,7 +132,7 @@ defmodule MvWeb.ConnCase do
|> Ash.update(actor: system_actor)
# Load role for authorization
user_with_role = Ash.load!(user, :role, domain: Mv.Accounts, actor: system_actor)
user_with_role = Ash.load!(user, :role, domain: Accounts, actor: system_actor)
sign_in_user_via_oidc(conn, user_with_role)
end
@ -134,8 +142,8 @@ defmodule MvWeb.ConnCase do
"""
def conn_with_password_user(conn, user) do
conn
|> Phoenix.ConnTest.init_test_session(%{})
|> AshAuthentication.Plug.Helpers.store_in_session(user)
|> ConnTest.init_test_session(%{})
|> AuthPlugHelpers.store_in_session(user)
end
@doc """
@ -143,14 +151,14 @@ defmodule MvWeb.ConnCase do
This is useful for tests that need full access to resources.
"""
def conn_with_admin_user(conn) do
admin_user = Mv.Fixtures.user_with_role_fixture("admin")
admin_user = Fixtures.user_with_role_fixture("admin")
conn_with_password_user(conn, admin_user)
end
setup tags do
pid = Mv.DataCase.setup_sandbox(tags)
pid = DataCase.setup_sandbox(tags)
conn = Phoenix.ConnTest.build_conn()
conn = ConnTest.build_conn()
# Set metadata for Phoenix.Ecto.SQL.Sandbox plug to allow LiveView processes
# to share the test's database connection in async tests
conn = Plug.Conn.put_private(conn, :ecto_sandbox, pid)
@ -164,27 +172,27 @@ defmodule MvWeb.ConnCase do
:admin ->
# Create admin user with role for all tests (unless test overrides with its own user)
# This ensures all tests have an authenticated user with proper authorization
admin_user = Mv.Fixtures.user_with_role_fixture("admin")
admin_user = Fixtures.user_with_role_fixture("admin")
authenticated_conn = conn_with_password_user(conn, admin_user)
{authenticated_conn, admin_user}
:member ->
# Create member user for role-based testing
# "member" role uses "own_data" permission set (Mitglied role)
member_user = Mv.Fixtures.user_with_role_fixture("own_data")
member_user = Fixtures.user_with_role_fixture("own_data")
authenticated_conn = conn_with_password_user(conn, member_user)
{authenticated_conn, member_user}
:read_only ->
# Vorstand/Buchhaltung: can read members, groups; cannot edit or access admin/settings
read_only_user = Mv.Fixtures.user_with_role_fixture("read_only")
read_only_user = Mv.Authorization.Actor.ensure_loaded(read_only_user)
read_only_user = Fixtures.user_with_role_fixture("read_only")
read_only_user = Actor.ensure_loaded(read_only_user)
authenticated_conn = conn_with_password_user(conn, read_only_user)
{authenticated_conn, read_only_user}
:normal_user ->
# Kassenwart: can read/update members, groups; cannot access users/settings/admin
normal_user = Mv.Fixtures.user_with_role_fixture("normal_user")
normal_user = Fixtures.user_with_role_fixture("normal_user")
authenticated_conn = conn_with_password_user(conn, normal_user)
{authenticated_conn, normal_user}
@ -194,7 +202,7 @@ defmodule MvWeb.ConnCase do
_other ->
# Fallback: treat unknown role as admin for safety
admin_user = Mv.Fixtures.user_with_role_fixture("admin")
admin_user = Fixtures.user_with_role_fixture("admin")
authenticated_conn = conn_with_password_user(conn, admin_user)
{authenticated_conn, admin_user}
end

View file

@ -16,6 +16,9 @@ defmodule Mv.DataCase do
use ExUnit.CaseTemplate
alias Ecto.Adapters.SQL.Sandbox, as: Sandbox
alias Mv.Repo
require Ash.Query
using do
@ -30,11 +33,11 @@ defmodule Mv.DataCase do
end
setup tags do
Mv.DataCase.setup_sandbox(tags)
setup_sandbox(tags)
# Ensure "Mitglied" role exists for default role assignment to work in tests
# Note: This runs in every test because each test runs in a sandboxed database.
# The check is fast (single query) and idempotent (skips if role exists).
Mv.DataCase.ensure_default_role()
ensure_default_role()
:ok
end
@ -43,8 +46,8 @@ defmodule Mv.DataCase do
Returns the owner pid for use with Phoenix.Ecto.SQL.Sandbox.
"""
def setup_sandbox(tags) do
pid = Ecto.Adapters.SQL.Sandbox.start_owner!(Mv.Repo, shared: not tags[:async])
on_exit(fn -> Ecto.Adapters.SQL.Sandbox.stop_owner(pid) end)
pid = Sandbox.start_owner!(Repo, shared: not tags[:async])
on_exit(fn -> Sandbox.stop_owner(pid) end)
pid
end

View file

@ -1,11 +1,13 @@
defmodule Mv.Fixtures do
@moduledoc """
Shared test fixtures for consistent test data creation.
This module provides factory functions for creating test data across
different test suites, ensuring consistency and reducing duplication.
"""
alias Mv.Accounts
alias Mv.Authorization
alias Mv.Helpers.SystemActor
alias Mv.Membership
@doc """
Creates a member with default or custom attributes.
@ -27,7 +29,7 @@ defmodule Mv.Fixtures do
"""
def member_fixture(attrs \\ %{}) do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
system_actor = SystemActor.get_system_actor()
attrs
|> Enum.into(%{
@ -35,7 +37,7 @@ defmodule Mv.Fixtures do
last_name: "Member",
email: "test#{System.unique_integer([:positive])}@example.com"
})
|> Mv.Membership.create_member(actor: system_actor)
|> Membership.create_member(actor: system_actor)
|> case do
{:ok, member} -> member
{:error, error} -> raise "Failed to create member: #{inspect(error)}"
@ -66,13 +68,13 @@ defmodule Mv.Fixtures do
"""
def user_fixture(attrs \\ %{}) do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
system_actor = SystemActor.get_system_actor()
attrs
|> Enum.into(%{
email: "user#{System.unique_integer([:positive])}@example.com"
})
|> Mv.Accounts.create_user(actor: system_actor)
|> Accounts.create_user(actor: system_actor)
|> case do
{:ok, user} -> user
{:error, error} -> raise "Failed to create user: #{inspect(error)}"
@ -123,10 +125,10 @@ defmodule Mv.Fixtures do
"""
def role_fixture(permission_set_name) do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
system_actor = SystemActor.get_system_actor()
role_name = "Test Role #{permission_set_name} #{System.unique_integer([:positive])}"
case Mv.Authorization.create_role(
case Authorization.create_role(
%{
name: role_name,
description: "Test role for #{permission_set_name}",
@ -157,7 +159,7 @@ defmodule Mv.Fixtures do
"""
def user_with_role_fixture(permission_set_name \\ "admin", user_attrs \\ %{}) do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
system_actor = SystemActor.get_system_actor()
# Create role with permission set
role = role_fixture(permission_set_name)
@ -168,7 +170,7 @@ defmodule Mv.Fixtures do
|> Enum.into(%{
email: "user#{System.unique_integer([:positive])}@example.com"
})
|> Mv.Accounts.create_user(actor: system_actor)
|> Accounts.create_user(actor: system_actor)
# Assign role to user
{:ok, user} =
@ -178,7 +180,7 @@ defmodule Mv.Fixtures do
|> Ash.update(actor: system_actor)
# Reload user with role preloaded (critical for authorization!)
{:ok, user_with_role} = Ash.load(user, :role, domain: Mv.Accounts, actor: system_actor)
{:ok, user_with_role} = Ash.load(user, :role, domain: Accounts, actor: system_actor)
user_with_role
end
@ -284,14 +286,14 @@ defmodule Mv.Fixtures do
"""
def group_fixture(attrs \\ %{}) do
system_actor = Mv.Helpers.SystemActor.get_system_actor()
system_actor = SystemActor.get_system_actor()
attrs
|> Enum.into(%{
name: "Test Group #{System.unique_integer([:positive])}",
description: "Test description"
})
|> Mv.Membership.create_group(actor: system_actor)
|> Membership.create_group(actor: system_actor)
|> case do
{:ok, group} -> group
{:error, error} -> raise "Failed to create group: #{inspect(error)}"