"""/api/v1/me/team/requests contract tests — manager view of reports' requests. Asserts: * Anonymous → 401 * Manager with no reports → 200 empty (not 403) * Aggregates subordinates' submitted requests, filling requester_display * A non-subordinate's request never leaks in * status / category filters narrow correctly """ from __future__ import annotations import uuid from datetime import UTC, datetime import pytest from app.domains.asset.models import EmployeeRequest from app.domains.vpn_application.models import VpnApplication from app.identity.person_models import IdentityPerson def _person(manager_id=None, name="P") -> IdentityPerson: return IdentityPerson( id=uuid.uuid4(), work_email=f"{uuid.uuid4().hex[:8]}@test.local", display_name=name, employment_status="active", source_system="test", hris_person_id=f"sf-{uuid.uuid4().hex[:6]}", manager_person_id=manager_id, ) def _emp(requester_id, request_type, status): return EmployeeRequest( id=uuid.uuid4(), request_number=f"REQ-{uuid.uuid4().hex[:10]}", request_type=request_type, status=status, requester_id=requester_id, created_at=datetime.now(UTC), ) @pytest.mark.asyncio async def test_no_reports_returns_empty_200(client, employee_user): _, token = employee_user resp = await client.get( "/api/v1/me/team/requests", headers={"Authorization": f"Bearer {token}"} ) assert resp.status_code == 200 body = resp.json() assert body["success"] is True assert body["data"]["total"] == 0 @pytest.mark.asyncio async def test_aggregates_subordinate_requests(client, admin_user, db_session): manager, token = admin_user report = _person(manager_id=manager.id, name="Report One") outsider = _person(manager_id=None, name="Outsider") db_session.add_all([report, outsider]) await db_session.flush() db_session.add(_emp(report.id, "laptop_replacement", "pending")) db_session.add(VpnApplication( person_id=str(report.id), vpn_node="sg-gw", usage_description="x", resource_checklist="y", status="pending", )) # Outsider's request must NOT appear in the manager's team view. db_session.add(_emp(outsider.id, "software_seat", "pending")) await db_session.commit() resp = await client.get( "/api/v1/me/team/requests", headers={"Authorization": f"Bearer {token}"} ) assert resp.status_code == 200 data = resp.json()["data"] assert data["total"] == 2 # report's two; outsider excluded for it in data["items"]: assert it["requester_display"] == "Report One" assert {it["source"] for it in data["items"]} == {"employee_request", "vpn"} @pytest.mark.asyncio async def test_team_category_filter(client, admin_user, db_session): manager, token = admin_user report = _person(manager_id=manager.id, name="R") db_session.add(report) await db_session.flush() db_session.add(_emp(report.id, "laptop_replacement", "pending")) # hardware db_session.add(VpnApplication( person_id=str(report.id), vpn_node="tk", usage_description="x", resource_checklist="y", status="pending", )) # network await db_session.commit() resp = await client.get( "/api/v1/me/team/requests?category=network", headers={"Authorization": f"Bearer {token}"}, ) data = resp.json()["data"] assert data["total"] == 1 assert data["items"][0]["category"] == "network"