spark-server/internal/module/deliver/logic/fanout_test.go
2026-09-18 14:50:41 +08:00

73 lines
2.2 KiB
Go

package logic
import (
"testing"
"spark-server/internal/infrastructure/id"
"spark-server/internal/module/deliver/entity"
inboxmodel "spark-server/internal/module/inbox/model"
syncentity "spark-server/internal/module/sync/entity"
syncmodel "spark-server/internal/module/sync/model"
"spark-server/internal/transport/tcp/protocol"
"spark-server/internal/transport/tcp/session"
)
func TestInboxFanoutMessageIncrementsUnreadAndPushes(t *testing.T) {
inbox := inboxmodel.NewMemoryStore()
mgr := session.NewManager()
peer := session.NewConn("p", "203.0.113.10", 8)
peer.Authenticate(2, 9)
if err := mgr.Bind(peer); err != nil {
t.Fatal(err)
}
job := &entity.Job{
MsgID: 11, Cmd: protocol.CmdMessage, ConversationID: 5,
FromUserID: 1, ExcludeDevice: 7, ToUserIDs: []int64{1, 2},
Payload: []byte(`{"code":"0"}`), Preview: []byte(`{"t":1}`),
}
if err := InboxFanout(mgr, inbox, nil)(t.Context(), job); err != nil {
t.Fatal(err)
}
if inbox.UnreadCount(2, 5) != 1 {
t.Fatalf("unread %d", inbox.UnreadCount(2, 5))
}
pkts := peer.DrainOutbound(2)
if len(pkts) != 1 || pkts[0].Command != protocol.CmdMessage {
t.Fatalf("push %+v", pkts)
}
}
func TestInboxFanoutRecallSkipsUnread(t *testing.T) {
inbox := inboxmodel.NewMemoryStore()
job := &entity.Job{
MsgID: 12, Cmd: protocol.CmdRecallMessage, ConversationID: 5,
FromUserID: 1, ToUserIDs: []int64{1, 2}, Preview: []byte(`{"status":2}`),
}
if err := applyInbox(t.Context(), inbox, job); err != nil {
t.Fatal(err)
}
if inbox.UnreadCount(2, 5) != 0 {
t.Fatal("recall must not bump unread")
}
}
func TestInboxFanoutRecallWritesMailbox(t *testing.T) {
ids, err := id.New(1)
if err != nil {
t.Fatal(err)
}
inbox := inboxmodel.NewMemoryStore()
box := syncmodel.NewMemoryStore(ids)
job := &entity.Job{
MsgID: 12, Cmd: protocol.CmdRecallMessage, ConversationID: 5,
FromUserID: 1, ToUserIDs: []int64{1, 2}, Payload: []byte(`{"msg_id":12}`),
}
if err := InboxFanout(nil, inbox, box)(t.Context(), job); err != nil {
t.Fatal(err)
}
items, err := box.ListSince(t.Context(), 2, 0, 0, 10)
if err != nil || len(items) != 1 || items[0].EventType != syncentity.EventRecall {
t.Fatalf("mailbox %+v %v", items, err)
}
}