116 lines
3.3 KiB
Python
116 lines
3.3 KiB
Python
"""Tests for account entity dataclasses."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from omnigent.entities.account import Account, AccountToken
|
|
|
|
# ── Account ───────────────────────────────────────────
|
|
|
|
|
|
def test_account_construction() -> None:
|
|
acct = Account(
|
|
id="alice@example.com",
|
|
is_admin=True,
|
|
created_at=1700000000,
|
|
last_login_at=1700001000,
|
|
has_password=True,
|
|
)
|
|
assert acct.id == "alice@example.com"
|
|
assert acct.is_admin is True
|
|
assert acct.created_at == 1700000000
|
|
assert acct.last_login_at == 1700001000
|
|
assert acct.has_password is True
|
|
|
|
|
|
def test_account_nullable_timestamps() -> None:
|
|
"""Legacy/header-auth rows have None timestamps."""
|
|
acct = Account(
|
|
id="local",
|
|
is_admin=False,
|
|
created_at=None,
|
|
last_login_at=None,
|
|
has_password=False,
|
|
)
|
|
assert acct.created_at is None
|
|
assert acct.last_login_at is None
|
|
|
|
|
|
def test_account_is_frozen() -> None:
|
|
"""Account is a frozen dataclass — mutations raise."""
|
|
acct = Account(
|
|
id="bob",
|
|
is_admin=False,
|
|
created_at=1,
|
|
last_login_at=None,
|
|
has_password=False,
|
|
)
|
|
try:
|
|
acct.id = "eve" # type: ignore[misc]
|
|
raise AssertionError("Expected FrozenInstanceError")
|
|
except AttributeError:
|
|
pass
|
|
|
|
|
|
def test_account_equality() -> None:
|
|
"""Frozen dataclasses support value-based equality."""
|
|
a = Account(id="x", is_admin=False, created_at=1, last_login_at=None, has_password=False)
|
|
b = Account(id="x", is_admin=False, created_at=1, last_login_at=None, has_password=False)
|
|
assert a == b
|
|
|
|
|
|
def test_account_inequality() -> None:
|
|
a = Account(id="x", is_admin=False, created_at=1, last_login_at=None, has_password=False)
|
|
b = Account(id="y", is_admin=False, created_at=1, last_login_at=None, has_password=False)
|
|
assert a != b
|
|
|
|
|
|
# ── AccountToken ──────────────────────────────────────
|
|
|
|
|
|
def test_account_token_invite() -> None:
|
|
token = AccountToken(
|
|
id="tok_abc123",
|
|
kind="invite",
|
|
user_id=None,
|
|
created_by="admin@example.com",
|
|
created_at=1700000000,
|
|
expires_at=1700086400,
|
|
invited_is_admin=False,
|
|
)
|
|
assert token.kind == "invite"
|
|
assert token.user_id is None
|
|
assert token.created_by == "admin@example.com"
|
|
assert token.invited_is_admin is False
|
|
|
|
|
|
def test_account_token_magic() -> None:
|
|
token = AccountToken(
|
|
id="tok_magic_xyz",
|
|
kind="magic",
|
|
user_id="alice@example.com",
|
|
created_by=None,
|
|
created_at=1700000000,
|
|
expires_at=1700003600,
|
|
invited_is_admin=False,
|
|
)
|
|
assert token.kind == "magic"
|
|
assert token.user_id == "alice@example.com"
|
|
assert token.created_by is None
|
|
|
|
|
|
def test_account_token_is_frozen() -> None:
|
|
token = AccountToken(
|
|
id="tok_1",
|
|
kind="invite",
|
|
user_id=None,
|
|
created_by="admin",
|
|
created_at=1,
|
|
expires_at=2,
|
|
invited_is_admin=True,
|
|
)
|
|
try:
|
|
token.id = "tok_2" # type: ignore[misc]
|
|
raise AssertionError("Expected FrozenInstanceError")
|
|
except AttributeError:
|
|
pass
|