feat(reports): add task status settings and tests
This commit is contained in:
@@ -11,9 +11,10 @@ from cryptography.fernet import Fernet
|
||||
# Required by LLMProviderService which is imported via route modules
|
||||
os.environ.setdefault("ENCRYPTION_KEY", Fernet.generate_key().decode())
|
||||
|
||||
# Files in tests/ that clash with __tests__/ co-located tests
|
||||
# Files in tests/ that clash with __tests__/ co-located tests.
|
||||
# norecursedirs=["__tests__"] in pyproject.toml prevents collection from src/__tests__/
|
||||
# at the directory level; this list handles edge cases where explicit file paths
|
||||
# are collected.
|
||||
collect_ignore = [
|
||||
os.path.join("tests", "test_auth.py"),
|
||||
os.path.join("tests", "test_logger.py"),
|
||||
os.path.join("tests", "test_models.py"),
|
||||
os.path.join("tests", "schemas", "test_auth.py"),
|
||||
]
|
||||
|
||||
@@ -17,6 +17,7 @@ include = ["src*"]
|
||||
[tool.pytest.ini_options]
|
||||
pythonpath = ["."]
|
||||
asyncio_mode = "auto"
|
||||
norecursedirs = ["__tests__"]
|
||||
markers = [
|
||||
"integration: Integration tests requiring external services (Docker, Testcontainers, Superset). Use --run-integration to enable.",
|
||||
]
|
||||
|
||||
@@ -368,6 +368,69 @@ class TestGetSummary:
|
||||
# #endregion test_get_summary
|
||||
|
||||
|
||||
# #region test_rbac_filtering [C:3] [TYPE Function] [SEMANTICS test,rbac,task-status-center]
|
||||
# @BRIEF Rejected-path regression tests for ReportsService RBAC task filtering.
|
||||
# @TEST_EDGE viewer_sees_only_own_tasks; analyst_sees_own_and_system; admin_sees_all.
|
||||
class TestRbacFiltering:
|
||||
def _user(self, user_id: str, role_name: str, is_admin: bool = False):
|
||||
role = MagicMock()
|
||||
role.name = role_name
|
||||
role.is_admin = is_admin
|
||||
user = MagicMock()
|
||||
user.id = user_id
|
||||
user.roles = [role]
|
||||
return user
|
||||
|
||||
def _task_set(self):
|
||||
return [
|
||||
_make_task(id="own", user_id="user-1"),
|
||||
_make_task(id="other", user_id="user-2"),
|
||||
_make_task(id="system", user_id=None),
|
||||
]
|
||||
|
||||
def test_viewer_sees_only_own_tasks(self):
|
||||
from src.models.report import ReportQuery
|
||||
tm = MagicMock()
|
||||
tm.get_all_tasks.return_value = self._task_set()
|
||||
service = _make_service(task_manager=tm)
|
||||
|
||||
result = service.list_reports(ReportQuery(), current_user=self._user("user-1", "viewer"))
|
||||
|
||||
assert {item.task_id for item in result.items} == {"own"}
|
||||
|
||||
def test_analyst_sees_own_and_system_tasks(self):
|
||||
from src.models.report import ReportQuery
|
||||
tm = MagicMock()
|
||||
tm.get_all_tasks.return_value = self._task_set()
|
||||
service = _make_service(task_manager=tm)
|
||||
|
||||
result = service.list_reports(ReportQuery(), current_user=self._user("user-1", "analyst"))
|
||||
|
||||
assert {item.task_id for item in result.items} == {"own", "system"}
|
||||
|
||||
def test_admin_sees_all_tasks(self):
|
||||
from src.models.report import ReportQuery
|
||||
tm = MagicMock()
|
||||
tm.get_all_tasks.return_value = self._task_set()
|
||||
service = _make_service(task_manager=tm)
|
||||
|
||||
result = service.list_reports(ReportQuery(), current_user=self._user("user-1", "Admin", True))
|
||||
|
||||
assert {item.task_id for item in result.items} == {"own", "other", "system"}
|
||||
|
||||
def test_summary_uses_same_rbac_filter(self):
|
||||
tm = MagicMock()
|
||||
tm.get_all_tasks.return_value = self._task_set()
|
||||
service = _make_service(task_manager=tm)
|
||||
|
||||
viewer_summary = service.get_summary(current_user=self._user("user-1", "viewer"))
|
||||
analyst_summary = service.get_summary(current_user=self._user("user-1", "analyst"))
|
||||
|
||||
assert viewer_summary.total_tasks == 1
|
||||
assert analyst_summary.total_tasks == 2
|
||||
# #endregion test_rbac_filtering
|
||||
|
||||
|
||||
# #region test_get_report_detail [C:2] [TYPE Function]
|
||||
# @BRIEF Test get_report_detail.
|
||||
class TestGetReportDetail:
|
||||
|
||||
Reference in New Issue
Block a user