Files
ai-exchange/tests/unit/test_operator_workspace_service.py
T
2026-05-08 15:39:02 +08:00

122 lines
3.9 KiB
Python

import os
import unittest
from unittest.mock import patch
os.environ.setdefault("DATABASE_URL", "postgresql+psycopg://user:pass@localhost:5432/ai_ict_test")
from src.services.operator import OperatorNoteService, ReviewPacketService, SessionFocusService
class OperatorWorkspaceServiceTests(unittest.TestCase):
def test_create_note_returns_payload(self) -> None:
service = OperatorNoteService(repository=_NoteRepo())
payload = service.create_note(
instrument_id=1,
note_scope="session",
author="alice",
body="Watch NY_AM sweep quality.",
session_code="NY_AM",
tags=["handoff"],
)
self.assertEqual(payload["author"], "alice")
self.assertEqual(payload["session_code"], "NY_AM")
def test_session_focus_aggregates_candidates_executions_and_alerts(self) -> None:
service = SessionFocusService(
candidate_repository=_CandidateRepo(),
execution_service=_ExecutionService(),
decision_repository=_DecisionRepo(),
session_repository=_SessionRepo(),
trust_service=_TrustService(),
)
summary = service.build_summary(instrument_id=1, limit=2)
self.assertEqual(summary["items"][0]["candidate_count"], 1)
self.assertEqual(summary["items"][0]["open_execution_count"], 1)
self.assertEqual(summary["items"][0]["alert_count"], 1)
self.assertEqual(summary["items"][0]["action_hint"], "review_alerts")
def test_review_packet_collects_core_sections(self) -> None:
service = ReviewPacketService(
note_service=_NoteService(),
decision_service=_DecisionService(),
execution_service=_ExecutionService(),
trust_service=_TrustService(),
weekly_review_service=_WeeklyReviewService(),
decision_repository=_DecisionRepo(),
)
packet = service.build_packet(instrument_id=1)
self.assertIn("decision_packet", packet)
self.assertIn("recent_notes", packet)
self.assertIn("weekly_review", packet)
self.assertIn("trust_score", packet)
class _NoteRepo:
def insert_note(self, **kwargs):
return 11
def fetch_recent_notes(self, **kwargs):
return [{"id": 11, "author": "alice"}]
class _CandidateRepo:
def fetch_recent_candidates(self, **kwargs):
return [{"session_code": "LONDON", "status": "executable", "executable": True}]
class _ExecutionService:
def build_execution_dashboard_items(self, **kwargs):
return [{"session_code": "LONDON", "execution_status": "open"}]
class _DecisionRepo:
def fetch_recent_decision_alerts(self, **kwargs):
return [{"payload": {"session_code": "LONDON"}, "alert_type": "candidate_actionable"}]
class _TrustService:
def build_summary(self, **kwargs):
return {
"models": [
{
"session_recommendations": [
{"session_code": "LONDON", "score": 80.0, "classification": "prefer"},
{"session_code": "NY_AM", "score": 30.0, "classification": "avoid"},
]
}
]
}
class _NoteService:
def get_recent_notes(self, **kwargs):
return [{"id": 1, "author": "alice"}]
class _DecisionService:
def build_preview(self, **kwargs):
return {"status": "actionable", "action_recommendation": "confirm_ticket"}
class _WeeklyReviewService:
def build_summary(self, **kwargs):
return {"entry_count": 2}
class _SessionRepo:
def fetch_recent_sessions(self, **kwargs):
return [
{"session_code": "LONDON", "status": "active", "start_ts": None, "end_ts": None},
{"session_code": "NY_AM", "status": "closed", "start_ts": None, "end_ts": None},
]
if __name__ == "__main__":
unittest.main()