122 lines
3.9 KiB
Python
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()
|