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:
parent
7a8b069834
commit
e537f4eb31
6 changed files with 132 additions and 118 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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)}"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue