fix: persist group join system notices

This commit is contained in:
richjohnrambo
2026-09-15 19:20:07 +08:00
parent 563ae9ee5e
commit b7c2536527
2 changed files with 100 additions and 0 deletions
+68
View File
@@ -5379,6 +5379,74 @@ func TestServeIMGroupQRCodesAndResolve(t *testing.T) {
}
}
func TestServeIMGroupInvitationDirectJoinWritesSystemNotice(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
mockStore := expectIMBearer(t, ctrl, "token-1", 7, 42)
mockStore.EXPECT().IsOpen().Return(true).AnyTimes()
oldSubs := store.Subs
oldTopics := store.Topics
oldMessages := store.Messages
oldProfiles := store.Profiles
oldGroupBusiness := store.GroupBusiness
subs := mock_store.NewMockSubsPersistenceInterface(ctrl)
topics := mock_store.NewMockTopicsPersistenceInterface(ctrl)
messages := mock_store.NewMockMessagesPersistenceInterface(ctrl)
store.Subs = subs
store.Topics = topics
store.Messages = messages
store.Profiles = nil
store.GroupBusiness = &testGroupBusinessStore{}
t.Cleanup(func() {
store.Subs = oldSubs
store.Topics = oldTopics
store.Messages = oldMessages
store.Profiles = oldProfiles
store.GroupBusiness = oldGroupBusiness
})
subs.EXPECT().Get(types.TenantID(7), "grpAlpha", types.Uid(42), false).Return(&types.Subscription{
TenantID: 7, User: types.Uid(42).String(), Topic: "grpAlpha", ModeWant: types.ModeCFull, ModeGiven: types.ModeCFull,
}, nil)
subs.EXPECT().Get(types.TenantID(7), "grpAlpha", types.Uid(43), false).Return(nil, types.ErrNotFound)
topics.EXPECT().Get(types.TenantID(7), "grpAlpha").Return(&types.Topic{TenantID: 7, SeqId: 7}, nil)
messages.EXPECT().Save(types.TenantID(7), gomock.Any(), nil, false).DoAndReturn(
func(_ types.TenantID, msg *types.Message, _ []string, _ bool) (*types.MessageSaveResult, error) {
if msg.Topic != "grpAlpha" || msg.SeqId != 8 {
t.Fatalf("unexpected system notice message: %#v", msg)
}
if msg.Head["x-im-template"] != "group_member_joined" || msg.Head["x-im-type"] != "system_action" {
t.Fatalf("unexpected system notice head: %#v", msg.Head)
}
content := msg.Content.(map[string]any)
if content["text"] != "有成员通过邀请加入了群聊。" || content["template"] != "group_member_joined" {
t.Fatalf("unexpected system notice content: %#v", content)
}
extra := content["extra"].(map[string]any)
if extra["source"] != "direct_invitation" {
t.Fatalf("unexpected system notice extra: %#v", extra)
}
return &types.MessageSaveResult{SeqId: msg.SeqId}, nil
})
body := fmt.Sprintf(`{"user_ids":["%s"],"message":"欢迎"}`, types.Uid(43).UserId())
req := httptest.NewRequest(http.MethodPost, "/v1/im/groups/grpAlpha/invitations", strings.NewReader(body))
req.Header.Set("Authorization", "Bearer token-1")
req.Header.Set("Idempotency-Key", "invite-1")
req = req.WithContext(context.WithValue(req.Context(), imHTTPProtocolValidated, true))
rec := httptest.NewRecorder()
serveIMGroupResource(rec, req)
if rec.Code != http.StatusOK {
t.Fatalf("invite status: got %d body=%s", rec.Code, rec.Body.String())
}
data := decodeIMHTTPResponse(t, rec).Data.(map[string]any)
items := data["items"].([]any)
if len(items) != 1 || items[0].(map[string]any)["status"] != types.GroupInvitationStatusJoined {
t.Fatalf("unexpected invitation response: %#v", data)
}
}
func TestServeIMGroupAnnouncementGovernanceJoinRequest(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()