from types import SimpleNamespace import pytest from fastapi import HTTPException def _user(user_id: int, *, is_admin: bool = False): return SimpleNamespace(id=user_id, is_admin=is_admin) @pytest.mark.asyncio async def test_owned_project_helper_scopes_to_authenticated_user(monkeypatch): from landppt.services import db_project_manager as db_project_manager_module from landppt.web.route_modules import project_workspace_routes calls = {} class FakeProjectManager: async def get_project(self, project_id: str, user_id=None): calls["project_id"] = project_id calls["user_id"] = user_id return SimpleNamespace(project_id=project_id, user_id=user_id) monkeypatch.setattr(db_project_manager_module, "DatabaseProjectManager", FakeProjectManager) project = await project_workspace_routes._get_owned_project_or_404("proj-1", _user(42)) assert project.project_id == "proj-1" assert calls == {"project_id": "proj-1", "user_id": 42} @pytest.mark.asyncio async def test_owned_project_helper_hides_other_users_projects(monkeypatch): from landppt.services import db_project_manager as db_project_manager_module from landppt.web.route_modules import project_workspace_routes class FakeProjectManager: async def get_project(self, project_id: str, user_id=None): return None monkeypatch.setattr(db_project_manager_module, "DatabaseProjectManager", FakeProjectManager) with pytest.raises(HTTPException) as excinfo: await project_workspace_routes._get_owned_project_or_404("proj-2", _user(7)) assert excinfo.value.status_code == 404 assert excinfo.value.detail == "Project not found"