Bot & Automation
jorgasisten
/root/hermes-projects/jorgasisten
tests/test_access_control.py
text
from pathlib import Path
from types import SimpleNamespace
from jorgasisten.services.access_control import (
ROLE_ADMIN,
ROLE_GUEST,
ROLE_OPERATOR,
ROLE_VIEWER,
AccessControlService,
extract_password_candidate,
is_explicit_access_attempt,
)
def settings_for_access(path: Path) -> SimpleNamespace:
return SimpleNamespace(
admin_ids={999},
operator_access_password="operator-rahasia",
viewer_access_password="viewer-rahasia",
user_access_registry_path=str(path),
)
def test_access_control_authenticates_operator_and_persists_session(tmp_path: Path) -> None:
service = AccessControlService(settings_for_access(tmp_path / "user_access.json"))
role = service.authenticate(123, "operator-rahasia")
assert role == ROLE_OPERATOR
assert service.get_role(123) == ROLE_OPERATOR
assert service.get_session(123) is not None
def test_access_control_uses_admin_ids_without_password(tmp_path: Path) -> None:
service = AccessControlService(settings_for_access(tmp_path / "user_access.json"))
assert service.get_role(999) == ROLE_ADMIN
def test_access_control_rejects_unknown_password(tmp_path: Path) -> None:
service = AccessControlService(settings_for_access(tmp_path / "user_access.json"))
role = service.authenticate(123, "salah")
assert role == ROLE_GUEST
assert service.get_role(123) == ROLE_GUEST
def test_access_control_logout_clears_non_admin_session(tmp_path: Path) -> None:
service = AccessControlService(settings_for_access(tmp_path / "user_access.json"))
service.authenticate(123, "viewer-rahasia")
service.logout(123)
assert service.get_role(123) == ROLE_GUEST
assert service.get_session(123) is None
assert service.authenticate(123, "viewer-rahasia") == ROLE_VIEWER
def test_extract_password_candidate_accepts_login_hints() -> None:
assert extract_password_candidate("operator-rahasia") == "operator-rahasia"
assert extract_password_candidate("password akses: operator-rahasia") == "operator-rahasia"
assert extract_password_candidate("login operator-rahasia") == "operator-rahasia"
assert extract_password_candidate("/login operator-rahasia") == "operator-rahasia"
def test_is_explicit_access_attempt_detects_password_or_login_hint(tmp_path: Path) -> None:
settings = settings_for_access(tmp_path / "user_access.json")
assert is_explicit_access_attempt("operator-rahasia", settings) is True
assert is_explicit_access_attempt("login operator-rahasia", settings) is True
assert is_explicit_access_attempt("halo bot", settings) is False