78 lines
2.3 KiB
Python
78 lines
2.3 KiB
Python
from types import SimpleNamespace
|
|
from uuid import uuid4
|
|
|
|
from fastapi.testclient import TestClient
|
|
|
|
from app.api.v1.endpoints import access as access_endpoint
|
|
from app.auth.metadata_dependencies import (
|
|
get_current_metadata_user,
|
|
get_metadata_repository,
|
|
)
|
|
from tests.conftest import build_test_app
|
|
|
|
|
|
def _user(**overrides):
|
|
data = {
|
|
"id": uuid4(),
|
|
"username": "alice",
|
|
"role": "user",
|
|
"is_superuser": False,
|
|
}
|
|
data.update(overrides)
|
|
return SimpleNamespace(**data)
|
|
|
|
|
|
def _build_client(user, repo) -> TestClient:
|
|
app = build_test_app(access_endpoint.router, "/api/v1")
|
|
app.dependency_overrides[get_current_metadata_user] = lambda: user
|
|
app.dependency_overrides[get_metadata_repository] = lambda: repo
|
|
return TestClient(app)
|
|
|
|
|
|
def test_access_context_returns_global_admin_permissions_without_project():
|
|
user = _user(role="admin")
|
|
repo = SimpleNamespace()
|
|
client = _build_client(user, repo)
|
|
|
|
response = client.get("/api/v1/access/context")
|
|
|
|
assert response.status_code == 200
|
|
payload = response.json()
|
|
assert payload["is_system_admin"] is True
|
|
assert payload["project_id"] is None
|
|
assert "environment.manage" in payload["permissions"]
|
|
assert "webgis.view" not in payload["permissions"]
|
|
|
|
|
|
def test_access_context_returns_project_member_permissions():
|
|
project_id = uuid4()
|
|
user = _user()
|
|
|
|
async def get_project_by_id(value):
|
|
assert value == project_id
|
|
return SimpleNamespace(id=project_id, code="demo", status="active")
|
|
|
|
async def get_membership_role(value, user_id):
|
|
assert value == project_id
|
|
assert user_id == user.id
|
|
return "member"
|
|
|
|
repo = SimpleNamespace(
|
|
get_project_by_id=get_project_by_id,
|
|
get_membership_role=get_membership_role,
|
|
)
|
|
client = _build_client(user, repo)
|
|
|
|
response = client.get(
|
|
"/api/v1/access/context",
|
|
headers={"X-Project-Id": str(project_id)},
|
|
)
|
|
|
|
assert response.status_code == 200
|
|
payload = response.json()
|
|
assert payload["project_id"] == str(project_id)
|
|
assert payload["project_role"] == "member"
|
|
assert "scada.clean" in payload["permissions"]
|
|
assert "optimization.run" in payload["permissions"]
|
|
assert "model.import" not in payload["permissions"]
|