feat: 重构 Reminder Notification 系统并更新应用包名

This commit is contained in:
qzl
2026-03-30 18:36:57 +08:00
parent 9fb2a6857b
commit 91bf3c3f96
90 changed files with 5133 additions and 3017 deletions
@@ -25,6 +25,13 @@ class FakeInboxMessageService:
) -> None:
self._messages = messages
self._read_message = read_message
self._stream_rows: list[dict[str, object]] = []
def set_stream_rows(self, rows: list[dict[str, object]]) -> None:
self._stream_rows = rows
def require_user_id(self) -> UUID:
return self._read_message.recipient_id
async def list_messages(
self, is_read: bool | None = None
@@ -38,6 +45,16 @@ class FakeInboxMessageService:
raise HTTPException(status_code=404, detail="Inbox message not found")
return self._read_message
async def stream_events(
self,
*,
last_event_id: str | None,
) -> list[dict[str, object]]:
del last_event_id
rows = self._stream_rows
self._stream_rows = []
return rows
def _override_inbox_message_service(
service: FakeInboxMessageService,
@@ -58,7 +75,7 @@ def _build_message(
sender_id=uuid4(),
message_type=InboxMessageType.CALENDAR,
schedule_item_id=uuid4(),
content='{"permission": 1}',
content={"permission": 1},
is_read=False,
status=status,
created_at=datetime(2026, 2, 28, 9, 0, 0, tzinfo=timezone.utc),
@@ -108,3 +125,62 @@ def test_mark_as_read_returns_200() -> None:
assert body["is_read"] is True
finally:
app.dependency_overrides = {}
def test_stream_inbox_events_returns_sse_payload() -> None:
read_message = _build_message(uuid4(), InboxMessageStatus.PENDING)
service = FakeInboxMessageService(
messages=[read_message], read_message=read_message
)
service.set_stream_rows(
[
{
"id": "1743313300000-0",
"event": {
"event_id": str(uuid4()),
"occurred_at": "2026-03-30T07:00:00+00:00",
"user_id": str(read_message.recipient_id),
"message_id": str(read_message.id),
"event_type": "INBOX_MESSAGE_CREATED",
"op": "created",
"version": 1743313300000,
"data": {"message": {"id": str(read_message.id)}},
},
}
]
)
app.dependency_overrides[get_inbox_message_service] = (
_override_inbox_message_service(service)
)
client = TestClient(app)
try:
response = client.get("/api/v1/inbox/messages/stream?idle_limit=1")
assert response.status_code == 200
assert response.headers["content-type"].startswith("text/event-stream")
payload = response.text
assert "event: INBOX_MESSAGE_CREATED" in payload
assert '"op":"created"' in payload
finally:
app.dependency_overrides = {}
def test_stream_inbox_events_rejects_invalid_last_event_id() -> None:
read_message = _build_message(uuid4(), InboxMessageStatus.PENDING)
service = FakeInboxMessageService(
messages=[read_message], read_message=read_message
)
app.dependency_overrides[get_inbox_message_service] = (
_override_inbox_message_service(service)
)
client = TestClient(app)
try:
response = client.get(
"/api/v1/inbox/messages/stream",
headers={"Last-Event-ID": "not-a-stream-id"},
)
assert response.status_code == 422
body = response.json()
assert body.get("code") == "INBOX_INVALID_LAST_EVENT_ID"
finally:
app.dependency_overrides = {}