import tempfile from pathlib import Path from app.models.project import ProjectManager def test_project_manager_lists_only_requested_tenant_and_owner(): original_dir = ProjectManager.PROJECTS_DIR with tempfile.TemporaryDirectory() as temp_dir: ProjectManager.PROJECTS_DIR = str(Path(temp_dir) / "projects") try: project_a = ProjectManager.create_project( "A1", organization_id="org-a", owner_user_id="user-a" ) ProjectManager.create_project( "A2", organization_id="org-a", owner_user_id="user-b" ) ProjectManager.create_project( "B1", organization_id="org-b", owner_user_id="user-c" ) org_a = ProjectManager.list_projects(organization_id="org-a") assert {project.name for project in org_a} == {"A1", "A2"} own = ProjectManager.list_projects( organization_id="org-a", owner_user_id="user-a" ) assert [project.project_id for project in own] == [project_a.project_id] finally: ProjectManager.PROJECTS_DIR = original_dir def test_project_scope_lookup_fails_closed_for_legacy_unowned_records(): original_dir = ProjectManager.PROJECTS_DIR with tempfile.TemporaryDirectory() as temp_dir: ProjectManager.PROJECTS_DIR = str(Path(temp_dir) / "projects") try: legacy = ProjectManager.create_project("Legacy") assert ProjectManager.get_project_for_scope( legacy.project_id, organization_id="org-a", owner_user_id="user-a" ) is None finally: ProjectManager.PROJECTS_DIR = original_dir def test_delete_project_requires_matching_organization_and_owner_scope(): original_dir = ProjectManager.PROJECTS_DIR with tempfile.TemporaryDirectory() as temp_dir: ProjectManager.PROJECTS_DIR = str(Path(temp_dir) / "projects") try: project = ProjectManager.create_project( "Tenant project", organization_id="org-a", owner_user_id="user-a" ) assert ProjectManager.delete_project( project.project_id, organization_id="org-b", owner_user_id="user-b", ) is False assert ProjectManager.get_project(project.project_id) is not None assert ProjectManager.delete_project( project.project_id, organization_id="org-a", owner_user_id="user-a", ) is True assert ProjectManager.get_project(project.project_id) is None finally: ProjectManager.PROJECTS_DIR = original_dir