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) } }