feat: 重构 Reminder Notification 系统并更新应用包名
This commit is contained in:
@@ -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 = {}
|
||||
|
||||
Reference in New Issue
Block a user