mirror of
https://github.com/rennf93/roboco.git
synced 2026-08-03 07:23:24 +02:00
109 lines
3.3 KiB
Python
109 lines
3.3 KiB
Python
"""api.deps coverage — pure permission gate helpers."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from http import HTTPStatus
|
|
from uuid import uuid4
|
|
|
|
import pytest
|
|
from fastapi import HTTPException
|
|
from roboco.api.deps import (
|
|
_role_value,
|
|
require_cell_access,
|
|
require_developer_or_above,
|
|
require_pm_or_above,
|
|
)
|
|
from roboco.models import AgentRole, Team
|
|
from roboco.models.permissions import AgentContext
|
|
|
|
|
|
def _ctx(role: AgentRole, team: Team | None = None) -> AgentContext:
|
|
return AgentContext(agent_id=uuid4(), role=role, team=team)
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# _role_value
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
def test_role_value_extracts_enum_value() -> None:
|
|
assert _role_value(AgentRole.DEVELOPER) == "developer"
|
|
|
|
|
|
def test_role_value_passes_through_string() -> None:
|
|
assert _role_value("developer") == "developer"
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# require_pm_or_above
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
def test_require_pm_or_above_allows_cell_pm() -> None:
|
|
# No raise.
|
|
require_pm_or_above(AgentRole.CELL_PM, "do thing")
|
|
|
|
|
|
def test_require_pm_or_above_allows_main_pm() -> None:
|
|
require_pm_or_above(AgentRole.MAIN_PM, "do thing")
|
|
|
|
|
|
def test_require_pm_or_above_allows_ceo() -> None:
|
|
require_pm_or_above(AgentRole.CEO, "do thing")
|
|
|
|
|
|
def test_require_pm_or_above_denies_developer() -> None:
|
|
with pytest.raises(HTTPException) as exc:
|
|
require_pm_or_above(AgentRole.DEVELOPER, "do thing")
|
|
assert exc.value.status_code == HTTPStatus.FORBIDDEN
|
|
|
|
|
|
def test_require_pm_or_above_denies_qa() -> None:
|
|
with pytest.raises(HTTPException):
|
|
require_pm_or_above(AgentRole.QA, "do thing")
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# require_developer_or_above
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
def test_require_developer_or_above_allows_developer() -> None:
|
|
require_developer_or_above(AgentRole.DEVELOPER, "do thing")
|
|
|
|
|
|
def test_require_developer_or_above_allows_ceo() -> None:
|
|
require_developer_or_above(AgentRole.CEO, "do thing")
|
|
|
|
|
|
def test_require_developer_or_above_denies_qa() -> None:
|
|
with pytest.raises(HTTPException):
|
|
require_developer_or_above(AgentRole.QA, "do thing")
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# require_cell_access
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
def test_require_cell_access_allows_main_pm() -> None:
|
|
require_cell_access(_ctx(AgentRole.MAIN_PM), Team.BACKEND, "edit")
|
|
|
|
|
|
def test_require_cell_access_allows_ceo_cross_cell() -> None:
|
|
require_cell_access(_ctx(AgentRole.CEO), Team.FRONTEND, "edit")
|
|
|
|
|
|
def test_require_cell_access_allows_cell_member_in_own_team() -> None:
|
|
require_cell_access(
|
|
_ctx(AgentRole.DEVELOPER, team=Team.BACKEND), Team.BACKEND, "edit"
|
|
)
|
|
|
|
|
|
def test_require_cell_access_denies_cross_cell_for_member() -> None:
|
|
with pytest.raises(HTTPException) as exc:
|
|
require_cell_access(
|
|
_ctx(AgentRole.DEVELOPER, team=Team.BACKEND), Team.FRONTEND, "edit"
|
|
)
|
|
assert exc.value.status_code == HTTPStatus.FORBIDDEN
|