Files
isphere-ai-bridge/tests/test_draft_queue.py
2026-07-05 14:52:23 +08:00

91 lines
3.5 KiB
Python

from __future__ import annotations
import json
import tempfile
import unittest
from contextlib import redirect_stdout
from io import StringIO
from pathlib import Path
from isphere_ai_bridge.cli import main
from isphere_ai_bridge.draft_queue import DraftQueue
from isphere_ai_bridge.models import Draft
from isphere_ai_bridge.mock_db import create_mock_msglib
class DraftQueueTests(unittest.TestCase):
def test_append_drafts_writes_pending_queue_and_redacted_audit_event(self) -> None:
with tempfile.TemporaryDirectory() as tmp:
queue_path = Path(tmp) / "drafts.jsonl"
audit_path = Path(tmp) / "audit.jsonl"
queue = DraftQueue(
queue_path=queue_path,
audit_path=audit_path,
clock=lambda: "2026-07-05T01:40:00+08:00",
)
draft = Draft(
message_id="msg-001",
conversation_id="alice@example",
draft_text="Draft only. Please review before sending.",
source_message_ref="MsgLib.db#tblPersonMsg:msg-001",
)
entries = queue.append_drafts([draft])
self.assertEqual(1, len(entries))
self.assertEqual("pending_review", entries[0]["status"])
self.assertEqual("msg-001", entries[0]["message_id"])
self.assertEqual("Draft only. Please review before sending.", entries[0]["draft_text"])
queue_lines = queue_path.read_text(encoding="utf-8").splitlines()
self.assertEqual(1, len(queue_lines))
queue_record = json.loads(queue_lines[0])
self.assertEqual(entries[0]["draft_id"], queue_record["draft_id"])
self.assertEqual("pending_review", queue_record["status"])
audit_lines = audit_path.read_text(encoding="utf-8").splitlines()
self.assertEqual(1, len(audit_lines))
audit_record = json.loads(audit_lines[0])
self.assertEqual("draft_created", audit_record["event_type"])
self.assertEqual(entries[0]["draft_id"], audit_record["draft_id"])
self.assertIn("content_sha256", audit_record)
self.assertNotIn("draft_text", audit_record)
def test_queue_drafts_cli_appends_drafts_and_audit_events(self) -> None:
with tempfile.TemporaryDirectory() as tmp:
root = Path(tmp)
db_path = create_mock_msglib(root / "MsgLib.db")
queue_path = root / "drafts.jsonl"
audit_path = root / "audit.jsonl"
stdout = StringIO()
with redirect_stdout(stdout):
exit_code = main(
[
"queue-drafts",
"--db",
str(db_path),
"--queue",
str(queue_path),
"--audit",
str(audit_path),
"--limit",
"2",
]
)
self.assertEqual(0, exit_code)
output = json.loads(stdout.getvalue())
self.assertEqual(2, output["queued"])
self.assertEqual(2, len(queue_path.read_text(encoding="utf-8").splitlines()))
audit_records = [
json.loads(line)
for line in audit_path.read_text(encoding="utf-8").splitlines()
]
self.assertEqual(2, len(audit_records))
self.assertNotIn("draft_text", audit_records[0])
if __name__ == "__main__":
unittest.main()