87 lines
2.6 KiB
Python
87 lines
2.6 KiB
Python
|
|
"""Unit-Tests für Account-Lifecycle und Capability-Helfer (ohne DB)."""
|
||
|
|
import pytest
|
||
|
|
from fastapi import HTTPException
|
||
|
|
|
||
|
|
from account_lifecycle import (
|
||
|
|
account_state_satisfies,
|
||
|
|
assert_min_account_state,
|
||
|
|
resolve_account_state,
|
||
|
|
)
|
||
|
|
from capabilities import club_roles_in_club
|
||
|
|
from tenant_context import TenantContext
|
||
|
|
|
||
|
|
|
||
|
|
def test_resolve_account_state_platform_admin():
|
||
|
|
assert (
|
||
|
|
resolve_account_state(email_verified=False, global_role="superadmin", has_active_membership=False)
|
||
|
|
== "platform_admin"
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
def test_resolve_account_state_unverified():
|
||
|
|
assert (
|
||
|
|
resolve_account_state(email_verified=False, global_role="trainer", has_active_membership=True)
|
||
|
|
== "unverified"
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
def test_resolve_account_state_pending_club():
|
||
|
|
assert (
|
||
|
|
resolve_account_state(email_verified=True, global_role="user", has_active_membership=False)
|
||
|
|
== "verified_pending_club"
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
def test_resolve_account_state_active_member():
|
||
|
|
assert (
|
||
|
|
resolve_account_state(email_verified=True, global_role="trainer", has_active_membership=True)
|
||
|
|
== "active_member"
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
def test_account_state_satisfies():
|
||
|
|
assert account_state_satisfies("active_member", "active_member")
|
||
|
|
assert account_state_satisfies("active_member", "verified_pending_club")
|
||
|
|
assert not account_state_satisfies("verified_pending_club", "active_member")
|
||
|
|
assert account_state_satisfies("platform_admin", "active_member")
|
||
|
|
|
||
|
|
|
||
|
|
def test_assert_min_account_state_blocks(monkeypatch):
|
||
|
|
monkeypatch.setenv("ACCOUNT_GATE_ENFORCE", "1")
|
||
|
|
tenant = TenantContext(
|
||
|
|
profile_id=1,
|
||
|
|
global_role="user",
|
||
|
|
effective_club_id=None,
|
||
|
|
club_ids=frozenset(),
|
||
|
|
memberships=[],
|
||
|
|
account_state="verified_pending_club",
|
||
|
|
)
|
||
|
|
with pytest.raises(HTTPException) as exc:
|
||
|
|
assert_min_account_state(tenant, "active_member")
|
||
|
|
assert exc.value.status_code == 403
|
||
|
|
|
||
|
|
|
||
|
|
def test_assert_min_account_state_off(monkeypatch):
|
||
|
|
monkeypatch.setenv("ACCOUNT_GATE_ENFORCE", "0")
|
||
|
|
tenant = TenantContext(
|
||
|
|
profile_id=1,
|
||
|
|
global_role="user",
|
||
|
|
effective_club_id=None,
|
||
|
|
club_ids=frozenset(),
|
||
|
|
memberships=[],
|
||
|
|
account_state="verified_pending_club",
|
||
|
|
)
|
||
|
|
assert_min_account_state(tenant, "active_member")
|
||
|
|
|
||
|
|
|
||
|
|
def test_club_roles_in_club():
|
||
|
|
tenant = TenantContext(
|
||
|
|
profile_id=1,
|
||
|
|
global_role="trainer",
|
||
|
|
effective_club_id=5,
|
||
|
|
club_ids=frozenset({5}),
|
||
|
|
memberships=[{"id": 5, "roles": ["trainer", "club_admin"]}],
|
||
|
|
)
|
||
|
|
assert club_roles_in_club(tenant, 5) == ["trainer", "club_admin"]
|
||
|
|
assert club_roles_in_club(tenant, 99) == []
|