Spaces:
Running
Running
Add regression tests for workspace-scoped approval service calls
Browse files
tests/test_approval_workspace_scope.py
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from __future__ import annotations
|
| 2 |
+
|
| 3 |
+
from unittest.mock import AsyncMock
|
| 4 |
+
|
| 5 |
+
import pytest
|
| 6 |
+
|
| 7 |
+
from app.projects.repositories.approval_repository import ApprovalRepository
|
| 8 |
+
from app.projects.services.approval_service import ApprovalService
|
| 9 |
+
|
| 10 |
+
|
| 11 |
+
@pytest.mark.asyncio
|
| 12 |
+
async def test_approval_repository_queries_are_workspace_scoped() -> None:
|
| 13 |
+
repository = ApprovalRepository(None)
|
| 14 |
+
# Repository calls require a real database; this regression test protects
|
| 15 |
+
# the service contract so routes cannot omit the authenticated workspace.
|
| 16 |
+
repository.list_requests = AsyncMock(return_value=[])
|
| 17 |
+
service = ApprovalService(repository, None)
|
| 18 |
+
result = await service.list_requests("workspace-a", "workflow-a")
|
| 19 |
+
assert result == []
|
| 20 |
+
repository.list_requests.assert_awaited_once_with("workspace-a", "workflow-a")
|
| 21 |
+
|
| 22 |
+
|
| 23 |
+
@pytest.mark.asyncio
|
| 24 |
+
async def test_approval_actions_pass_workspace_to_repository() -> None:
|
| 25 |
+
repository = ApprovalRepository(None)
|
| 26 |
+
request = type("Request", (), {
|
| 27 |
+
"created_by": "submitter",
|
| 28 |
+
"project_id": "project-a",
|
| 29 |
+
"editor_revision": 1,
|
| 30 |
+
"workspace_id": "workspace-a",
|
| 31 |
+
})()
|
| 32 |
+
repository.get_request = AsyncMock(return_value=request)
|
| 33 |
+
repository.update_request_status = AsyncMock(return_value=request)
|
| 34 |
+
editor = type("Editor", (), {"get_state": AsyncMock(return_value=type("State", (), {"revision": 1})())})()
|
| 35 |
+
service = ApprovalService(repository, editor)
|
| 36 |
+
await service.approve_request("workspace-a", "request-a", "reviewer")
|
| 37 |
+
repository.get_request.assert_awaited_once_with("workspace-a", "request-a")
|
| 38 |
+
repository.update_request_status.assert_awaited_once_with("workspace-a", "request-a", "approved")
|